大概三个月前,我开始了 K3-Note 的研发,既有趣也有挑战性。最后几个小问题现在也解决了。目前所有重大的问题都已经修复,是时候转到其他机种的研发。如果发现些什么或当新的安桌系统发布,我可能会回来继续。
当初答应过会编译不同的固件,我现在加入 SlimRom 来兑现。有了 LineagoOS 的基础,不出一小时,我便准备好 Slim 的编译。出来后,再加入了一些调整,便是目前的版本。本来想再加入 CarbonROM ,发现需要额外的修改(已经发布)。我手头上还有 DU,但 DU 团队早前已经收回在 xda 上发布的许可。而 OmniROM 还停留在 7.1.1_r14,我的1G硬盘也差不多满。每次都要删除大量临时档才可以编译,已经无法再下载其他 ROM 的代码。如果那一位有兴趣接棒,可以联络我,我可以从旁引导。唯一条件是 — 你必须分享你的成果。
这个帖的目的,并不是要发布某一个固件。我是希望能通过各种问题的解决方法,去启发更多人加入 K3-Note 开发。
xda-developers上的原帖: https://forum.xda-developers.com/k3-note/orig-development/rom-custom-nougat-roms-k-3-note-t3513466
当我完才手头上的工作,我决定自己尝试一下。我之前开发过 CarbonROM CR-5.1(安桌7.1.1),代码已经准备好,所以我就先用它开始。编译出来,并不困难,几次尝试,便成功编译出我的第一个 K3-Note 定制固件。心中有数,肯定还有不少问题,RILD 不启动、没有音频和GPS、照相机闪退、等等... RIL的记录是默认关闭,我以为照相机比较容易,所以首先着手解决它,很快便证明我是过分乐观。经验告诉我 CyanogenMod(CM) 通常是快一步,所以在开始时,我已经同时下载 CM 的代码。是时候转到 CM 去继续了。经过一两周,我终于编译出一个勉强可以见人的版本。自从 K3-Note 的完整内核发布后,有几位国外的朋友,经常给我私信发问。我所听到的信息是,只要找对库,照相机、音频,等等都不是问题... 对于 K3-Note 的开发,我是新丁,但经过两周的研究和尝试,我就是无法想象如如何“不是问题”。我自叹不如,也没有耐性和经验去尝试现存的所有库。因此,上载了我的 CM-14.1,让他们去尝试。悲哀的是,信箱马上安静下来,到目前为止,还没有收到对此的任何回应。
虽然,除了内核(还是被阉割的!),联想并没有提供其他源码,但也可以在网上(github那些),找到一些其他接近机种的代码。还好,所需的部分也不太多(源码当然是越多越好)。目前能找到的,都是其他机种的 LP 源码。要移植到我们的机子,并用在新两代的牛扎糖,将会是颇大的挑战。经过一番煎熬,我终于成功修复了一部分问题。本来,我是极少在初步阶段发布,但私信的查询,实在是太多。我也没有太多时间和资源,在短期内,解决所有问题。寻求他人的意见,也不是坏事。
现在,我再一次,分享一下我的经验。欢迎大家使用或分享我的代码和方法,我只要求大家 不要留一手,把你们的,也同时分享。
如果条件许可,我将会编译几个不同的定制固件。不过,不会有定期的每周或每月发布。希望这帖子能成为大家的踏脚石。
在这阶段,报错并不重要。请你们不需要重复已经提及的问题。谢谢!
现存问题:
I. 缺失的符号
解决库的符号缺失,我们可以用 shim 库,并在 init 加入 LD_PRELOAD 的定义。GCC 并不关心该符号是谁提供,只要载入,其他库便可以使用。好处是,这不用修改原来的代码。缺点是,每次呼叫 dlopen(),这个 shim 库都会被呼叫或检查一次。很明显这会增加运算、影响效率。我们的 K3-Note 的专有库,放到牛扎糖上,也会出现几个缺失的符号。非不得以,我个人是不喜欢使用 LD_PRELOAD。如果许可,我通常会在 Android.mk 加入编译标志去编译一个新档案。
CM-14.1 已经增加了一个 MTK 专用的标志 BOARD_USES_MTK_HARDWARE,定义成 true 会产生一个通用标志 MTK_HARDWARE,所有c和cpp档都能调用
我这些直接修改源码的补丁都放到 device tree,目前分成四组:
1. system_core
1.1 liblog (加入 xlog 函数 __xlog_buf_printf() 和 强制调出 RLOG, 参考下一节)
1.2 libnetutils (加入 thermal 和 RIL 所需要的几个函数)。目前还可以直接使用官方固件的库。
2. framework_av
2.1 加入一个档 mtkaudio_stubs.cpp 补充音频库缺失的符号
2.2 加入缺失的一个 CameraParameteres
2.3 在 AudioPolicy 加入 MTK 的音频属性 (Media profiles) (2016/12/17)
2.4 修复 AudioFlinger 的录音部分 (2016/12/17)
3. framework_native
3.1 加入一个兼容 MM 库的符号
4. sepolicy - 非必需
联发科技好像从来也没有认真处理过 SEPolicy。目前能见的固件,都是使用容许 (permissive)。我希望最终可以使用强制 (enforcing),因此,一开始,我都不断加入适当的 SEPolicy。
II. 无线接口层 (RIL)
工具: 要探索原因,系统记录是必需的。我在 liblog 加入了一个新的编译属性 (build.prop) "persist.ril.log" 的补丁(参考上一节的1.1)。定义成 1 将会吧 RLOG 推送到主系统记录。
1. mtkrild 的一个缺失符号
利用以上工具,我发现一个缺失符号,导致后台程序 mtkrild 挂载失败。这个符号在 libnetutils.so 里面,目前官方 MM 固件的 libnetutils.so 还可以直接调用。也可以修改 libnetutils 重新编译(能避免日后 MM 库的不兼容)。