最近闲下来了一会,除了休息了一会,另外还学习了下如何编译一个完整的AOSP(Android 10)项目,并添加人脸解锁功能~耗时一周,网上几乎没啥资料,自己摸索后总结一下呜呜呜…
以Mokee (MK100)为例,Dipper(小米8)为开发机进行说明
下载源代码
1.下载repo可执行文件
安卓使用repo工具组织项目,并提供并行fetch、checkout功能。
此处引用Mokee Github的Git-repo仓库:repo文件
下载后导入任意一个可执行文件路径(/usr/bin、/bin等)
2.下载各源代码仓库
repo会在当前路径下生成.repo文件夹,里面存放着所有索引到的仓库名。
注:如果有自己导入的包,可以在
.repo/manifests/xxx.xml中进行导入
以魔趣为例:
1
2
repo init -u https://github.com/MoKee/android -b mkq-mr1 --depth 1
repo sync
- 作为一个编译用户来说,
--depth=1只会获取最近一次提交,大大减小本地占用大小 mkq-mr1为mokee/android仓库定义的Android 10分支repo sync较为耗时,完成后会把整个仓库拉出来,需要100GB空间左右
添加人脸解锁功能
注:多翻各大AOSP项目的Gerrit!会有很大收获!
1.依赖人脸解锁插件
安卓10官方阉割了支持的人脸解锁,取而代之的是motorola开发的faceunlock插件,插件仓库使用pixel experience中提供的
先在.repo/manifessts/snippets/mokee.xml定义远程源:
1
2
3
4
<remote name="pixel"
fetch="https://github.com/PixelExperience"
revision="ten"
review="gerrit.pixelexperience.org" />
在下方定义project源:
1
<project path="external/motorola/faceunlock" name="external_motorola_faceunlock" remote="pixel" />
path为本地路径name为远程仓库名- 若要指定具体分支,使用
revision参数指定
2.修改部分人脸相关系统文件
此处不建议直接手改代码,而是查阅各大项目的代码审查网站下载patch文件,如下图:

下载后使用
1
base64 --decode xxx.base64 > xxx
将其进行base64解码
当然使用Cherry Pick这些也行
总共需要两处:
- 在设置中添加人脸解锁入口:Port face unlock feature-1
framework/base修改FaceManager等:Port face unlock feature-2
可以使用git apply/am进行打补丁,但建议使用git am指令进行合并,am可以在合并完成个自动创建commit。
若合并后有文件冲突,am会自动暂停并告知冲突文件,解决冲突后,可使用git am --continue继续合并。若不想改了,则执行git am --abort放弃本次合并
编译魔趣AOSP
编译的话,加上上面的源码,总共至少需要200G空间
1.lunch配置机型文件
以dipper(小米8)为例,生成一个类似于MIUI开发版的ROM指令为:
1
lunch mokee_dipper-userdebug
若本地还🈚️小米8的设备配置文件、内核等,会调用内核
上述指令通常会在device/xiaomi/dipper/AndroidProducts.mk中定义

其中编译类型有以下区别:
| user | userdebug | eng |
|---|---|---|
| 仅安装标签为 user 的模块 | 安装标签为 user、debug 的模块 | 安装标签为 user、debug、eng 的模块 |
| 设定属性 ro.secure=1,打开安全检查功能 | 设定属性 ro.secure=1,打开安全检查功能 | 设定属性 ro.secure=0,关闭安全检查功能 |
| 设定属性 ro.debuggable=0,关闭应用调试功能 | 设定属性 ro.debuggable=1,启用应用调试功能 | 设定属性 ro.debuggable=1,启用应用调试功能 |
| 设定属性 ro.kernel.android.checkjni=1,启用 JNI 调用检查 | ||
| 默认关闭 adb 功能 | 默认打开 adb 功能 | 默认打开 adb 功能 |
| 打开 Proguard 混淆器 | 打开 Proguard 混淆器 | 关闭 Proguard 混淆器 |
| 打开 DEXPREOPT 预先编译优化 | 打开 DEXPREOPT 预先编译优化 | 关闭 DEXPREOPT 预先编译优化 |
2. 编译
若lunch没遇到什么问题,可执行
1
mka bacon
进行编译,若一切顺利,则会在out/target/product/dipper下生成MK100xxx.zip文件。将其通过adb sideload或者adb push xxx.zip /sdcard导入手机后进行刷机。
建议内存大小为16G以上
遇到的问题
1. lunch下载机型文件在“下载了device文件还未下载vendor或者kernel”时中断后,再次lunch发现不下载了
解决方法:使用repo sync path/to/vendor_or_kernel直接进行手动同步
2.编译时报错但看不出错误

解决方法:使用mka bacon -j1单线程执行,方便查看
3.刷机后发现xxx功能不正常
之前还想集成双行通知栏的代码,后来发现导入后锁屏解不开了
解决方法:使用adb shell进入手机终端,使用su获取root权限,执行logcat | grep (功能),如果是系统问题则一般为AndroidRuntime,如果是具体app的话就换成app包名。查看问题后查阅相关代码,找到出错原因并解决。