做系统开发的,比如手机,平板,需要编译修改源码。
做源码开发,不像开发纯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, 这样可以确保使用源码里的库文件
并将其作为要使用的SDK的Java SDK。如下图
二、导入源码
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",我一般会将所有带有这个关键字的标签项全部删除,仅保留以下三行,大概如下
......
2. 搜索”excludeFolder“关键字,对这里进行一些修改,将我们不需要看的代码Exclude掉。通过这个步骤,能极大地提升第一次加载项目的速度。
等项目加载完成后,我们还可以通过Android Studio对Exclude的Module进行调整,所以也不用害怕这里Exclude掉了有用的代码,或少Exclude了一部分代码,在项目加载完以后再进行调整就行了。
以下是我的配置,大家可以参考(由于我比较关注Framework以及Telephony相关的代码,所以重点保留了这两部分,而其他一些如kernel、bootloader的代码,我就Exclude掉了,同学们也可以根据自己的需求来进行修改)。
完成之后,按照上面说的步骤,使用Android Studio选中"android.ipr"打开项目即可。
4、开始导入
File-Open选择android.ipr,这个过程可能会比较慢,视电脑配置而定
5、配置SDK
File-Project Structure-Project
分别选择对应的SDK版本和JDK版本,我的分别是Android9.0和JDK1.8
6、选择模块SDK
同上,我选择的是Android9.0对应的API 28
7、进入调试
导入完成后可以通过以下方式进入debug(设备必须是debug或者eng版本)
8、调试常用指令
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)
查看设置的断点
参考:
https://www.cnblogs.com/Lefter/p/4176991.html
https://blog.csdn.net/turtlejj/article/details/83857897
https://blog.csdn.net/csdn_aiyang/article/details/79483848