ROM是如何做出来的flyme插桩篇

patchrom俗称插桩,需要linux环境。

开源的patchrom目前比较活跃的有miui flyme tos等,这里就写flyme的插桩

首先flyme的开源地址www.github.com/flymeos

我们先同步Flyme的源码,切换成mint系统,创建一个文件夹比如叫做flyme,在flyme文件夹下打开终端 输入

通过repo init命令的-b参数, 选择需要下载的分支。 通过repo sync命令同步远程代码:

repo init -u https://github.com/FlymeOS/manifest.git -b lollipop-5.0
repo sync -c -j

如果连接一直失败或下载代码过慢,则使用以下命令:

repo init --repo-url git://github.com/FlymeOS/repo.git \
   -u https://github.com/FlymeOS/manifest.git \
   -b lollipop-5.0 --no-repo-verify
repo sync --no-clone-bundle -c -j4

然后就要下载一两个G的文件吧 具体时间看网速了,可能晚上同步比较快。下载的时候就是这样图片7.png

同步是可以随时结束的,之后想要断点续传的时候只要进到文件夹里 输入repo sync就可以自动继续了,以后源码更新了也是用这个命令进行跟新。

下载完成后文件夹内目录是这样的

这样源码就下载完成了。之后我们要下载一个base cm(这个是干啥用的呢,别的大神用cm插成了flyme 他把他的做法分享出来,我们也用cm做flyme 这样就可以让它用base cm自动帮我们解决很多冲突,所以我们用的cm和他分享的那个cm版本越接近,我们要自己解决的冲突就越少,大多数都被应用大神的方法解决了。)

下载base cm的方法和源码差不多 这是base_cm的地址

https://github.com/FlymeOS/devices-base_cm/tree/lollipop-5.1

我们要进入flyme/devices文件夹,打开终端,运行

git clone https://git.oschina.net/FlymeOS/devices-base_cm.git --single-branch -b lollipop-5.1

或者用他网页上的那个git命令是从github上克隆下来,如果这个oschina上的失效了的话

下载完成后把多出来的这个文件夹命名成base_cm

Base cm也是会更新的,随着cm的更新可能会更换底包,如果你想让冲突最少就跟随他的底包走,使用相同版本的底包冲突应该就几个。Base cm更新要先进入devices/base cm文件夹 终端运行git pull就会自动更新了。如图

图片9.png

到这为止我们电脑上的准备工作就做好了。下一步是手机了,首先,刷一个cm 12.1现在底包用的是yog7d版本的cm12.1(不是说没有yog7d就不能做了 只要是cm12.1都可以,只是之后的冲突会多一些,其实不是cm12.1都行 5.1的就行,只是之后的冲突会多很多)然后打开开发者选项把adb调试打开,授权此台计算机调试,再把root权限打开,并且给adb root权限。

进入devices文件夹,创建一个机型的文件夹,比如moto x+1叫victara

现在要准备的是rec和boot。boot就从你刷的这个包里提取,放到目录下,rec用twrp。然后连接手机。反回到flyme文件夹,在此处打开终端,输入

source build/envsetup.sh

完成初始化(每次关闭终端之后在打开都要运行次命令 不然后面的命令就会提示没有命令之类的)

图片11.png

下一步就是进入机型目录

cd devices/victara

先生成一些配置文件 输入

 flyme config

就会发现机型目录下多出来两个文件。Makefiles和workflowwork.xml后者不用管他。主要看前者。

我们先来修改Makefiles这里的base_cm前面的#注释去掉,需要用base_cm,就开启这项功能。

这个是保留board里的文件,应该就是flyme的系统文件。如图,后面填的几项就是保留flyme的开机动画和关机动画。

如图填写,等会后面会提到这几个文件

这是表示虚拟按键的,0开启,1关闭。

再下面一段就是作者,机型之类的信息

接下来建立一个新的项目,导入底包 输入

 flyme newproject

图片17.png

出现newproject successed就说明这一步骤完成了。

图片18.png

这时候我们去用beyond compare对比base_cm和victara 把上面配置的那几个文件夹都复制过来

下面我们进行真正的插桩步骤 运行

flyme patchall
   (可以在后面加上-j4后缀,表示用4线程 速度会快一点,不过电脑会卡一些)这一步也要挺久的,具体看电脑配置

Pass就是最好的结果啦,表示已经自动插好了,都不用手动。底包好的话估计就两三个冲突要自己解,其他的都是pass。

图片20.png

这里用的是和base_cm的一样版本的cm,所以冲突很少

图片21.png

接下来就是技术含量最高的解冲突步骤

解的时候也要用到beyond compare软件。我的习惯是对比autopatch/rejcet文件夹和机型目录,红色的地方就是有冲突的了

这两个这里是这样解的

第一个比较简单

第二个注意一下仔细看一下,bosp比上面vendor多了好几个启动项,但是也少了一个。所以不能直接替换到上面,不然就是少了一启动项了,要把多出来的部分加到上面去,像这样

这样我的就解好了

关于解冲突这部分,每个人的冲突都会不一样,而且我这个基本是最简单的情况,所以关于解冲突的步骤还是要多去看看别人的方法。

B站上也有琛大(汐梦
Art_Chen
)一个教程。优酷上还有以前百度云学院的smali教程,那个比较全面,想学的可以去看看。

之后就是打包了,这一步也经常报各种各样的错误。而且编译也比较耗时间,一次十几二十分钟,具体看电脑配置。输入flyme fullota之后就开始打包了。

你可能会碰到如下错误

第一个可能会提示你缺少m4什么什么的,这个如果提示你了就要安装,不然做出来的包可能会不能安装软件,命令他会提示你的 好像是apt-get install m4 因为我安装过了就不会提示这个了。遇到这个问题是函数超量了,解决办法是把framework.jar.out下smail/android里的一些东西剪切到smaliclass2/android里一些,我把app和media剪切过去了。

然后他还可能会提示缺少ro.product.device这个要去vendor/system/build.prop里添加。我的机型叫做victara,所以我就加入ro.product.device=victara
图片26.png

加入
图片27.png

如果报其他错的话可以结合上下文分析一下,也有可能是插错了。
图片28.png

之后就去out文件夹下找到你的包,就可以刷了

如果刷不进,解压把刷机脚本第一行的验证删除,再刷一次试试。