Android源码阅读平台搭建(基于Android Studio
2018-11-27 本文已影响87人
凤凰花开那一天
阅读Android源码的方式一般有以下几种:
1.搭建Samba服务,在windows平台上利用source Insight工具阅读
2.在Linux上安装wine工具,然后再安装source Insight工具阅读
- win端利用Android Studio载入相应代码,利用SSH工具,同步修改代码。
- 在Linux上安装android studio,导入生成android.ipr,android.iml。
这里,我们将使用第4种方案来搭建Android源码的阅读平台。
Step 1:首先,需要下载Android源码,并编译成功。
具体可以参考:
- 1.源码下载:https://www.jianshu.com/p/3d29a0972c20
- 2.源码编译:https://www.jianshu.com/p/2cd0c6b3f8ee
编译成功后,提示:
[ 99% 107/108] Install system fs image: out/target/product/generic/system.img
WARNING: out/target/product/generic/system.img+ approaching size limit (1610612736 now; limit 1610612736)
[100% 108/108] Create system-qemu.img
1+0 records in
2048+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0040105 s, 261 MB/s
1536+0 records in
1536+0 records out
1610612736 bytes (1.6 GB, 1.5 GiB) copied, 58.744 s, 27.4 MB/s
1048576+0 records in
1048576+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 1.52265 s, 689 kB/s
Creating new GPT entries.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
Setting name!
partNum is 0
REALLY setting name!
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
#### build completed successfully (05:31 (mm:ss)) ####
编译完成后,在out/target/product/generic/目录下,将存在system.img,userdata.img和ramdisk.img等文件,如下所示。
akira@ubuntu:~/android/aosp/out/target/product/generic$ l
advancedFeatures.ini hardware-qemu.ini system/
android-info.txt installed-files.json system.img
build.avd/ installed-files.txt system-qemu.img
build_fingerprint.txt installed-files-vendor.json system-qemu.img.qcow2
build_thumbprint.txt installed-files-vendor.txt userdata.img
cache/ kernel-ranchu-64 userdata-qemu.img
cache.img module-info.json userdata-qemu.img.qcow2
cache.img.qcow2 obj/ vbmeta.img
clean_steps.mk previous_build_config.mk vendor/
config.ini product_copy_files_ignored.txt vendor.img
data/ ramdisk.img vendor-qemu.img
dex_bootjars/ recovery/ vendor-qemu.img.qcow2
fake_packages/ root/ version_num.cache
gen/ symbols/
Step2: 编译idegen模块,生成Android Studio配置文件(*.ipr)
利用mmm指令编译idegen模块,mmm指令后跟着模块相对路径名,这是Android 源码平台环境初始化后的一个快捷命令。
mmm development/tools/idegen/
若没有查找到命令,需要先设置环境
. build/envsetup.sh
. lunch aosp_arm-eng
执行成功后,将生成目标jar文件:idegen.jar。
Step 3: 执行idegen.sh脚本,生成android.ipr,android.iml等工程配置文件。
该脚本需要在AOSP源码根目录下执行。
development/tools/idegen/idegen.sh
执行完成后,将提示:
Read excludes: xxx ms
Traversed tree: xxxxxx ms
这过程中,可能会出现Permission Denied的提示,这时候先中断脚本执行,找到提示目录,将读取目录权限添加到当前用户上,再继续编译。编译后生成的android.ipr和android.iml文件位于AOSP根目录下。
akira@ubuntu:~/android/aosp$ ls
Android.bp bootstrap.bash frameworks out
android.iml build gen packages
android.iml.bak compatibility hardware pdk
android.ipr cts hs_err_pid119705.log platform_testing
android.ipr.bak dalvik hs_err_pid120447.log prebuilts
android.iws developers hs_err_pid12568.log sdk
aosp-latest.tar development kernel system
art device libcore test
bionic download.sh libnativehelper toolchain
bootable external Makefile tools
Step 4: 编辑android.iml,导入指定模块代码阅读。
Android Studio的代码导入操作需要建立索引等,代码量大的时候将非常慢。所以,一般不可能一次性将所有源码到导入进去,而是只导入感兴趣的源码模块。这需要修改android.iml文件。记得操作前先做个备份。
该文件有2个标签
- sourceFolder标签下的模块将被导入
- excludeFolder标签下的模块将不导入
这里,我只导入framework/base/core目录下的源码,并将无关的内容删除后如下:
<?xml version="1.0" encoding="UTF-8"?>
<module version="4" relativePaths="true" type="JAVA_MODULE">
<component name="FacetManager">
<facet type="android" name="Android">
<configuration />
</facet>
</component>
<component name="ModuleRootManager" />
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/./frameworks/base/core/java" isTestSource="false"/>
<excludeFolder url="file://$MODULE_DIR$/./external/emma"/>
<excludeFolder url="file://$MODULE_DIR$/./external/jdiff"/>
<excludeFolder url="file://$MODULE_DIR$/out/eclipse"/>
<excludeFolder url="file://$MODULE_DIR$/.repo"/>
<excludeFolder url="file://$MODULE_DIR$/external/bluetooth"/>
<excludeFolder url="file://$MODULE_DIR$/external/chromium"/>
<excludeFolder url="file://$MODULE_DIR$/external/icu4c"/>
<excludeFolder url="file://$MODULE_DIR$/external/webkit"/>
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/host"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/product"/>
<excludeFolder url="file://$MODULE_DIR$/prebuilt"/>
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="inheritedJdk" />
<orderEntryProperties />
</component>
</module>
而后使用android studio打开现有的工程,选择.ipr文件导入,而后将是漫长的等待时间....
代码可以搜索与正常跳转,但是也可以看到代码有些错误,aidl接口相关的代码会有问题,但不影响我们阅读。