最近闲下来了一会,除了休息了一会,另外还学习了下如何编译一个完整的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包名。查看问题后查阅相关代码,找到出错原因并解决。