Android编译心得

Android

Posted by MetaNetworks on October 30, 2020
本页面总访问量

最近闲下来了一会,除了休息了一会,另外还学习了下如何编译一个完整的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这些也行

总共需要两处:

可以使用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包名。查看问题后查阅相关代码,找到出错原因并解决。