2024阅读AOSP源码的正确打开姿势
在Android系统开发中,阅读AOSP(Android Open Source Project)源码是非常重要的环节。然而,如何构建一个优雅的阅读环境却是一个不容忽视的问题。本文将介绍不同工具和方法下阅读AOSP源码的正确姿势,并对比其优缺点。
1. 阅读AOSP源码的方式
工具对比
工具 | 描述 | 优点 | 缺点 | 文档路径 |
---|---|---|---|---|
Vim等文本工具 | 打开速度快,不用索引源码,不支持代码跳转。 | 速度快 | 不支持代码跳转 | - |
Source Insight | 界面朴素,索引速度较慢,代码跳转不完整,仅官方支持Window平台。Linux平台支持配置复杂 | 界面简洁 | 仅支持Window平台,代码跳转不完整 | - |
在线源码网站 | 不用repo下载整个源码文件,但需要梯子才能查看,google站点https://cs.android.com/ | 不需要下载整个源码文件 | 需要借助梯子 | - |
IDE | 贴合实际开发环境,代码跳转、调试友好,IntelliJ/Android Studio支持Java源码环境,CLion支持Native源码环境。 | 实际开发环境友好 | 配置复杂,占用资源较多 | 官方文档 |
官方支持
2024小编不再推荐你使用vim、SourceInsight等老旧工具查看AOSP源码,局限性太多,小编给你提供以下几种官方支持方式:
脚本工具 | 描述 | 缺点 | 文档路径 |
---|---|---|---|
IDEGen | 生成android.ipr项目配置文件和android.iml依赖文件,AndroidStudio打开android.ipr即可导入AOSP。 | 仅支持生成Java源码环境,生成project未配置JDK依赖,因为索引整个AOSP项目导入Android Studio构建非常卡顿,需要手动排除不要的模块目录才能减轻卡顿问题。 | /development/tools/idegen/README.md |
Soong | 可指定选定的模块生成CMakeLists.txt适用于CLion的项目配置文件,CLion打开即可导入AOSP。 | 仅支持生成Native源码环境,用.mk文件编译(Make构建源码)的模块不会生成CMakeLists.txt文件,需要手动编写.bp(Soong构建)文件编译模块,编译出来的是各个模块单独的CMakeLists.txt,需要手动创建项目总CMakeLists.txt把各个模块合并。 | /build/soong/docs/clion.md |
AIDEGen | 自动完成指定模块的所有依赖,并自动拉起指定IDE导入项目。 | 如果指定的Native模块依赖很多、很大,工作耗时长 | /tools/asuite/aidegen/README.md |
AOSP的模块概念
使用上面官方支持方式导入AOSP源码之前,你需要了解AOSP模块概念,可简单理解为一个功能模块的代码集合,也就是一个代码集中的目录。文件目录下有 Android.bp(Soong构建配置文件) 或者 Android.mk(GUN Make构建配置文件)即可视为模块。例如:以下目录都可称之为模块:packages/apps/Settings
、packages/apps/Launcher3/
、frameworks/base
等。
AOSP的模块可以通过以下命令来查看:
source build/envsetup.sh
#获取所有模块
allmod >> mods.txt
#获取framework模块路径
pathmod framework
#获取libbinder模块路径
pathmod libbinder
2. AOSP源码下载编译
使用IDEGen、Soong及AIDEGen等工具导入AOSP源码前,你首先需要下载并编译AOSP源码,详情请参考之前的文章
AOSP源码下载编译
3. IDEGen生成AOSP源码Java阅读环境(不推荐)
导入步骤如下:
-
打开终端或命令行窗口。
-
运行以下命令:
source build/envsetup.sh && make idegen && . development/tools/idegen/idegen.sh
。该命令的执行时间可能较长。 -
在AOSP代码根目录下找到生成的 android.iml 和 android.ipr 两个文件。
-
打开 Android Studio。
-
点击 “File” --> “Open”,选择生成的 android.ipr 文件。
-
注意,导入整个源码会导致卡顿,你可以排除一些代码。打开 android.iml 文件,将以下内容添加到
<content url="file://$MODULE_DIR$">
标签中:<excludeFolder url="file://$MODULE_DIR$/bionic" /> <excludeFolder url="file://$MODULE_DIR$/bootable" /> <excludeFolder url="file://$MODULE_DIR$/build" /> <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$/docs" /> <excludeFolder url="file://$MODULE_DIR$/external" /> <excludeFolder url="file://$MODULE_DIR$/hardware" /> <excludeFolder url="file://$MODULE_DIR$/kernel" /> <excludeFolder url="file://$MODULE_DIR$/out" /> <excludeFolder url="file://$MODULE_DIR$/pdk" /> <excludeFolder url="file://$MODULE_DIR$/platform_testing" /> <excludeFolder url="file://$MODULE_DIR$/prebuilts" /> <excludeFolder url="file://$MODULE_DIR$/sdk" /> <excludeFolder url="file://$MODULE_DIR$/system" /> <excludeFolder url="file://$MODULE_DIR$/test" /> <excludeFolder url="file://$MODULE_DIR$/toolchain" /> <excludeFolder url="file://$MODULE_DIR$/tools" /> <excludeFolder url="file://$MODULE_DIR$/.repo" />
-
或者在 Android Studio 中手动排除目录。
-
最后,点击顶部菜单栏 “File” -> “Project Structure”,配置项目对应的 JDK、SDK。
注意:执行上述步骤需要一定的时间和计算资源,如果你的电脑CPU及内存资源足够,那么这个时间可能快很多。
由于导入整个AOSP项目到Android Studio会非常卡顿,因此不推荐使用。
4. Soong生成AOSP源码Native环境(不推荐)
导入步骤如下:
- 打开终端或命令行窗口。
- 运行以下命令:
这些命令将编译生成整个 AOSP 各个模块的 CMakeList.txt 文件。根据自己电脑的 CPU 参数,可以调整source build/envsetup.sh export SOONG_GEN_CMAKEFILES=1 export SOONG_GEN_CMAKEFILES_DEBUG=1 make -j8
-j8
后面的数字来指定执行生成任务的线程数。 - 如果想编译特定路径的模块,可以运行类似以下命令:
make frameworks/native/libs/binder
- 在编译模块的过程中,Soong会将 Native 代码的依赖关系记录到一个文件
CMakeLists.txt
中。生成的CMakeLists.txt
文件位于对应模块的路径,例如:out/development/ide/clion/frameworks/native/libs/binder/libbinder-arm-android/CMakeLists.txt
。 - 使用 CLion 打开刚生成的
CMakeLists.txt
文件。在 CLion 中打开后可能会看到扁平化的目录结构,需要修改工程根目录。可在顶部菜单栏选择 “Tools” -> “CMake” -> “Change Project Root”,然后选择源码中对应模块的目录,例如frameworks/native/libs/binder
。 - 如果想引导多个模块,需要手动创建一个顶层的
CMakeLists.txt
文件,将各个生成的模块的CMakeLists.txt
文件添加进来,类似于以下示例:cmake_minimum_required(VERSION 3.6) project(native) add_subdirectory(services/surfaceflinger) add_subdirectory(libs/ui/libui-arm64-android) add_subdirectory(libs/gui/libgui-arm64-android)
通过以上步骤,你就可以生成并配置好一个用于阅读 AOSP 源码的 Soong 环境。
然而,由于生成CMakeLists.txt文件需要手动编写,且执行命令耗时较长,因此也不推荐使用。
5. AIDEGen生成AOSP源码Java\Native环境(推荐)
AIDEGen是一种生成AOSP源码Java\Native环境的脚本工具,自动完成项目在IDE上的模块依赖、SDK、JDK等环境配置。它支持从Android 10开始生成Java项目,从Android 11开始完全支持Native项目,是目前推荐的使用方式。
导入步骤如下:
- 打开终端或命令行窗口。
- 运行以下命令:
这些命令将设置环境并选择构建目标为 64 位 PC 模拟器版本。可以根据需要选择其他目标,请参考官方文档了解更多选项:source build/envsetup.sh lunch aosp_x86_64-eng
https://source.android.google.cn/docs/setup/build/building?hl=zh-cn#choose-a-target
-
生成 Java 源码环境并启动 Android Studio 导入项目,可以运行以下命令:
aidegen framework -i s
这将生成
framework
模块的 Java 源码环境,并自动启动 Android Studio 导入项目。 -
如果想生成 Native 项目的源码环境,并启动 CLion 导入项目,可以运行类似以下命令:
aidegen frameworks/base/core/jni frameworks/native/libs/binder -i c
这将生成与 Binder 相关的 Native 层源码环境,并自动启动 CLion 导入项目。
-
如果之前已经使用过 aidegen 生成过模块,可以添加
-s
参数来跳过部分过程以加速任务执行。
通过以上步骤,你可以快速生成 AIDEGen 环境,帮助你更便捷地在 IDE 中阅读和开发 AOSP 源码。
想要进一步了解aidegen的使用技巧,请参考小编之前的文章:
aidegen:为AOSP代码中Java和C / C ++项目自动生成ide配置
另外,附上aidgen详细使用说明如下:
$ aidegen --help
usage: aidegen [module_name1 module_name2... project_path1 project_path2...]
AIDEgen
This CLI generates project files for using in IntelliJ, such as:
- iml
- .idea/compiler.xml
- .idea/misc.xml
- .idea/modules.xml
- .idea/vcs.xml
- .idea/.name
- .idea/copyright/Apache_2.xml
- .idea/copyright/progiles_settings.xml
- Sample usage:
- Change directory to AOSP root first.
$ cd /user/home/aosp/
- Generating project files under packages/apps/Settings folder.
$ aidegen packages/apps/Settings
or
$ aidegen Settings
or
$ cd packages/apps/Settings;aidegen
positional arguments:
targets Android module name or path.e.g. Settings or packages/apps/Settings
optional arguments:
-h, --help show this help message and exit
-d {0,1,2,3,4,5,6,7,8,9}, --depth {0,1,2,3,4,5,6,7,8,9}
The depth of module referenced by source.
-v, --verbose Display DEBUG level logging.
-i IDE, --ide IDE Launch IDE type, j: IntelliJ, s: Android Studio, e: Eclipse, c: CLion, v: VS Code. The default value is 'u': undefined.
-p IDE_INSTALLED_PATH, --ide-path IDE_INSTALLED_PATH
IDE installed path.
-n, --no_launch Do not launch IDE.
-r, --config-reset Reset all saved configurations, e.g., preferred IDE version.
-s, --skip-build Skip building jars or modules that create java files in build time, e.g. R/AIDL/Logtags.
-a, --android-tree Generate whole Android source tree project file for IDE.
-e [EXCLUDE_PATHS [EXCLUDE_PATHS ...]], --exclude-paths [EXCLUDE_PATHS [EXCLUDE_PATHS ...]]
Exclude the directories in IDE.
-V, --version Print aidegen version string.
-l LANGUAGE, --language LANGUAGE
Launch IDE with a specific language, j: Java, c: C/C++, r: Rust. The default value is 'u': undefined.
INFO: To report an AIDEGen tool problem, please use this link: https://goto.google.com/aidegen-bug
参数说明如下:
6. 最佳实践
在完成Ubuntu软硬件、AndroidStudio、CLion、Git、Repo、Python的配置后,可以使用以下命令完成源码拉取、编译依赖、启动IDE的任务:
mkdir aosp && cd aosp && repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r41 && repo sync && source build/envsetup.sh && lunch aosp_x86_64-eng && aidegen framework -i s && aidegen frameworks/native -i c
完成以上步骤后,可以在AndroidStudio、CLion中查看AOSP源码。如果电脑性能良好、带宽充足,可以大大提高源码阅读的效率。
总之,选择合适的工具和方法,以及合理的配置,对于构建高效的AOSP源码阅读环境至关重要。建议开发者根据实际需求和环境,选择适合自己的阅读方式。
7. 参考链接及资源
https://source.android.google.cn/docs/setup/build?hl=zh-cn
8. 福利放送
如果你打算入坑Android Framework开发,小编给你准备了一份免费学习资料,请关注 虎哥Lovedroid 并回复fw666
领取《Android Framework核心源码笔记》核心资料。
下面是资料部分截图