小弟先在做安卓下的音频应用程序开发,从java层写了一个应用程序,能够实现简单的录音功能。之后就想分析一下整个的调用过程,结果我发现安卓下的音频架构还蛮复杂,有java层的,安卓系统中的c++语言写的很多cpp文件,然后就是底层驱动。
在调试cpp文件(如audiorecord.cpp,audioflinger.cpp等)的时候,我加入了一些fprintf(stdout,"***")语句想进行跟踪。因此重新make kernel,然后把新内核下载到板子上,重启之后没有打印信息呀
请问是不是修改了这些cpp文件之后make kernel牵扯不到他们呢?如果我想能看到这些加入的打印信息,我应该怎么做呢?请高手指点指点呀
先行谢过Androidalsa音频调试

解决方案 »

  1.   

    一般cpp文件都会编译成动态库.你到其文件的目录下面找mk文件,或者上级目录找找.
    mk文件里面会写明编译所包含的文件.大版本编译好在mk目录下敲mm就行.
      

  2.   

    非常感谢你的指点。
    我看同一个文件夹下确实有一个Android.mk,打开之后和你说的差不多。里面好多变量,哪个是说明我要生成的库的名字?LOCAL_MODULE、LOCAL_MODULE_TAGS、include $(BUILD_STATIC_LIBRARY)、LOCAL_WHOLE_STATIC_LIBRARY哪个是呢?我在文件夹下也没有看到有库文件呀?
      

  3.   

    编译好后会在out的相应目录下生成
      

  4.   

    可是这里面有两个LOCAL_MODULE,一个是LOCAL_MODULE:=libmedia_helper,一个是LOCAL_MODULE=libmedia
    而且我在文件夹下没有看到这两个文件
      

  5.   

    可是这里面有两个LOCAL_MODULE,一个是LOCAL_MODULE:=libmedia_helper,一个是LOCAL_MODULE=libmedia
    而且我在文件夹下没有看到这两个文件
    这个是你编译完成后生成的动态库的名字,你编译后到out目录里面相应目录去找
      

  6.   

    可是这里面有两个LOCAL_MODULE,一个是LOCAL_MODULE:=libmedia_helper,一个是LOCAL_MODULE=libmedia
    而且我在文件夹下没有看到这两个文件
    找到编译好后的so文件,把他push到system/lib里面.你应该就能看到效果了
    下班了
      

  7.   

    FrameWork层的cpp文件的Log直接在eclipse里面调试就有输出,Kernel层bug在Eclipse中不会有打印
      

  8.   

    可是这里面有两个LOCAL_MODULE,一个是LOCAL_MODULE:=libmedia_helper,一个是LOCAL_MODULE=libmedia
    而且我在文件夹下没有看到这两个文件
    找到编译好后的so文件,把他push到system/lib里面.你应该就能看到效果了
    下班了谢谢指点我先找找so文件。我之前用adb push文件到板子上的时候,system文件夹说我没有权限,只能push到sdcard文件夹下。我应该怎么获得权限呢?
      

  9.   

    eclipse不是只能调试java程序吗?那我怎么把我现在要调试的这些文件加到eclipse中呢?
      

  10.   

    可是这里面有两个LOCAL_MODULE,一个是LOCAL_MODULE:=libmedia_helper,一个是LOCAL_MODULE=libmedia
    而且我在文件夹下没有看到这两个文件
    找到编译好后的so文件,把他push到system/lib里面.你应该就能看到效果了
    下班了谢谢指点我先找找so文件。我之前用adb push文件到板子上的时候,system文件夹说我没有权限,只能push到sdcard文件夹下。我应该怎么获得权限呢?
    adb remount
      

  11.   

    我直接mm没有这个指令呀?然后我用了我之前安装的ndk-build,提示找不到某个.h文件,然后我把这个.h文件的路径加到LOCAL_CFLAGS中,然后又提示缺少另一个.h文件,我就一直加一直加,知道最后提示没有AudioEffecte是要加上哪个库呢?
    谢谢指点
      

  12.   

    可是这里面有两个LOCAL_MODULE,一个是LOCAL_MODULE:=libmedia_helper,一个是LOCAL_MODULE=libmedia
    而且我在文件夹下没有看到这两个文件
    找到编译好后的so文件,把他push到system/lib里面.你应该就能看到效果了
    下班了谢谢指点我先找找so文件。我之前用adb push文件到板子上的时候,system文件夹说我没有权限,只能push到sdcard文件夹下。我应该怎么获得权限呢?
    adb remount
    我从网上看了remount的方法是这样“# su
     # mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system
     # chmod 777 /system ”对吗?路径“/dev/block/mtdblock3”和“/system”不需要修改吗?文件系统yaffs2也不需要修改是吗?
    谢谢解答
      

  13.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
      

  14.   

    我直接mm没有这个指令呀?然后我用了我之前安装的ndk-build,提示找不到某个.h文件,然后我把这个.h文件的路径加到LOCAL_CFLAGS中,然后又提示缺少另一个.h文件,我就一直加一直加,知道最后提示没有AudioEffecte是要加上哪个库呢?
    谢谢指点
    你没有源码啊?你用NDK编的?
      

  15.   

    我直接mm没有这个指令呀?然后我用了我之前安装的ndk-build,提示找不到某个.h文件,然后我把这个.h文件的路径加到LOCAL_CFLAGS中,然后又提示缺少另一个.h文件,我就一直加一直加,知道最后提示没有AudioEffecte是要加上哪个库呢?
    谢谢指点
    你没有源码啊?你用NDK编的?
    有源码,但是执行mm提示没这个指令
    我的源码自带一个交叉编译工具,但是编译出来的程序没法在板子上运行,版本不匹配。然后我自己从网上下了一个NDK,编译过的文件可以在板子上运行,所以在编译简单的c应用程序的时候我直接在NDK里面编译然后放到板子上就能运行了。昨天我试了试你说的mm指令,提示没有这个指令,我就试了试ndk,出现了上面说的问题。那我是不是要加入mm这个命令系统中?怎么加呢?
      

  16.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
    adb push 和adb shell我知道,也用过。我这边的板子也有。向你说的那个so库,我应该怎么编译呢?在源码目录下执行什么指令还是在这些cpp文件目录下执行什么指令?谢谢指点
      

  17.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
    adb push 和adb shell我知道,也用过。我这边的板子也有。向你说的那个so库,我应该怎么编译呢?在源码目录下执行什么指令还是在这些cpp文件目录下执行什么指令?谢谢指点你会看到源码目录下有个build目录对吧,里面有个envsetup.sh脚本
    敲下面这个命令
    source build/envsetup.sh
    然后你就可以用mm了,前提是你已经编译过整个源码了,不然会有些依赖的库找不到.
      

  18.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
    adb push 和adb shell我知道,也用过。我这边的板子也有。向你说的那个so库,我应该怎么编译呢?在源码目录下执行什么指令还是在这些cpp文件目录下执行什么指令?谢谢指点你会看到源码目录下有个build目录对吧,里面有个envsetup.sh脚本
    敲下面这个命令
    source build/envsetup.sh
    然后你就可以用mm了,前提是你已经编译过整个源码了,不然会有些依赖的库找不到.
    谢谢你的耐心解答可能是之前我对你的一些指点理解错误,呵呵
    1.我开始以为你说的源码是我之前所说的cpp文件,因此我执行mm的时候是在cpp所在文件目录下执行的。现在明白了你说的源码是系统需要的所有的代码,即为源码根目录,呵呵。
    2.之前执行的时候确实没有执行“source build/envsetup.sh”和另一个“lunch full_godbox-eng”,这两个指令是必须执行的。
    现在我直接在源码根目录下执行mm,已经开始编译。刚开始输出的信息跟我make kernel的时候一样。在编译过程中出现过问题,是因为我之前修改过的Android.mk文件有问题,现在已经改正,正在编译中。非常感谢你的指点。
    我现在的理解是:编译完成之后找到对应的so文件,然后把so文件push到板子的/system/lib目录下。
    如我之前所说的,现在没有对板子系统文件的操作权限,你之前说的adb remount我没有用过,能具体提示一下吗?
    再次感谢你的指点
      

  19.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
    adb push 和adb shell我知道,也用过。我这边的板子也有。向你说的那个so库,我应该怎么编译呢?在源码目录下执行什么指令还是在这些cpp文件目录下执行什么指令?谢谢指点你会看到源码目录下有个build目录对吧,里面有个envsetup.sh脚本
    敲下面这个命令
    source build/envsetup.sh
    然后你就可以用mm了,前提是你已经编译过整个源码了,不然会有些依赖的库找不到.
    谢谢你的耐心解答可能是之前我对你的一些指点理解错误,呵呵
    1.我开始以为你说的源码是我之前所说的cpp文件,因此我执行mm的时候是在cpp所在文件目录下执行的。现在明白了你说的源码是系统需要的所有的代码,即为源码根目录,呵呵。
    2.之前执行的时候确实没有执行“source build/envsetup.sh”和另一个“lunch full_godbox-eng”,这两个指令是必须执行的。
    现在我直接在源码根目录下执行mm,已经开始编译。刚开始输出的信息跟我make kernel的时候一样。在编译过程中出现过问题,是因为我之前修改过的Android.mk文件有问题,现在已经改正,正在编译中。非常感谢你的指点。
    我现在的理解是:编译完成之后找到对应的so文件,然后把so文件push到板子的/system/lib目录下。
    如我之前所说的,现在没有对板子系统文件的操作权限,你之前说的adb remount我没有用过,能具体提示一下吗?
    再次感谢你的指点
    一般你们现在的开发板都是eng版本的,不是user版本的.所有在push之前先敲adb remoutn然后在push so 到system/lib
    如果是user版将重新编译源码为eng版本在烧入版子中.
      

  20.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
    adb push 和adb shell我知道,也用过。我这边的板子也有。向你说的那个so库,我应该怎么编译呢?在源码目录下执行什么指令还是在这些cpp文件目录下执行什么指令?谢谢指点你会看到源码目录下有个build目录对吧,里面有个envsetup.sh脚本
    敲下面这个命令
    source build/envsetup.sh
    然后你就可以用mm了,前提是你已经编译过整个源码了,不然会有些依赖的库找不到.
    源码跟目录,比如 (1)/home/用户名/android4.2 . build/ensetup.sh
                  (2)/home/用户名/android4.2 lunch
                  (3)敲1 回车
                  (4)make整个源码
                  (5)源码编译完成后如果你关闭了命令行窗口就在执行一次/home/用户名/android4.2 .                   build/ensetup.sh
                   (6)mmm 你要编译的库文件的路径,比如/home/用户名/android4.2 mmm hardware/ti/omap3
                  确定你的Android.mk文件在这个目录下就行。
      

  21.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
    adb push 和adb shell我知道,也用过。我这边的板子也有。向你说的那个so库,我应该怎么编译呢?在源码目录下执行什么指令还是在这些cpp文件目录下执行什么指令?谢谢指点你会看到源码目录下有个build目录对吧,里面有个envsetup.sh脚本
    敲下面这个命令
    source build/envsetup.sh
    然后你就可以用mm了,前提是你已经编译过整个源码了,不然会有些依赖的库找不到.
    谢谢你的耐心解答可能是之前我对你的一些指点理解错误,呵呵
    1.我开始以为你说的源码是我之前所说的cpp文件,因此我执行mm的时候是在cpp所在文件目录下执行的。现在明白了你说的源码是系统需要的所有的代码,即为源码根目录,呵呵。
    2.之前执行的时候确实没有执行“source build/envsetup.sh”和另一个“lunch full_godbox-eng”,这两个指令是必须执行的。
    现在我直接在源码根目录下执行mm,已经开始编译。刚开始输出的信息跟我make kernel的时候一样。在编译过程中出现过问题,是因为我之前修改过的Android.mk文件有问题,现在已经改正,正在编译中。非常感谢你的指点。
    我现在的理解是:编译完成之后找到对应的so文件,然后把so文件push到板子的/system/lib目录下。
    如我之前所说的,现在没有对板子系统文件的操作权限,你之前说的adb remount我没有用过,能具体提示一下吗?
    再次感谢你的指点
    一般你们现在的开发板都是eng版本的,不是user版本的.所有在push之前先敲adb remoutn然后在push so 到system/lib
    如果是user版将重新编译源码为eng版本在烧入版子中.
    恩,我执行的是lunch full_godbox-eng,所以应该是eng版本的。我之前是给板子开机,板子默认ip是192.168.10.152,所以我直接在电脑上打开cmd执行adb connect 192.168.10.152:5555,然后提示connect成功,用adb devices也能显示已经connect的设备192.168.10.152:5555.然后我用adb push D:\某个文件。那现在我在connect之后,先执行adb remount,提示remount succeeded,然后我随便从D盘找了一个文件执行adb push D:\1.pdf /system/lib/,push成功
    非常感谢你的指点,等我编译好so文件之后就可以把文件push到板子上,然后看调试结果了到时候如果还有问题的话,还请你再多多指教
    再次感谢
      

  22.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
    adb push 和adb shell我知道,也用过。我这边的板子也有。向你说的那个so库,我应该怎么编译呢?在源码目录下执行什么指令还是在这些cpp文件目录下执行什么指令?谢谢指点你会看到源码目录下有个build目录对吧,里面有个envsetup.sh脚本
    敲下面这个命令
    source build/envsetup.sh
    然后你就可以用mm了,前提是你已经编译过整个源码了,不然会有些依赖的库找不到.
    源码跟目录,比如 (1)/home/用户名/android4.2 . build/ensetup.sh
                  (2)/home/用户名/android4.2 lunch
                  (3)敲1 回车
                  (4)make整个源码
                  (5)源码编译完成后如果你关闭了命令行窗口就在执行一次/home/用户名/android4.2 .                   build/ensetup.sh
                   (6)mmm 你要编译的库文件的路径,比如/home/用户名/android4.2 mmm hardware/ti/omap3
                  确定你的Android.mk文件在这个目录下就行。
    恩,我直接在源码根目录下执行的mm,看来是是把源码里的所有的库文件都编译了,我看有好多lib*文件在生成,所以很慢如果我只想编译某一个so文件的话,就可以直接在源码目录下用mmm命令?比如说我的源码目录是/home/maxiao/his/,我要修改的cpp文件在/home/maxiao/his/frameworks/base/media/libmedia/AudioRecord.cpp,所以我直接cd /home/maxiao/his,然后执行mmm frameworks/base/media/libmedia,这样的话就只会编译文件AudioRecord.cpp所在的so库文件是吗?
      

  23.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
    adb push 和adb shell我知道,也用过。我这边的板子也有。向你说的那个so库,我应该怎么编译呢?在源码目录下执行什么指令还是在这些cpp文件目录下执行什么指令?谢谢指点你会看到源码目录下有个build目录对吧,里面有个envsetup.sh脚本
    敲下面这个命令
    source build/envsetup.sh
    然后你就可以用mm了,前提是你已经编译过整个源码了,不然会有些依赖的库找不到.
    源码跟目录,比如 (1)/home/用户名/android4.2 . build/ensetup.sh
                  (2)/home/用户名/android4.2 lunch
                  (3)敲1 回车
                  (4)make整个源码
                  (5)源码编译完成后如果你关闭了命令行窗口就在执行一次/home/用户名/android4.2 .                   build/ensetup.sh
                   (6)mmm 你要编译的库文件的路径,比如/home/用户名/android4.2 mmm hardware/ti/omap3
                  确定你的Android.mk文件在这个目录下就行。
    恩,我直接在源码根目录下执行的mm,看来是是把源码里的所有的库文件都编译了,我看有好多lib*文件在生成,所以很慢如果我只想编译某一个so文件的话,就可以直接在源码目录下用mmm命令?比如说我的源码目录是/home/maxiao/his/,我要修改的cpp文件在/home/maxiao/his/frameworks/base/media/libmedia/AudioRecord.cpp,所以我直接cd /home/maxiao/his,然后执行mmm frameworks/base/media/libmedia,这样的话就只会编译文件AudioRecord.cpp所在的so库文件是吗?恩。是的。你可以自己试试。你要保证frameworks/base/media/libmedia 有Android.mk文件
      

  24.   

    你把自己的so库编译出来替换掉/system/lib下相应的库文件,你有确定的机器是工程机,才能够push进去的,就是你的机器在adb shell命令后,前面那个符号是"#"而不是"$".
    adb push 和adb shell我知道,也用过。我这边的板子也有。向你说的那个so库,我应该怎么编译呢?在源码目录下执行什么指令还是在这些cpp文件目录下执行什么指令?谢谢指点你会看到源码目录下有个build目录对吧,里面有个envsetup.sh脚本
    敲下面这个命令
    source build/envsetup.sh
    然后你就可以用mm了,前提是你已经编译过整个源码了,不然会有些依赖的库找不到.
    源码跟目录,比如 (1)/home/用户名/android4.2 . build/ensetup.sh
                  (2)/home/用户名/android4.2 lunch
                  (3)敲1 回车
                  (4)make整个源码
                  (5)源码编译完成后如果你关闭了命令行窗口就在执行一次/home/用户名/android4.2 .                   build/ensetup.sh
                   (6)mmm 你要编译的库文件的路径,比如/home/用户名/android4.2 mmm hardware/ti/omap3
                  确定你的Android.mk文件在这个目录下就行。
    恩,我直接在源码根目录下执行的mm,看来是是把源码里的所有的库文件都编译了,我看有好多lib*文件在生成,所以很慢如果我只想编译某一个so文件的话,就可以直接在源码目录下用mmm命令?比如说我的源码目录是/home/maxiao/his/,我要修改的cpp文件在/home/maxiao/his/frameworks/base/media/libmedia/AudioRecord.cpp,所以我直接cd /home/maxiao/his,然后执行mmm frameworks/base/media/libmedia,这样的话就只会编译文件AudioRecord.cpp所在的so库文件是吗?恩。是的。你可以自己试试。你要保证frameworks/base/media/libmedia 有Android.mk文件
    已经试过,单独编译一个库文件时直接用mmm 库文件相关代码目录就可以。谢谢指点
      

  25.   

    我重新编译了四个库文件,分别是libasound.so、libmedia.so、libaudioflinger.so和libandroid_runtime.so,然后通过adb push到板子的/system/lib/下,修改了权限为777,然后给板子重启,怎么起不来了???
    终端提示一直在alsa音频USB驱动部分来回循环,好像是有什么没找到难道我修改库文件会影响板子启动码???
      

  26.   

    可能是你改的库文件涉及到了跟驱动相关连的部分,你可以把kernel部分跟你自己编译出来的Framework部分做个升级包,具体怎么做什么升级包,然后给你那个板子重新升级就可以了。具体怎么做升级包,这个应该是kernel层定义的。
      

  27.   

    可能是你改的库文件涉及到了跟驱动相关连的部分,你可以把kernel部分跟你自己编译出来的Framework部分做个升级包,具体怎么做什么升级包,然后给你那个板子重新升级就可以了。具体怎么做升级包,这个应该是kernel层定义的。
    做升级包??不懂呀我开机启动的时候提示“[17231 ERROR-hdmi]:DRV_HDMI_ReadEvent[3563]:event:17
    request_suspend_state: wakeup (3->0) at 17701873555 (1970-01-01 00:00:17.693137213 UTC)
    init: untracked pid 1034 exited
    init: untracked pid 1040 exited
    init: untracked pid 1041 exited”然后就一直不断显示怎么个情况呀?
      

  28.   

    可能是你改的库文件涉及到了跟驱动相关连的部分,你可以把kernel部分跟你自己编译出来的Framework部分做个升级包,具体怎么做什么升级包,然后给你那个板子重新升级就可以了。具体怎么做升级包,这个应该是kernel层定义的。
    我重新make kernel生成内核文件,然后下载到板子上能不能解决这个问题呢?
      

  29.   

    思路错误啊。
    先从源码build一个系统能到真机上正常运行再说
      

  30.   

    可能是你改的库文件涉及到了跟驱动相关连的部分,你可以把kernel部分跟你自己编译出来的Framework部分做个升级包,具体怎么做什么升级包,然后给你那个板子重新升级就可以了。具体怎么做升级包,这个应该是kernel层定义的。
    我重新make kernel生成内核文件,然后下载到板子上能不能解决这个问题呢?
    重新makekernel然后下载到板子上是不行的从网上搜,大部分是说板子的/system/lib/hw/下收了一个garrolc_default.so的文件,但是我的板子上有这个,我重新push进去新的也不能解决。没办法,只能重新烧写文件系统了。然后重启就好了
      

  31.   

    谢谢各位的耐心解答,对于库文件的编译以及如何push到开发板的/system/lib/下我已经都明白了。
    替换库文件之后为何板子无法重启还没有解决,但是重新烧写文件系统之后得到解决。
    虽然加入到库文件里的fprintf(stderr,"*****")信息还是无法显示,但是现在来说这个帖子也可以完结了。
    再次感谢各位的指点
      

  32.   

    之前打印信息看不到的问题现在已经解决。原因有两个,
    1.不应该使用超级终端,我之前是把电脑和板子用串口线连起来之后就关注超级终端了,只看到printk的信息和c程序中的fprintf信息,但是关于安卓的log信息看不到。所以一直以为是加入的打印语句有问题。但当我用adb logcat的时候,发现这些信息就都有了。所以要想看安卓的打印信息应该用adb logcat进行观察(这是我目前的观点,如果不对请高手纠正,呵呵)
    2.fprintf函数在库文件中不起作用,应该使用的语句是安卓系统的一个__android_log_print(ANDROID_LOG_INFO, "TVQE", “*****”),然后自己定义一个宏就可以了。因此综上两点所述,使用2中的打印语句,使用adb logcat进行捕获,用新库之后板子重启,就能看到加入的打印信息了
      

  33.   

    fprintf(stdout,"***") 明显是标准输出到控制台的。
      

  34.   

    那fprintf(stderr,"")呢?我用这个在c写的应用程序中可以使用,但是在库文件中无法使用。
      

  35.   

    额,我已经重新烧写了文件系统了
    之前板子自带的库文件我没有备份,所以上次出了问题之后我也没有文件可以用来复原,就直接重装文件系统了。
    现在我每次编译新库的时候都先把之前能够跑通的库文件做备份,以防出问题。不过最近只出现了一次问题,后来重新编译库之后就好了
    谢谢gemo的指点