《AOSP 源码下载》完成后,就可以开编了。
整编
整编,顾名思义就是编译整个 Android 源码,最终 out 目录会生成几个重要的镜像文件,其中有 system.img、userdata.img、ramdisk.img 等,这些是可以刷机的。
初始化编译环境
项目目录,打开终端,输入命令:
选择编译目标
命令:
输出:
编译目标格式说明
编译目标的格式:BUILD-BUILDTYPE,比如上面的 poplar-eng 的 BUILD 是 poplar,BUILDTYPE 是 eng.
什么是 BUILD
BUILD 指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境。其中 aosp(Android Open Source Project)代表 Android 开源项目;arm 表示系统是运行在 arm 架构的处理器上,arm64 则是指 64 位 arm 架构处理器,x86 则表示 x86 架构的处理器,更多设备代码和编译目标参考官方文档。
什么是 BUILDTYPE
BUILDTYPE 则指的是编译类型,通常有三种:
- user:用来正式发布到市场的版本,权限受限,如没有 root 权限,不能 dedug 等。
- userdebug:在user版本的基础上开放了 root 权限和 debug 权限。
- eng:代表 engineer,开发工程师的版本,拥有最大的权限(root等),具有额外调试工具的开发配置。
如果没有谷歌手机设备,可以选择 arm 或者 x86,我选择了 aosp_x86-eng,编译完后运行模拟器看看,因此这里选择序号 26。
开始编译
通过 make 指令进行代码编译:
其中 -jN 参数表示处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。
查看计算机上的核心数:
可看到创建的虚拟机 CPU 核心共有 4 个,那么要实现最快的编译速度,可以使用介于 make -j4 到 make -j8 之间的命令。
不出意外,当看到:#### build completed successfully (03:55:24 (hh:mm:ss)) ####
就整编成功了。
运行模拟器
整编完,网上很多都是说直接运行命令:emulator
,但是我报以下错误了:
第一个警告不管,第二个警告可以 emulator 加参数 -partition-size 2048
解决,也可以不管,最后一个折腾了很久,可以加参数-gpu off
,完整运行模拟器的命令:emulator -gpu off -partition-size 2048
,这时应该又会报:
只能重启一下才能解决。
如果编译完成后启动模拟器时卡在黑屏,可以尝试编译其他的!
emulator 还有很多参数,可以用 emulator -help
查看,参数如下:
补充
模拟器运行需要四个文件,分别是:
- Linux Kernel
- system.img
- userdata.img
- ramdisk.img
上面我 lunch 命令时选择的是 aosp_x86-eng,因此 linux 默认使用的 AOSP/prebuilds/qemu-kernel/x86/kernel-qemu 下的 kernel-qemu,而其他文件则是使用的 AOSP/out/target/product/generic_x86 目录下的 system.img、userdata.img、ramdisk.img。
单编
单编就是编译某个模块,比如 Setting,会在 out 目录对应的产品有 Settings.apk,例如:out/target/product/generic_x86/system/priv-app/Settings/Settings.apk,这是可以直接安装的。
1、source build/envsetup.sh
2、lunch
3、选择单编版本序号
4、编译
4.1、mmm
编译指定目录下的模块,但不编译它所依赖的其它模块。
4.2、mm
先进入目录:
再编译
编译当前目录下的模块,它和 mmm 一样,不编译依赖模块。
4.3、mma
编译当前目录下的模块及其依赖项。
4.4、mmma [module_path]
编译指定路径下所有模块,且包含依赖
4.5、make
make: 不带任何参数则是编译整个系统
单个模块编译,会把该模块及其依赖的其他模块一起编译,会搜索整个源代码来定位 MediaProvider 模块所使用的 Android.mk 文件,还要判断该模块依赖的其他模块是否有修改。
make snod
如果我们修改代码,想看效果,怎么办?
1、可以在编译完成后,借助 adb install -r apk路径
直接将生成的 apk 文件安装到设备上,如果不是 APK,直接 push 对应的文件。
2、可以编译好完成后,再使用make snod
,重新生成 system.img,再运行模拟器也可。