阅读Android框架源码
1. 背景
之前一直都是看Kernel源码,网上有很多好用的工具,如:
最近,因为要跟踪Android框架某个流程,须查看Android的框架源码,尝试过几种方案后,最终选择了rclone+Android Studio,先说一下工作环境。
2. 环境
Android 源码存放在Linux服务器上,之所以放在服务器上,而不是本地PC,主要是利用服务器性能和存储空间,毕竟Android框架代码太大了,压缩过后大约50G,解压出来100G,编译过后200G。平时工作时,使用 windterm连到服务器,使用vim+ccls就可以完成日常工作了。
3. 尝试
因为要阅读Java代码,这里先后使用了
- vscode(remote ssh)+java
- rclone + source insight
- Android stuido(linux版) + vcxSrv
- rclone + Android studio
其中,vscode不能跳转,估计是不能直接把某个目录加入vscode中,source insight搜索文件倒是好用,但跳转函数定义不是很好用。这些支持得最好的还是Android studio,开始的时候尝试在Linux上运行Android studio,再通过vcxSrv将图形界面展示到Window上,但一些快捷键不能使用,只能通过鼠标点击,效率大大降低。这里使用rclone的作用是将Linux上某个目录直接映射到Windows上的虚拟磁盘上,因为我们编译的出来的Android固件比较大,不想每次都拷贝到本地,再烧录到开发上,使用rclone后,就可以直接指定从虚拟磁盘上下载并烧录Android固件了。
4. 虚拟磁盘rclone
在使用rclone前,使用过
sshfs-win-manager最大的问题是不能直接下载比较大的文件,比如2G
SFTP drive倒是可以下载大文件,但免费版每次只能影射一个虚拟磁盘,这让有多台服务器的同学怎么办?
rclone 解决了上面的问题,并且没有广告,这么好的东东哪里去找,果断替换。
4.1 安装
首次使用需要配置一下
配置文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| [252] type = sftp host = 192.168.200.252 user = example key_file = ~/.ssh/id_rsa.pem md5sum_command = md5sum sha1sum_command = sha1sum
[253] type = sftp host = 192.168.200.253 user = example key_file = ~/.ssh/id_rsa.pem md5sum_command = md5sum sha1sum_command = sha1sum
|
这里的配置看起来比较简单,主要用意是使用keyfile+sftp登录服务器。最后,将服务器目录影射为虚拟磁盘。
4.2 影射虚拟磁盘
1 2
| // 将252服务器根目录影射到X盘,并启用缓存 rclone mount 252:/ x: --cache-dir D:\cache\252 --vfs-cache-mode writes &
|
5. 将Android源码导入Android Studio
5.1 准备
1 2
| cd /Android/Source ls -l |grep ^d |grep -v frameworks |grep -v system |awk '{print $9}'
|
这一步是将Android源码下的目录截取出来,以便后面排除不关心的目录,我这里仅保留了frameworks和system
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| art bionic bootable build compatibility cts dalvik developers development device EHomeApp EHomePreinstall external gen hardware kernel libcore libnativehelper mkcombinedroot out packages pdk platform_testing prebuilts rkbin RKDocs rkst RKTools rockdev sdk test toolchain tools u-boot vendor
|
将上面的结果附加到development/tools/idegen/excluded-paths文件末尾
1
| ls -l |grep ^d |grep -v frameworks |grep -v system |awk '{print "^"$9}' >> development/tools/idegen/excluded-paths
|
5.2 生成Android项目
1 2 3 4 5
| cd Android/Source source build/envsetup.sh lunch xxxxx mmm development/tools/idegen development/tools/idegen/idegen.sh
|
以上命令序列将在Android/Source目录下生成android.ipr和Android.iml,Android studio可直接打开android.ipr,先修改Android.iml文件,排除不关心的目录
1
| ls -l |grep ^d |grep -v frameworks |grep -v system |awk '{print "<excludeFolder url=\"file://$MODULE_DIR$/"$9"\" />"}'
|
得到如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <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$/cts" /> <excludeFolder url="file://$MODULE_DIR$/dalvik" /> <excludeFolder url="file://$MODULE_DIR$/developers" /> <excludeFolder url="file://$MODULE_DIR$/development" /> <excludeFolder url="file://$MODULE_DIR$/device" /> <excludeFolder url="file://$MODULE_DIR$/EHomeApp" /> <excludeFolder url="file://$MODULE_DIR$/EHomePreinstall" /> <excludeFolder url="file://$MODULE_DIR$/external" /> <excludeFolder url="file://$MODULE_DIR$/gen" /> <excludeFolder url="file://$MODULE_DIR$/hardware" /> <excludeFolder url="file://$MODULE_DIR$/kernel" /> <excludeFolder url="file://$MODULE_DIR$/libcore" /> <excludeFolder url="file://$MODULE_DIR$/libnativehelper" /> <excludeFolder url="file://$MODULE_DIR$/mkcombinedroot" /> <excludeFolder url="file://$MODULE_DIR$/out" /> <excludeFolder url="file://$MODULE_DIR$/packages" /> <excludeFolder url="file://$MODULE_DIR$/pdk" /> <excludeFolder url="file://$MODULE_DIR$/platform_testing" /> <excludeFolder url="file://$MODULE_DIR$/prebuilts" /> <excludeFolder url="file://$MODULE_DIR$/rkbin" /> <excludeFolder url="file://$MODULE_DIR$/RKDocs" /> <excludeFolder url="file://$MODULE_DIR$/rkst" /> <excludeFolder url="file://$MODULE_DIR$/RKTools" /> <excludeFolder url="file://$MODULE_DIR$/rockdev" /> <excludeFolder url="file://$MODULE_DIR$/sdk" /> <excludeFolder url="file://$MODULE_DIR$/test" /> <excludeFolder url="file://$MODULE_DIR$/toolchain" /> <excludeFolder url="file://$MODULE_DIR$/tools" /> <excludeFolder url="file://$MODULE_DIR$/u-boot" /> <excludeFolder url="file://$MODULE_DIR$/vendor" />
|
将上面的内容放到android.iml文件的合适位置,并稍做修改,删除重复项即可
5.3 导入Android工程
现在将可以使用Windows上Android Studio打开虚拟磁盘上的Android.ipr文件,等待Android studio索引完成,大功告成。
6. 参考资料:
kernel代码在线阅读
使用github+sourcegraph在线阅读内核代码
2022 年 vim 的 C/C++ 配置
Windows平台下使用 Rclone 挂载 OneDrive 为本地硬盘
使用 Android Studio 阅读 AOSP 源码