每当我闲下来时不发Rom时,就会整理一下思路,发发教程啥的,我觉得能带动机油们自己打造、改造Rom,共同提升,才是Romer的追求。
Rom也好,教程也好,我的宗旨是不设回复可见,如果你觉得好,回复或者评分鼓励一下,我就很开心了
不过这样做的一个遗憾就是我的帖子通常回复率不够高,沉得快

好了,闲话少说,上教程。
注:可能你会觉得文字教程比较干枯,不够形象生动,但是请精心看,我会尽量讲得具体、清晰

首先,我并不算是移植高手,这个教程只是我在自己移植过程中的的一些收获体会,一些经验之谈
如果你觉得有什么不对或值得改进的地方,欢迎和我交流,我们一起来完善这个教程。
因为移植所涉及的机型、配置相当多变和复杂,所以我无法讲具体细节,只能讲大致的原则
可以结合我移植U8800+JoyOSU8860的例子作为参考进行理解。


我把这些原则抽象出来,命名为Rom移植5步法,具有一定的通用性。

Rom移植的方向有 正向 逆向 之分:
正向的做法通常就是,个目标机型的底包,然后把要移植的包的appframework提取出来替换进去。
这样的优点是改动无需太大,非常快捷;缺点是经常因为一些bin下的程序或者库文件的差异而导致成功率不够高。
逆向的做法是,拿要移植的包作为底包,把目标机型的内核、wifi驱动、传感器库文件、配置文件等替换进去。
这样做要复杂一些,需要准确两个包的差异,知道应该改哪里;
优点自然是不成则已,一旦移植成功能最大限度地发挥Rom性能,因为框架、程序与底层的契合度要比正向法好。
我这个教程以逆向法为例

另外,Rom移植有风险,刷机测试需谨慎,如有本人操作不当导致出现任何问题,本人概不负责

Rom移植5步法:
1.Rom移植涉及的东西比较偏底层,所以在移植之前必须清楚目标机型的硬件配置,分区结构
这里的配置不是说主频多少、内存多少,这两个参数基本上不会影响移植的进行。
对于移植,最关键的因素是主板平台,通常采用同一系列的cpu的不同机型的Rom移植的成功率要高很多。
比如,U8800+U8860均是高通8255处理器,虽然主频不一样,但它们却同属于同样的MSM7x30平台。
他们之间的互相移植,绝对要比与MSM7K平台的中兴V880互相移植来的容易得多。
至于为什么要弄清分区结构,会在下面讲到。
所以,5步法的第一步就是弄清楚自己目标机型的配置,从而选定一个合适的Rom源包
同时,也必须一个或多个目标机型上能用的合适的底包,尽量与源包同源或者属于同一An
droid版本。

例:我要移植JoyOS到华为荣耀U8860,在对比配置和分区结构后选择了华为U8800+JoyOS包作为Rom源包。
由于JoyOS也是基于CM7修改的,所以我的底包是U8860CM7.2,同时也把华为官方的B876拿出来作为参考。
为什么选U8800+,而不选U8800
因为U+采用和荣耀一样的wifi芯片,接口均为eth0,而U8800的却是wlan0,自然用U+会省下不少麻烦。

2.第一步里你已经了解了两款机型配置的相同或相近之处,这一步则相反,我们需要出二者的不同之处。
这样做的目的是为了知道我们到底需要改动什么来使一款机器的包能在另一款上使用
首先,二者的底层硬件驱动会有所不同,我们通常都是直接替换内核来解决这个问题,即boot.img
有时,还需要system/bin文件夹里添加必要的程序和服务
system/usr下的key打头的两个文件夹是按键配置相关的,通常也需要替换。
其次,二者的传感器通常会有所差别,system/lib/hw目录下的库文件都是传感器等相关的。
再次,system/etc文件夹下放置着许多的系统配置文件。
我们需要关注的文件或文件夹通常有 bluetoothfirmwarepermissions wifi 四个文件夹(如果有的话)
还有f(G大脚本的配置文件)l(媒体配置文件)vold.fstab(存储分区配置文件)。
最后,再检查一下system目录下是否还有vendorwifi文件夹。
上述不同的地方,通常就先对比,如有不同,就需要我们用目标机型的替换之

