0x5、编译
同样,先是一些名词的解释:
Makefile
→ Android平台编译系统,用Makefile写出来的一个独立项目,定义了编译规则,实现自动化编译,将分散在数百个Git库中的代码整合起来,统一编译,而且把产物分门别类地输出到一个目录,打包成手机ROM,还可以生成应用开发时使用的SDK、NDK等。
Android.mk
→ 定义一个模块的必要参数,使模块随着平台编译,简单点说就是告诉系统以什么规则编译源代码,并生成对应目标文件;
kati
→ Google专门为Android研发的小工具,基于Golang和C++,作用是:将Android中的Makefile转换为Ninja文件
Ninja
→ 致力于速度的小型编译系统,把Makefile看做高级语言,那它就是汇编,文件后缀为.ninja;
Android.bp
→ 替换Android.mk的配置文件;
Blueprint
→ 解析Android.bp文件翻译成Ninja语法文件;
Soong
→ Makefile编译系统的替代品,负责解析Android.bp文件,并将之转换为Ninja文件;
关系描述:
- Android工程越来越大,Makefile编译耗时越来越长,Android 7.0引入速度和并行效率更佳的Ninja来编译系统;
- Soong 借助 Blueprint定义的Android.bp语法,完成Android.bp的解析,最终转换成Ninja文件;
- Makefile文件(.make或.mk)通过kati转换为Ninja文件(.ninja);
- Makefile是设计来给开发编写的,而Ninja则是设计给其他程序生成的,可类比做高级语言和汇编语言;
① 编译环境准备
# ① 安装jdk 8 sudo apt-get update sudo apt-get install openjdk-8-jdk # Tips:使用ubuntu 14+,还需要安装下述依赖包 sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
② 源码整编
# ① 初始化环境 source build/envsetup.sh # ② 删除out与中间文件,clean会删除本次设置生成的、clobber会删除所有配置生成的 make clobber # ③ 选择编译目标,下述命令会进入菜单,选择相应的版本,输入序号回车 # 编译目标都采用 BUILD-BUILDTYPE 形式,BUILD 表示特定功能代号,BUILDTYPE是以下类型之一: # user → 权限受限、适用于生产环境,没root权限,不能debug,adb默认处于停用状态; # userdebug → 与user类似,但具备root权限和debug权限,一般用于调试真机。 # eng → 具有额外调试工具的开发配置,拥有最大的权限(root等),一般用于模拟器。 # 编译目标示例 → Pixel 3a XL的编译目标 → aosp_bonito-userdebug lunch # 也可以直接指定编译目标,如:lunch aosp_bonito-eng # 还可以直接用序号,如:lunch 8,但不建议,因为不同的系统版本序号对应可能有偏差~ # ③ 开始编译,后面的-jN参数用来设置编译的并行任务数,CPU核心数为6,N值最好选6-12间 # 根据自己CPU核心数动态修改哈,见过有32的~ make -j6 # 也可以把输出结果打印到log文件中:make -j6 2>&1 | tee build_20211206_1403.log # 编译成功后会生成out目录,比如这里的:~/aosp/out/target/product/bonito # Tips:有需要还可以键入:make sdk,编译SDK生成修改后的android.jar
③ 源码单编
整编一般会耗费几小时,有时可能只是修改了其中某个应用模块,只需单独编译这个模块,以设置模块为例:
source build/envsetup.sh lunch aosp_bonito-eng # 进入模块目录 cd package/apps/Setting # 编译单独模块的可选指令如下: # mm → 编译当前目录下的模块,不编译依赖模块 # mmm → 编译指定目录下的模块,不编译依赖模块 # mma → 编译当前目录下的模块及其依赖项 # mmmma → 编译指定路径下所有模块,切包含依赖 mm # 编译成功会提示生成文件的存放路径,除了生成Setting.odex外,还会在 # priv-app/Settings目录下生成Settings.apk,可直接adb push或adb install # 安装APK验证效果,也可以使用make snod命令重新打包生成system.img,运行模拟器查看
0x6、刷机
① 亲儿子Pixel或Nexus
恭喜,可以直接刷,先到 Driver Binaries for Nexus and Pixel Devices 根据自己的机型和Android版本号,下载对应的驱动。接着解压执行:
./extract-qcom-sargo.sh ./extract-google_devices-sargo.sh
进入bootloader,执行烧写命令(-w代表清空数据)
adb reboot bootloader fastboot flashall -w
然后等待烧写完成即可~
② Android虚拟机
得自己编译AVD镜像,lunch那里选择 sdk_phone_x86_64 编译目标,除常规编译外,还得附加 sdk 和 sdk_repo 包。
网络异常,图片无法展示
|
上述方法不生效的话,可以把镜像Copy到 SDK/system-images/android-xx/
的其中一个目录中。