阅读源码很枯燥,如果能单步调试岂不是能使逻辑更清晰,本文章讲如何调适android framework。本文使用的环境是ubuntu 14.04,jdk1.8。Android9.0源码。具体步骤如下,

1.下载android源代码
任何一个工程都可以;后面会介绍如何用现有工程的相关img替换模拟器的对应img。

2.编译源码
如果只是加载源码的话可以不编译,执行/development/tools/idegen/ idegen.gen即可,但是如果要调试的话就需要编译源码,因为SPRD代码和原生代码是有差距的,所以,要调试SPRD代码就需要替换原生模拟器的相应img,对于Framework来讲,替换system.img即可;

3.生成android.ipr和android.iml文件
进入Android 源码根目录,
执行mmm development/tools/idegen/这行命令的意思是编译idegen这个项目,生成idegen.jar文件.生成成功后,会显示这个jar包的位置,并显示 #### make completed successfully
然后执行source ./development/tools/idegen/idegen.sh,这行命令的意思是生成对应的文件:android.iws, android.ipr, android.iml .

4.android studio导入源码

生成上述对应的文件后,打开Android Studio,选择打开一个现有的Android Studio项目,选择Android源码的根目录,导入即可(起作用的是android.ipr文件).在配置sdk版本之后就可以查看Android 源码了.导入过程比较慢,可以打开android.iml参考网上文章过滤掉一些模块。如果只调试Framewrok的话,只保留Framework目录即可,其他目录都可以exclude掉,如下,

android代码调用ifconfig android framework调试_Android


加载好的源码目录如下,橘红色的表示exclude,灰色的表示被加载的,

android代码调用ifconfig android framework调试_android_02


加载完成以后,任何时刻都可以通过在project上通过右键来设置加载或者去掉某些模块,如下图,

android代码调用ifconfig android framework调试_ide_03


5. 运行设备

(1)模拟器

运行模拟器可以直接运行,但是代码也必须是原生的才能够进行调试。SPRD代码怎么调试呢?那就是替换img,如下

$emulator -avd Nexus6_P -verbose -no-boot-anim -system /home/local/SPREADTRUM/eric.wf/code/p_android/out/target/product/sp9832e_1h10/system.img

  • emulator:启动模拟器的命令;
  • -avd:指定要启动的模拟器,如果没有生成模拟器的话,需要先在Android Studio中生成一个,当然,也有可能有多个已经生成的模拟器,所以,需要进行指定;也可以简写成“@模拟器名称”;
  • -verbose:log类型;
  • no-boot-anim:不显示开机动画,可有可无;
  • -system [path]:后面跟着需要调试(也就是自己编译的system.img),这样就可以对自己的代码进行断点调试了;同理,可以替换vender,kernel和ramdisk等,具体请参考emulator -help命令;
    (2)手机
    连接手机一样可以进行调试,不过需要烧对应的img。

6.调试代码

模拟器起来之后,就可以调试了。Run->Attach debugger to Android process选择要调试的程序,调试Framework选择system_process,如下图,

android代码调用ifconfig android framework调试_Android_04


7. 加断点进行调试

这里选择了在LocationManagerService.java的applyRequirementsLocked加断点,各个变量及调试结果见下图,

android代码调用ifconfig android framework调试_android_05


一切就绪,开始在你的机器上试一试吧!