跳转至

教程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。如果没有则设置为空即可。

如:

Framework : [  
        manifest: "",  
        res     : [],  
        assets  : [],  
        jni     : "",  
        src     : [],  
        srcjars : [],  
        aidl    : [],  
],

settings

scripts/settings 目录下面的几个 gradle 脚本则是配置子模块。

如:scripts/settings/aosp-system-server.gradle 配置了 Framework 模块等等。

include ':Framework'  
project(':Framework').projectDir = "$rootDir/aosp-modules/Framework" as File

到这里我们知道了:

  • 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 下配置的内容了,比如:

我在一个子模块中:

def androidRoot = rootProject.ext.aosp.Framework

这样就可以访问到 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 中配置的子模块。

评论