1. 前言
上篇文章,我们基于Ubuntu24.04
,已经成功下载下来了Android12
的源码,这篇文章我们会接着上文,基于Ubuntu24.04
来编译Android
源码。
2. 编译源码
2.1 了解源码编译的名词
- Makefile : Android平台的一个编译系统,其实就是用Makefile写出来的一个独立的项目,定义了编译的规则,实现了自动化编译。不仅要把分散在数百个git库中的代码整合起来,统一编译,而且把产物分门别类地输出到一个目录。打包成手机的Room,还可以生成应用开发时所使用的SDK,NDK等等,因此采用Makefile编写的编译系统, 也可以称之为Makefile编译系统。
- Android.mk : 是Makefile编译系统的一部分,Android.mk是Android编译环境下的一个特殊的makefile文件,他是经过Android编译系统处理的,Android.mk中定义了一个模块必要的参数,使模块随着平台编译。通俗来讲,就是告诉编译系统,以什么样的规则编译源代码,并生成对应的目标文件。
- Ninja : 致力于速度的小型编译系统,如果把其他编译系统看做是高级编程语言,那么Ninja就是汇编,使用Ninja的主要目的就是因为其编译速度非常快。
- Soong : 谷歌用来替代Makefile编译系统,负责解析Android.bp文件,并将其转化为Ninja文件。
- Blueprint : 用来解析Android.bp文件,翻译成Ninja语法的一个文件
- kati : google专门为Android开发的一个小型的项目,基于Golang和C++,目的是把Android.makefile转化为Ninja文件。
- Android.bp : 用来替换Android.mk的一个配置文件
2.1.1 Android.mk / Ninja / Soong / Blueprint / kati /Android.bp 的概念之间的联系
2.2 准备编译环境
使用build目录中的envsetup.sh脚本来初始化环境,这个脚本会引入其他的一些执行脚本。
source build/envsetup.sh
完成初始化环境的一个操作
make clobber
选择编译的目标,是envsetup.sh中定义的一个命令,用来让用户选择编译的目标
lunch
比如会显示出,这些可选的编译项
You're building on LinuxLunch menu... pick a combo:1. aosp_arm-eng2. aosp_arm64-eng3. aosp_blueline-userdebug4. aosp_blueline_car-userdebug5. aosp_bonito-userdebug6. aosp_bonito_car-userdebug7. aosp_car_arm-userdebug8. aosp_car_arm64-userdebug9. aosp_car_x86-userdebug10. aosp_car_x86_64-userdebug11. aosp_cf_arm64_auto-userdebug12. aosp_cf_arm64_phone-userdebug13. aosp_cf_x86_64_phone-userdebug14. aosp_cf_x86_auto-userdebug15. aosp_cf_x86_phone-userdebug16. aosp_cf_x86_tv-userdebug17. aosp_coral-userdebug18. aosp_coral_car-userdebug19. aosp_crosshatch-userdebug20. aosp_crosshatch_car-userdebug21. aosp_flame-userdebug22. aosp_flame_car-userdebug23. aosp_sargo-userdebug24. aosp_sunfish-userdebug25. aosp_taimen-userdebug26. aosp_trout_arm64-userdebug27. aosp_trout_x86-userdebug28. aosp_walleye-userdebug29. aosp_walleye_test-userdebug30. aosp_x86-eng31. aosp_x86_64-eng32. arm_krait-eng33. arm_v7_v8-eng34. armv8-eng35. armv8_kryo385-eng36. beagle_x15-userdebug37. beagle_x15_auto-userdebug38. car_x86_64-userdebug39. db845c-userdebug40. fuchsia_arm64-eng41. fuchsia_x86_64-eng42. hikey-userdebug43. hikey64_only-userdebug44. hikey960-userdebug45. hikey960_tv-userdebug46. hikey_tv-userdebug47. pixel3_mainline-userdebug48. poplar-eng49. poplar-user50. poplar-userdebug51. qemu_trusty_arm64-userdebug52. silvermont-eng53. uml-userdebug54. yukawa-userdebug55. yukawa_sei510-userdebug
这里选项名称的含义
- build : 表示编译出的镜像,可以运行在什么环境
- aosp : 代表Android的一个开源项目
- arm/x86等 : 表示运行在ARM/X86处理器的架构上
BUILDTYPE
指的是编译类型,有以下三种:
- user : 用来正式发布到市场的版本,权限受限,如没有root权限,不能 dedug,adb默认处于停用状态。
- userdebug : 在user版本的基础上开放了root权限和debug权限,adb默认处于启用状态。一般用于调试真机。
- eng :开发工程师的版本,拥有最大的权限(root等),具有额外调试工具的开发配置。一般用于模拟器。
这里我们要运行在模拟器上,所以可以选30
2.3 进行编译
然后进行编译
make -j 6
如果设备的内存不足或性能不足,同时执行的任务数,即
-j
可以设置的小一下,比如设置为1
或2
,只不过编译的时间会变久。
最终会在 out/target/product/generic_x86/
日录生成了三个重要的镜像文件:system.img、userdata.img、ramdisk.img
。
- system.img:系统镜像,里面包含了Android系统主要的目录和文件,通过init.c进行解析并mount挂载到/system目录下。
- userdata.img:用户镜像,是Android系统中存放用户数据的通过init.c进行解析并mount挂载到/data目录下。
- ramdisk.img:根文件系统镜像,包含一些启动Android系统的重要文件,比如init.rc。
显示出如下信息,就表明编译成功了 : Build completed successfully
2.4 运行虚拟机
编译完成后,执行emulator
命令运行虚拟机
emulator
遇到的问题 : ubuntu emulator 第一次启动起来了,第二次却提示找不到命令
解决办法 : ubuntu 打开Android模拟器(Android源码编译)提示:emulator:未找到命令
3. 单编
mm
指的是只编译当前目录的模块,不编译所有模块。
当我们只修改了指定目录下的模块时,就可以使用这个命令,从而加快编译速度。
3.1 进入指定目录,执行mm命令
//进入指定目录
cd packages/apps/settings
//执行mm命令
mm
3.2 编译成功
显示出如下信息,就表明编译成功了 : Build completed successfully
除了Settings.odex文件,还会在out/target/product/generic_x86/system/priv-app/Settings
日录下生生成Settings.apk
3.3 其他单编命令
此外还有以下命令可以进行单编 :
- mmm : 编译指定目录下的模块,不编译它所依赖的其它模块。
- mma : 编译当前目录下的模块及其依赖项。
- mmma : 编译指定路径下所有模块,并且包含依赖,
3.4 单编完成后,怎么查看效果 ?
-
方式一 : 可以在编译完成后,借助 adb install -r apk 路径直接将⽣成的 apk ⽂件安装到设备上,如果不是 APK,直接 push 对应的⽂件。
-
方式二 : 可以编译好完成后,再使⽤ make systemimage ,重新⽣成 system.img,再运⾏模拟器也可。
详见 : 单编完成后,怎么查看效果 ?
3.4.1 如何查找文件
查找文件 -> 编译产物 out/target/
find <起始目录> -name <文件名>
比如可能位于
/out/target/product/generic_x86/system/system_ext/priv-app/Settings/Settings.apk
3.5 单编显示成功后,运行安卓模拟器,并没有生效
可以带上参数-wipe-data
emulator -wipe-data
详见 : Android源码单独编译某个模块
4. 其他
4.1 工具
查看源码
- Android Studio for Platform
- 安装AS : https://developer.android.google.cn/studio/install?hl=zh-cn
4.2 repo 下载源码中途中断
使用git fetch命令:如果repo sync命令在下载过程中中断,可以尝试进入.repo/projects/prebuild目录,并执行git fetch命令来继续同步未完成的源码。这种方法适用于在下载过程中遇到网络问题或其他原因导致下载中断的情况。
4.3 参考
手把手教你编译和调试AOSP源码
带你玩转编译Android系统源码!