使用Android Studio查看并调试Android源码

基础环境

无论是在工作中,还是我们自己学习Android,总会用到Android的源码,没有趁手的开发工具,我们是无法进行调试,编写代码的,而AndroidStudio就可以做到编译源码并调试源码

操作系统

首先我们需要一个Linux的操作系统,直接在Windows下是没法编译的,在这里,我使用的是Deepin,而Ubuntu的操作应该与我一样,如果你只有一个Windows电脑,强烈推荐使用Docker来完成,不要使用虚拟机.

Java

Java使用1.8即可,本文编译的是Android-P,而根据Android版本的不同,需要的Java环境可能也略有区别

使用Android Studio查看并调试Android源码

Android源码

关于源码的下载,不是本文的重点,不会赘述,建议使用清华源进行下载,关于如何下载,网址写的还是比较详细的

清华大学开源软件镜像站

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

编译源码

在将工程导入到AndroidStudio之前,我们最好先编译一下整个Base代码,这样一来可以保证我们的代码和开发环境没有什么问题,二来可以通过编译来生成R文件

初始化编译环境

命令:

source build/envsetup.sh

这里需要注意一点, 确保你的终端是bash或者zsh,因为Android的编译脚本只保证兼容这两个,如果是fish什么的就要手动切换一下了,并且Android P才支持的zsh,在Android O上还支持从bash,我就在编译Android O的时候,由于使用了zsh而遇到了一些坑

AndroidP的终端检查源码

function validate_current_shell() {
 local current_sh="$(ps -o command -p $$)"
 case "$current_sh" in
 *bash*)
 function check_type() { type -t "$1"; }
 ;;
 *zsh*)
 function check_type() { type "$1"; }
 enable_zsh_completion ;;
 *)
 echo -e "WARNING: Only bash and zsh are supported.
Use of other shell would lead to erroneous results."
 ;;
 esac
}

Android O的终端检查源码

if [ "x$SHELL" != "x/bin/bash" ]; then
 case `ps -o command -p $$` in
 *bash*)
 ;;
 *)
 echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results"
 ;;
 esac
fi

选择编译目标

在编译之前我们还需要选择编译目标,所谓编译目标就是生成的镜像要运行在什么设备上,比如你是运行在Pixel手机,还是运行在虚拟机上,命令:

lunch

lunch命令会将所有当前支持的编译类型都列出来,然后输入序号即可选择

使用Android Studio查看并调试Android源码

这里我们选择 28 aosp_x86_64-eng, 编译出x86版本的,大家可以根据自己的实际情况选择

使用Android Studio查看并调试Android源码

我们还可以使用 choosecombo 命令来进行一次性的选择,例如:

choosecombo 2 aosp_x86_64 3

使用Android Studio查看并调试Android源码

choosecombo命令接收3个参数:

  • 第一个参数是 Build type:会设置TARGET_BUILD_TYPE环境变量为release或debug
  • 第二个参数是编译的product,也就是aosp_x86_64
  • 第三个参数是编译的varient,可以选择user,userdebug或者eng版本
  • user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的,例如没有root权限,不能debug等
  • userdebug:在user版本的基础上开放了root权限和debug权限
  • eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具

编译

编译命令比较简单

make -j18

通过make指令进行代码编译,该指令通过-j参数来设置参与编译的线程数量,以提高编译速度.比如这里我们设置18个线程同时编译,通常这个线程数是cpu核心数*2+2,并不是越大越好的,然后你的电脑就会编译,根据电脑性能的不同,编译的速度会有很大的区别,大约1个小时左右,应该就会编译完成

验证

编译完成后可以执行 emulator 命令来启动编译好的虚拟机,另外,关闭了终端,需要重新执行一遍上述的 source build/envsetup.sh 命令和 lunch 命令

使用Android Studio查看并调试Android源码

可以看到,其实这就是一个我们最常见的Android虚拟机

导入源码到Android Studio

实际上Android的源码中已经专门存在了文档来告诉我们如何使用IDE来编辑Android源码,位置是 源码路径/development/tools/idegen/README

使用Android Studio查看并调试Android源码

因为我们现在都使用AndroidStudio了,所以只需要关心其中的IntelliJ部分就好了,Eclipse就不用看了

AndroidStudio的初期配置

文档上说,由于Android太大了,所以我们需要给IDE更多的内存。在Help > Edit Custom VM 中添加:

-Xms1g
-Xmx5g

使用Android Studio查看并调试Android源码

这两个参数的意思是初始堆内存为1G,最大堆内存为5G,其实不设置也没什么问题,但是经常会在看代码的时候,出现内存不够的错误信息,所以换个大内存还是很有必要的~

然后是AndroidStudio的类大小配置,在Help -> Edit custom properties中添加:

idea.max.intellisense.filesize=100000

使用Android Studio查看并调试Android源码

这个参数是定义AS默认的类大小的,默认值是2500,会导致太大的Java文件不能被识别,把这个数调大了之后,就可以导入更大的Java文件了,当然还是需要一个好电脑的~

配置完成后重启IDE

使用Android Studio查看并调试Android源码

