深入学习Android系统框架开发前,首先要搭建Android工程的开发环境(建房子前先搞地基),详细的配置要求和操作步骤见官网说明 Establishing a build environment,本文也汇总了Android 12工程源码的下载、编译和刷机的实操过程。
在开始代码下载之前,先强调下源码编译对硬件/软件的要求:
硬件要求:
软件要求:
详细说明可参考官网:Requirements
个人建议:如果电脑配置不够,可以用云电脑产品来代替,比如“天翼云电脑”,可以选择超强的配置和Ubuntu系统,实现Study Work Anywhere。调试终端可以使用模拟器,但有条件的话推荐用Google发布的终端设备来调试,如Pixl3L、Pixl4,闲鱼上很多。
官方教程参考Source control tools,Downloading the source,包含源码管理工具Git,Repo,Gerrit,Android Code Search,Android Studio,Android Debug Bridge (ADB)的说明和源码下载。在国内因为墙而导致无法初始化repo,本教程以国内的镜像站点为例子,比如科大 AOSP 镜像站点,或者北京外国语大学开源软件镜像站。
如官方文档所介绍,AOSP各个模块源码通过Git来托管,如果要下载整个工程,需要脚本工具来集中同步和管理所有模块的Git(代码仓库),Repo工具的作用就是如此。
mkdir ~/bin
PATH=~/bin:$PATH
curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
sudo apt install git
git config --global user.name "xxxx"
git config --global user.email "[email protected]"
配置好git后可以通过git config --list查看是否成功,比如我的:
user.name=quexl1
user.email=quexl1@xxxx.cn
在本地建立一个工作目录(名字任意,我买的机器是Pixel4,代号是flame,这里以 aosp_12.0_flame 为例子)
mkdir aosp_12.0_flame
cd aosp_12.0_flame
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-12.1.0_r11
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
如不后面不带"-b",默认会下载所有的代码,默认分支是 master。
我这里同步最新的12.0版本,因此使用的分支是:android-12.1.0_r11
这里需要注意,默认的 repo 使用的地址是 REPO_URL = ‘https://gerrit.googlesource.com/git-repo’ ,这里我们需要修改 REPO_URL,否则会出现无法下载的情况
下载好 .repo 之后会有下面的信息
➜ Android12 repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
Downloading Repo source from https://gerrit-googlesource.proxy.ustclug.org/git-repo
... A new version of repo (2.17) is available.
... You should upgrade soon:
cp /home/gracker/Code/Android12/.repo/repo/repo /home/gracker/bin/repo
Downloading manifest from git://mirrors.ustc.edu.cn/aosp/platform/manifest
remote: Enumerating objects: 91965, done.
remote: Total 91965 (delta 0), reused 0 (delta 0)
Your identity is: quexl1
If you want to change this, please re-run 'repo init' with --config-name
repo has been initialized in /home/aosp_12.0_flame
上面的步骤初始化 .repo 文件后,代码同步要执行 repo sync 来进行下载。由于镜像站的限制和下载过程中可能会遇到的问题,建议大家用 -j4 来下载
repo sync -j4
代码下载完成之后,我们先不着急编译,如果要想在真机上跑,需要下载一些厂商闭源的驱动文件,这样后续编译的代码才可以跑到真机上,此处对应的 官方文档
由于我同步的代码是android-12.1.0_r11 分支,驱动程序需要在这里下载 https://developers.google.cn/android/drivers
以我的 pixel 4 为例,下载的代码是android-12.1.0_r11,TAG对应的驱动BUILD ID我们可以在这里查:https://source.android.google.cn/docs/setup/about/build-numbers,因此我需要下载的驱动是
点击 Link 下载两个文件,然后进行解压到代码根目录,然后执行 sh 脚本释放驱动到合适的位置,二进制文件及其对应的 makefile 将会安装在源代码树的 vendor/ 层次结构中。
下载的内容解压后,是两个 sh 文件,以我的 Pixel 4 为例,在代码根目录执行,使用 D 来向下翻页,直到最后手动输入 I ACCEPT
# 解压缩 extract-google_devices-crosshatch.sh
./extract-google_devices-flame.sh
# 解压缩 ./extract-qcom-crosshatch.sh
./extract-qcom-flame.sh
代码和驱动都下载好之后,就可以开始代码的编译工作了,由于新版本不再支持 Mac 编译,所以建议大家还是使用 Linux 来进行编译,推荐使用Ubuntu。
官方文档:Establishing a build environment
Ubuntu 18.04 以上直接运行安装交叉编译依赖的工具:
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
注意如果apt-get找不到源,可以通过修改apt-get的源来解决,自行百度。也可以使用我这份源替换/etc/apt下的sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
sudo apt-get update //更新;
官方文档:Building Android
在工程源码根目录执行
source build/envsetup.sh
lunch
会输出编译目标列表提供选择。
You're building on Linux
Lunch menu .. Here are the common combinations:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_barbet-userdebug
4. aosp_bluejay-userdebug
5. aosp_bramble-userdebug
6. aosp_bramble_car-userdebug
7. aosp_car_arm-userdebug
8. aosp_car_arm64-userdebug
9. aosp_car_x86-userdebug
10. aosp_car_x86_64-userdebug
11. aosp_cf_arm64_auto-userdebug
12. aosp_cf_arm64_phone-userdebug
13. aosp_cf_x86_64_auto-userdebug
14. aosp_cf_x86_64_foldable-userdebug
15. aosp_cf_x86_64_pc-userdebug
16. aosp_cf_x86_64_phone-userdebug
17. aosp_cf_x86_64_tv-userdebug
18. aosp_cf_x86_phone-userdebug
19. aosp_cf_x86_tv-userdebug
20. aosp_cheetah-userdebug
21. aosp_cloudripper-userdebug
22. aosp_coral-userdebug
23. aosp_coral_car-userdebug
24. aosp_flame-userdebug
25. aosp_flame_car-userdebug
26. aosp_oriole-userdebug
选择自己机器的代号名称即可,我的Pixel 4的机器代号是flame,因此选择24。
在这里可以查看所有机型对应的代号:selecting-device-build
执行make编译,可以选择12或者32线程编译。
make -j12
耐心等待编译成功之后,会有下面的输出
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
[100% 777/777] Target vbmeta image: out/target/product/flame/vbmeta.img
#### build completed successfully (03:57 (mm:ss)) ####
编译好之后下面开始刷机,以我的测试机器 Pixel 4 为例,依次执行下面的命令
adb reboot fastboot
# 等待手机进入 fastboot 界面之后
fastboot flashall -w
# 刷机完成之后,执行 fastboot reboot 长期系统即可
fastboot reboot
注意:fastboot flashall -w命令如果在工程外面执行,要配置$ANDROID_PRODUCT_OUT目录环境
刷机截图如下:
之后手机会自动重启,然后进入主界面,至此,我们的代码下载-编译-刷机的这部分就结束了。
如果在刷机的过程中遇到问题,可刷官方的刷机包拯救 :https://developers.google.cn/android/images
DM-verity 是Android 系统安全的重要部分,它能保证Android 的 vendor 和 system 镜像文件中的内容是真实可靠的。所以如果打开了DM-verity功能那么如果我们通过fastboot修改android系统的system分区或者vendor分区,那么DM-verity校验时就会出错,因此在fastboot之前需要先将DM-verity解锁。
adb root
adb reboot bootloader
fastboot devices
fastboot flashing unlock
fastboot reboot(稍等系统重启完毕)
此时发现oem选项已经变灰色了。
adb root
adb disable-verity
adb reboot
adb root
adb remount可以成功remount /system为读写模式
注意:fastboot 需要安装对应的驱动才可以使用。
好了,以上就是Android 12 源码下载、编译和刷机的全过程。
如果想在Pixl4上搭建Android13的开发环境,只需要在上面的步骤中替换源码的分支,以及对应的Google和厂家驱动即可。
flame Android13(T)
build id:TP1A.221005.002.B2
source branch:android-13.0.0_r31
在平时的开发中如果我们修改了系统框架,可以重新生成系统镜像并替换查看效果。如果修改涉及的模块比较独立,比如framework和services,可以通过单编Framework模块的方式,提高开发效率,方法如下。
首先修改完framework/base/core部分的代码后,通过以下命令编译framework.jar
make framework-minus-apex
编译出framework.jar后,先用第五步的方法执行remount。然后把framework.jar push到system/framework/下面,同时还要删除这个目录下面的oat,arm,arm64三个目录(不删除会一直卡在开机动画),最后再运行下面的命令重启zygote,这样新替换的framework.jar就生效了。
adb shell stop;
adb shell start;
首先修改完framework/base/services部分的代码后,通过以下命令编译services.jar
mmm framework/base/services -j12
编译出services.jar后,先用第五步的方法执行remount,然后push services.jar到system/framework下面,重启即可。
Android12 AOSP开发环境搭建
Establishing a build environment
Requirements
Source control tools
Downloading the source
Soong Build System
Codenames, tags, and build numbers
Flashing devices
Factory Images for Nexus and Pixel Devices
Driver Binaries for Nexus and Pixel Devices
科大 AOSP 镜像站点
北京外国语大学开源软件镜像站