下载源代码
初始化Manifest
repo init –depth=1 -u https://android.googlesource.com/platform/manifest -b android13-release
镜像使用:将 https://android.googlesource.com/ 全部使用 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/ 代替即可。
repo init –depth=1 -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-release
-b | 指定下载分支为android13-release |
---|---|
–depth=1 | 只下载最新的提交,不下载历史记录,会加速很多 |
此Manifest非彼Manifest,他是用来描述Repo的目录结构的,它显式的描述每一个工程是从哪个代
码仓库来的,是哪个分支,哪个Tag。它在$DIR/.repo目录下存在一个default.xml,里面就是这个manifest文件。我们在$DIR/.repo/local_manifests/*
.xml创建本地文件,里面配置修改的工程。
1 | <manifest> |
同步源代码
使用命令行将仓库的代码下载到本地:
repo sync -c –no-clone-bundle –no-tags -j8
参数说明
-c | 使用当前分支,不下载其他分支源代码 |
---|---|
–no-clone-bundle | 不下载bundle的文件 |
–no-tags | 不下载tags |
-j8 | 使用8个线程进行下载 |
编译源代码
在完成源代码下载之后,需要进行源代码的编译工作,产生重要的镜像文件(Image)
设置编译环境
1 | source build/envsetup.sh |
每次启动 terminal 的时候都需要重新设置编译环境,否则会出现找不到文件路径和命令的情况。
选择编译目标
1 | lunch |
选择适配的目标构建版本(开发板或者模拟器),所有构建目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE
是以下类型之一:
构建类型 | 使用情况 |
---|---|
user | 权限受限;适用于生产环境 |
userdebug | 与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型 |
eng | 具有额外调试工具的开发配置 |
根据我们的模拟器环境,选择x86(Intel芯片的mac)或者 arm(m系列的mac)的系统镜像。
备注:⻋机模拟器运行类型以“sdk_car_”开头
编译代码
使用envsetup脚本中提供的编译命令,来进行系统镜像的编译
1 | m -j8 |
参数说明
-j8 | 使用8个线程进行下载 |
---|
可以通过在 m 命令行中列出相应名称来构建特定模块,而不是构建完整的设备映像。此外,m 还针对各种特殊目的提供了一些伪目标。以下是一些示例:
- droid - m droid 是正常 build。此目标在此处,因为默认目标需要名称。
- all - m all 会构建 m droid 构建的所有内容,加上不包含 droid 标记的所有内容。构建服务器会运行此命令,以确保包含在树中且包含
- Android.mk 文件的所有元素都会构建。
- m - 从树的顶部运行构建系统。这很有用,因为您可以在子目录中运行 make。如果您设置了 TOP
环境变量,它便会使用此变量。如果您未设置此变量,它便会从当前目录中查找相应的树,以尝试找到树的顶层。您可以通过运行不包含参数的
m 来构建整个源代码树,也可以通过指定相应名称来构建特定目标。 - mma - 构建当前目录中的所有模块及其依赖项。
- mmma - 构建提供的目录中的所有模块及其依赖项。
- croot - cd 到树顶部。
- clean - m clean 会删除此配置的所有输出和中间文件。此内容与 rm -rf out/ 相同。
说明:
1 | make/m |
该命令会编译所有的代码。我们可以通过添加参数-jN来并发加速执行,这将极大加速我们编译系统速度。
第一次编译如果是-j12的话,时间大概是6小时,如果默认的话,时间会变成12小时。
1 | mm/mmm |
如果每次的编译都要等待6个小时,那么我们的工作就很难开展。Android系统支持增量编译,还支持独立编译Module。mm命令就提供我们一种可能性,它编译当前目录下的所有模块。以services.jar为例,mm编译的时间在10分钟,可以极大的提高我们的开发效率。
修改源代码
官方给我们提供了很多快捷指令来帮助我们修改更新源代码,关于修改验证会在后续的章节详细介绍,这里不做过多的讲解。以下罗列一些常见的指令:
- croot 快速切换回源代码根目录
- cgrep 在本地所有的C/C++文件中寻找内容
- jgrep 在本地所有的Java文件中寻找内容
编译产生物
编译镜像
编译完成后,会产生编译好的镜像。位于以下目录中:
1 | $DIR/out/target/product/$Lunch_Target/ |
这里面有两个镜像非常重要,一个是Boot.img,另一个是System.img
- Boot.img | 主要包含Linux kernel以及Ramdisk根文件系统 |
---|---|
- System.img | 包含整个Android系统,/system目录的内容,包含系统应用,Android框架等等 |
- Userdata.img | 包含了用户安装的应用信息跟数据,在/data目录 |
系统常用jar包路径
当需要进行系统应用或者服务开发时,有一些API是内部internel级别或者hide级别,需要我们引入AOSP的原生jar包来解决。
如何找到对应目录的jar包?
- 在AOSP根目录下通过
find -name “*xxx*
查找到所有路径 - 在Android13后,应该在这个路径下进行挑选:
./out/soong/.intermediates/packages/…/android_common/**
或者out/target/common/obj/JAVA_LIBRARIES/
目录下寻找。
出现多个不同地址jar包如何选择?
这些jar包会出现在多个路径中,例如:’withres-withoutdex/’, ‘aligned/’, ‘dex/’,’turbine-combined/’, ‘turbine/’, ‘javac/‘等等:
- withres-withoutdex: 这个目录下的JAR文件包含了所有的.class文件和资源文件,但没有被打包成dex格式。
- aligned: 这个目录下的JAR文件包含了所有的.class文件和资源文件,并且已经被对齐和压缩过。
- dex: 这个目录下的JAR文件是一个标准的dex文件,里面包含了所有的.class文件。
- turbine-combined: 这个目录下的JAR文件包含了用于编译Java代码的Turbine编译器生成的代码。
- turbine: 这个目录下的JAR文件包含了Turbine编译器生成的代码,但是这些代码没有被合并成单个文件。
- javac: 这个目录下的JAR文件包含了用于编译Java代码的Javac编译器生成的代码。
注意:如果需要引入jar包参与编译,不能选择turbine或者turbine-combined的jar包,否则会遇到desugar异常。
下面罗列一些常见的jar包地址:
Framework.jarAOSP/out/soong/.intermediates/frameworks/base/framework-minus-apex/android_common/combined/framework-minus-apex.jarAOSP/out/target/product/emulator_car_x86_64/system/framework/framework.jar,这里面的jar包不全,缺少东西
注意:这个framework.jar不能从
Framework-bluetooth.jar
~AOSP/out/target/common/obj/JAVA_LIBRARIES/framework-bluetooth.com.android.btservices_intermediates/classes.jar
Framework-wifi.jar
~AOSP/out/target/common/obj/JAVA_LIBRARIES/framework-wifi.com.android.wifi_intermediates/classes.jar
Car-lib.jar
~
AOSP/out/soong/.intermediates/packages/services/Car/car-lib/android.car/android_common/withres-withoutdex/android.car.jar
Core-libart.jar
~AOSP/out/soong/.intermediates/libcore/core-libart/android_common_apex31/withres-withoutdex/core-libart.jar
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 350394277@qq.com