源码导入

首先我们还是要执行一遍上述的source build/envsetup.sh 命令和 lunch 命令,当然,如果终端没有关闭的话,可以省略这一步,然后执行

mmm development/tools/idegen

编译生成idegen.jar,这里需要注意的是,虽然google的脚本说支持zsh,但是如果你用zsh就会出现 Couldn't locate the directory development/tools/idegen 这个错误,使用bash再来一遍就可以了

使用Android Studio查看并调试Android源码

生成完 idegen.jar 之后,就可以使用命令来扫描生成 ipr 文件了:

sudo ./development/tools/idegen/idegen.sh

使用Android Studio查看并调试Android源码

这个ipr文件就是整个项目,AndroidStudio可以直接识别打开它,就像打开正常的Android项目一样

使用Android Studio查看并调试Android源码

之后AndroidStudio就开始打开项目了,这个过程会比较缓慢,有时,AS会出现如下信息:

使用Android Studio查看并调试Android源码

大致的意思就是由于项目过于庞大,现在AS没有办法很好的监视整个项目的改变了,可以通过如下方式解决:

1. 在/etc/sysctl.conf 文件末尾中添加如下代码:

fs.inotify.max_user_watches = 524288

2. 然后在终端执行以下命令:

sudo sysctl -p --system

最后重启AS

AndroidStudio的其他配置

设置ProgectSDK AndroidAPI28,java版本为Java8

使用Android Studio查看并调试Android源码

然后在SDK选项中仅仅保留Java1.8和Android API 28,剩下的都删除掉

使用Android Studio查看并调试Android源码

使用Android Studio查看并调试Android源码

使用Android Studio查看并调试Android源码

接下来是Modules,将所有的Jar删除,因为基本上我们用不到jar,看源码就够了,如果确实需要哪个的话,再酌情保留

使用Android Studio查看并调试Android源码

如果AndroidStudio一直不停 scanning files to index,可以打开 module setting --> Modules --> 找到gen文件夹 --> 右键选择Resources

使用Android Studio查看并调试Android源码

现在我们就可以愉快的阅读源码啦~

删除不关心的项目

文档上说,由于Android太大了,所以我们需要给IDE更多的内存。在Help > Edit Custom VM 中添加:

-Xms1g
-Xmx5g

使用Android Studio查看并调试Android源码

这两个参数的意思是初始堆内存为1G,最大堆内存为5G,其实不设置也没什么问题,但是经常会在看代码的时候,出现内存不够的错误信息,所以换个大内存还是很有必要的~

然后是AndroidStudio的类大小配置,在Help -> Edit custom properties中添加:

idea.max.intellisense.filesize=100000

使用Android Studio查看并调试Android源码

这个参数是定义AS默认的类大小的,默认值是2500,会导致太大的Java文件不能被识别,把这个数调大了之后,就可以导入更大的Java文件了,当然还是需要一个好电脑的~

配置完成后重启IDE

使用Android Studio查看并调试Android源码

源码导入

首先我们还是要执行一遍上述的source build/envsetup.sh 命令和 lunch 命令,当然,如果终端没有关闭的话,可以省略这一步,然后执行

mmm development/tools/idegen

编译生成idegen.jar,这里需要注意的是,虽然google的脚本说支持zsh,但是如果你用zsh就会出现 Couldn't locate the directory development/tools/idegen 这个错误,使用bash再来一遍就可以了

使用Android Studio查看并调试Android源码

生成完 idegen.jar 之后,就可以使用命令来扫描生成 ipr 文件了:

sudo ./development/tools/idegen/idegen.sh

使用Android Studio查看并调试Android源码

这个ipr文件就是整个项目,AndroidStudio可以直接识别打开它,就像打开正常的Android项目一样

使用Android Studio查看并调试Android源码

之后AndroidStudio就开始打开项目了,这个过程会比较缓慢,有时,AS会出现如下信息:

使用Android Studio查看并调试Android源码

大致的意思就是由于项目过于庞大,现在AS没有办法很好的监视整个项目的改变了,可以通过如下方式解决:

1. 在/etc/sysctl.conf 文件末尾中添加如下代码:

fs.inotify.max_user_watches = 524288

2. 然后在终端执行以下命令:

sudo sysctl -p --system

最后重启AS

AndroidStudio的其他配置

设置ProgectSDK AndroidAPI28,java版本为Java8

使用Android Studio查看并调试Android源码

然后在SDK选项中仅仅保留Java1.8和Android API 28,剩下的都删除掉

使用Android Studio查看并调试Android源码

使用Android Studio查看并调试Android源码

使用Android Studio查看并调试Android源码

接下来是Modules,将所有的Jar删除,因为基本上我们用不到jar,看源码就够了,如果确实需要哪个的话,再酌情保留

使用Android Studio查看并调试Android源码

如果AndroidStudio一直不停 scanning files to index,可以打开 module setting --> Modules --> 找到gen文件夹 --> 右键选择Resources

使用Android Studio查看并调试Android源码

现在我们就可以愉快的阅读源码啦~

删除不关心的项目

相关推荐