例:U8800+的平台主板一致,内核可以通用,无需替换。
bin下需要添加 akmd8975 蓝牙芯片相关服务,hdmid HDMI输出服务(非必要)等,这里要同时参考底包和官方包。
弄清这些程序或服务的名字的最好办法是解开关官方的boot.img,看注释。
system/lib/hw 下的传感器库文件有差异,删掉带u8800名称的,用来自u8860CM的相应文件替换。
此时也可以参考一下官方包中此文件夹的内容。
二者 wifi 安卓系统下载芯片一致,system下的vendorwifi文件夹无需替换(这就是我为什么选U+,而不选U8800的原因)
system/usr下的按键配置文件一致,无需替换。
etc下的bluetoothfirmwarewifi一致,无需替换。
f文件不一致,U+1G主频,荣耀是1.4,需要替换。
l不一致,U+无前置摄像头,荣耀有,需要替换。
vold.fstab一致,二者均有内部存储分区和sd,而且挂载点也是一致的,无需替换。
以上操作,建议用 beyond compare 程序进行对比,能用文本编辑器打开的简单文件也可肉眼比对。
出差异,如有不同,替换即可。

3.经过上面两步,该相近或者相同的地方我们已经利用了,不同的关键之处我们已经修改为
相同了。
原则上应该差不多完成了,接下来要检查和修改的有两处。
build.prop 机型改过来,其他必要的参数改过来,前提是你要熟稔这些参数是干什么的,否则暂时只改机型就够了。
刷机脚本 ,第一步我们说到要了解机子的分区结构,刷机脚本内含分区挂载和格式化的命令
不同厂商的不同机型的分区结构是不一样的,而且还一般不能做修改。
买台电脑回家,我们可以自己任意分区,重装系统,手机却不能这样
如果分区结构不同,而刷机脚本不做修改,将不该改动的分区挂载并修改了的话,等着变砖吧
我举个例子:
华为荣耀的分区结构是 /dev/block/mmcblk0p1 .cust_backup 分区,boot.img在这里
/dev/block/mmcblk0p6 cache 分区
/dev/block/mmcblk0p12 system 分区
/dev/block/mmcblk0p13 data 分区
如果你用文本编辑器(记事本也可以)打开system/etc下的vold.fstab,会看到
dev_mount emmc /HWUserData 14 /devices/platform/msm_sdcc.2/mmc_host/mmc0 内部SD
dev_mount sdcard /mnt/sdcard auto /devices/platform/msm_sdcc.4/mmc_host/mmc2 SD
其他分区暂不需要关注。
华为荣耀的分区和U8800+是一致的,二者Rom可以互刷而不会变砖,只是功能会不完善,所以才要移植

三星i9100的分区结构则是
/dev/block/mmcblk0p9 system
dev/block/mmcblk0p7 cache
/dev/block/mmcblk0p10 data
假如你要把三星i9100rom刷进荣耀(或者你移植i9100rom而不修改刷机脚本)的话,那么,惨了。。。
你把荣耀的/dev/block/mmcblk0p9分区给格式化,把rom刷写进去了,结果自然是变砖了。
这就是我在 这个帖子 里写下下面这段话的原因。

assert(getprop("ro.product.device") == "blade" || getprop("ro.build.product") == "blade" || getprop("ro.product.board") == "blade");
获取手机信息,验证你的手机到底是不是V880,否则将无法刷入。
这是为了防止让一些其他机型的小白误刷咱们V880Rom从而发生变砖的惨剧。
不加这行的Rom所有机型都可以刷入,建议Rom同行或者补丁制作者们一定要加上,人性化关怀
当然,你不加这些,但在补丁或Rom发布时仔细说明适用机型的话也是可以的。

4.接下来就是测试了,一般如果内核与库文件、库文件与上层框架兼容的话,至少能开机。
如果卡第一屏了,分析原因,一点点排查,看脚本有无问题,看内核是否的确已经替换,看传感器等库文件是否合理替换...
失败并不可拍,怕的就是没有正视失败,重头再来的勇气

5.如果能成功进入系统,最后就是要一点点地完善了。
如声音不正常那个,可更换system/lib下声音相关的库文件;
相机不正常,同样是这个目录下的有关文件;
这个过程要遵循单一变量原则,一次性尽可能只改动你确定的一点点,否则你无法确定到底是哪出修改发挥了作用。
遇见最多的自然是wifi、蓝牙、相机、信号等问题。
这时要善于利用手边的rom,尤其是别人已经在本机型或相近机型移植成功的包。
看看他们是怎么修改的,或者能联系到Rom作者本人,向他们咨询那是最好的。
能开机进入系统是移植成功的第一步,真正好需要完善的东西是上层的应用,这是后话。

例如:JoyOS没做过500万以上像素的机型,所以,移植过来的相机的参数设置最大只能500万,囧。。。
这时只好用cm或者mq的的相机替换了。