做系统开发的,比如手机,平板,需要编译修改源码。

做源码开发,不像开发纯app,调试起来有些麻烦,但还是可以实现的,可以将整个源码导入AS,实现打断点调试

我这边使用的是Android Studio 2.3

要调试的源码是Android9.0

 

因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio64.vmoptions(x86的机器修改studio.vmoptions)中-Xms和-Xmx的值。文档中使用的是748m, 可自行修改。

一、配置AS的JDK、SDK

在IDE中添加一个没有classpath的JDK, 这样可以确保使用源码里的库文件

 

android aosp源码调试 进不了断点 安卓源码调试_Android

并将其作为要使用的SDK的Java SDK。如下图

android aosp源码调试 进不了断点 安卓源码调试_Android_02

二、导入源码

1、编译源码:

这个就不多说了,做系统源码开发的都知道

2、生成配置文件

  1. "source build/envsetup.sh" (source可以用 . 代替,即". build/envsetup.sh")

        2. "lunch",并选择要编译的项目

        3. "make idegen -j4" (这里的 -j4 表示用4线程来编译,可以不加)

        4. "development/tools/idegen/idegen.sh" 

这里会生成以下文件:

  1. android.iml (记录项目所包含的module、依赖关系、SDK版本等等,类似一个XML文件)

  2. android.ipr (工程的具体配置,代码以及依赖的lib等信息,类似于Visual Studio的sln文件)

 

3、移除不需要模块

 

        "android.iml"和"android.ipr"一般是"只读"的属性,我们这里建议大家,把这两个文件改成可读可写,否则,在更改一些项目配置的时候可能会出现无法保存的情况,执行如下两条命令即可。

sudo chmod 777 android.iml
sudo chmod 777 android.ipr
 

        如果你的电脑性能足够好(内存大于16G,代码下载在SSD上),那么可以直接打开Android Studio,点击"Open an existing Android Studio project"选项,找到并选中刚刚生成的"android.ipr"文件,点击OK,就可以开始导入项目了。 第一次导入,这个过程可能会持续很久,几十分钟或者超过一个小时。不过成功之后,以后再打开项目就会快很多了。

        如果电脑性能一般的话,我建议,可以在导入项目前,手动对"android.iml"文件进行一下修改,可以使我们导入的时间尽可能的缩短一些。

        首先,要保证"android.iml"文件已经添加了"可写入"的属性(上文中已经介绍了如何修改文件属性)。

        接下来,使用文本编辑器打开"android.iml"文件,并执行以下修改(仅代表我的个人习惯,也可以根据同学们的喜好自己调整):

        1. 搜索关键字"orderEntry",我一般会将所有带有这个关键字的标签项全部删除,仅保留以下三行,大概如下

......
    </content>
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="inheritedJdk" />
    <orderEntryProperties />
  </component>
</module>
        2. 搜索”excludeFolder“关键字,对这里进行一些修改,将我们不需要看的代码Exclude掉。通过这个步骤,能极大地提升第一次加载项目的速度。

        等项目加载完成后,我们还可以通过Android Studio对Exclude的Module进行调整,所以也不用害怕这里Exclude掉了有用的代码,或少Exclude了一部分代码,在项目加载完以后再进行调整就行了。

        以下是我的配置,大家可以参考(由于我比较关注Framework以及Telephony相关的代码,所以重点保留了这两部分,而其他一些如kernel、bootloader的代码,我就Exclude掉了,同学们也可以根据自己的需求来进行修改)。

<excludeFolder url="file://$MODULE_DIR$/.repo" />
 <excludeFolder url="file://$MODULE_DIR$/art" />
 <excludeFolder url="file://$MODULE_DIR$/bionic" />
 <excludeFolder url="file://$MODULE_DIR$/bootable" />
 <excludeFolder url="file://$MODULE_DIR$/build" />
 <excludeFolder url="file://$MODULE_DIR$/compatibility" />
 <excludeFolder url="file://$MODULE_DIR$/dalvik" />
 <excludeFolder url="file://$MODULE_DIR$/developers" />
 <excludeFolder url="file://$MODULE_DIR$/developers/samples" />
 <excludeFolder url="file://$MODULE_DIR$/development" />
 <excludeFolder url="file://$MODULE_DIR$/device/google" />
 <excludeFolder url="file://$MODULE_DIR$/device/sample" />
 <excludeFolder url="file://$MODULE_DIR$/docs" />
 <excludeFolder url="file://$MODULE_DIR$/external" />
 <excludeFolder url="file://$MODULE_DIR$/flashing-files" />
 <excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
 <excludeFolder url="file://$MODULE_DIR$/kernel" />
 <excludeFolder url="file://$MODULE_DIR$/libcore" />
 <excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
 <excludeFolder url="file://$MODULE_DIR$/out" />
 <excludeFolder url="file://$MODULE_DIR$/pdk" />
 <excludeFolder url="file://$MODULE_DIR$/platform_testing" />
 <excludeFolder url="file://$MODULE_DIR$/prebuilt" />
 <excludeFolder url="file://$MODULE_DIR$/prebuilts" />
 <excludeFolder url="file://$MODULE_DIR$/shortcut-fe" />
 <excludeFolder url="file://$MODULE_DIR$/test" />
 <excludeFolder url="file://$MODULE_DIR$/toolchain" />
 <excludeFolder url="file://$MODULE_DIR$/tools" />


        完成之后,按照上面说的步骤,使用Android Studio选中"android.ipr"打开项目即可。
4、开始导入

File-Open选择android.ipr,这个过程可能会比较慢,视电脑配置而定

5、配置SDK

File-Project Structure-Project

分别选择对应的SDK版本和JDK版本,我的分别是Android9.0和JDK1.8

android aosp源码调试 进不了断点 安卓源码调试_加载_03

 

6、选择模块SDK

同上,我选择的是Android9.0对应的API 28

android aosp源码调试 进不了断点 安卓源码调试_Android系统开发_04

 

7、进入调试

导入完成后可以通过以下方式进入debug(设备必须是debug或者eng版本)

android aosp源码调试 进不了断点 安卓源码调试_加载_05

 

8、调试常用指令

3.单步调试

3.1 step over(F8):

程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行。就是说不会进入到调用的其他方法中去)

3.2 step into(F7)

点击红色箭头指向的step into按钮,程序向下执行一行。跟step over不同的是:如果该行有方法调用且为自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。

3.3 step out(Shift+F8)

如果在调试的时候你进入了一个方法(如Add()),并觉得该方法没有问题,你就可以使用step out跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。

3.4 run to Cursor(Alt+F9)

设置多个断点时,可利用 run to Cursor按钮在两个断点之间跳转。

3.5 Watches

如果某个类或方法中变量太多,在Variables面板里观察的话会很费劲,这时就会需要用到Watches这个工具了。 
点击Watches下方的+号,然后手动输入变量的名称回车就OK了。 

3.6 View BreakPoints(Ctrl+Shift+F8)

查看设置的断点