教程002-设计思路
背景¶
as-aosp 的设计初衷是为了方便阅读 aosp 源码,可以做到丝滑跳转、联想。
aosp 的 idegen(android.ipr和android.iml) 方案也可以加载源码实现跳转,但不尽人意。
而 as-aosp 则借鉴了 app 配置 gradle 的思路,下来我们来一步一步分析其配置方案。
目录结构¶
.
├── aosp-modules
│ ├── Framework
│ │ └── build.gradle
│ └── Services
│ └── build.gradle
├── build.gradle
├── gradle.properties
├── scripts
│ ├── android-build.gradle
│ ├── aosp_generator_out_code_linker.py
│ ├── configs
│ │ ├── aosp.gradle
│ │ ├── car.gradle
│ │ └── cts.gradle
│ ├── copy_aosp_scrjar.py
│ ├── core.gradle
│ ├── func.gradle
│ ├── ln.sh
│ └── settings
│ ├── aosp-cmake.gradle
│ ├── aosp.gradle
│ ├── aosp-system-server.gradle
│ ├── car.gradle
│ └── cts.gradle
└── settings.gradle
当前的 as-aosp 目录比上面的复杂,这里只是精简后当做一个例子。
- 根目录有 build.gradle 、settings.gradle
- 模块目录只包含一个 build.gradle ,如 aosp-modules/Framework/build.gradle
- scripts 目录包含了很多关键的脚本
core.gradle¶
core.gradle 配置一些核心的内容。
如 aospRoot 就是配置 aosp 源码路径,androidSdk 则是配置 sdk 开发版本。
func.gradle¶
func.gradle 则是放一些公共函数,其中有一个非常重要的函数:getRoot(properties) 就是解析 local.properties 是否包含 EXT_AOSP_ROOT 属性。
configs¶
scripts/configs 目录下面的几个 gradle 脚本都是配置每个模块具体源码路径。
如:scripts/configs/aosp.gradle 配置了 Framework 模块的源码路径。
这里每个模块配置项都有:manifest、res、assets、jni、src、srcjars、aidl。如果没有则设置为空即可。
如:
settings¶
scripts/settings 目录下面的几个 gradle 脚本则是配置子模块。
如:scripts/settings/aosp-system-server.gradle 配置了 Framework 模块等等。
到这里我们知道了:
- scripts/configs 下的脚本是配置各个模块代码的具体路径
- scripts/settings 则是配置工程的子模块
但没有看到加载这些配置的地方,我们再回到工程根目录。
根build.gradle¶
apply from: "${rootDir}/scripts/func.gradle"
//配置文件存在,则加载
applyConfig('scripts/core.gradle')
applyConfig('scripts/configs/aosp.gradle')
applyConfig('scripts/configs/car.gradle')
applyConfig('scripts/configs/cts.gradle')
applyConfig('ext/scripts/configs/ext.gradle')
在工程 根build.gradle 中加载了 func.gradle、core.gradle、以及 scripts/configs 下的各个配置。
这样做之后,我们这个工程就可以访问到 scripts/configs 下配置的内容了,比如:
我在一个子模块中:
这样就可以访问到 scripts/configs/aosp.gradle 下配置的 Framework。
根settings.gradle¶
apply from: "${rootDir}/scripts/func.gradle"
//配置文件存在,则加载;文件中配置具体的模块
applyConfig('scripts/settings/aosp.gradle')
//applyConfig('scripts/settings/aosp-cmake.gradle')
applyConfig('scripts/settings/aosp-system-server.gradle')
applyConfig('scripts/settings/car.gradle')
//applyConfig('scripts/settings/cts.gradle')
applyConfig('ext/scripts/settings/ext.gradle')
在工程 根settings.gradle 中就很简单了,加载 scripts/settings 中配置的子模块。