前言
通过flyme官方开源patchrom工具插桩,禁止转载
需要了解linux基本操作,了解基本终端命令
本人刚学插桩,这只是我插桩的一个简单流程,中间可能有错误,可提醒我更改
推荐教程
系统环境配置
- 使用系统是Ubuntu16.04 64位 VMware环境
- 系统安装不在多做介绍,百度有各种安装教程
- 推荐给硬盘分60G
编译环境配置
flyme6插桩所需要的环境如下
$sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib git flex bison gperf build-essential libncurses5-dev:i386 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev libsdl1.2-dev libesd0-dev git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip repo openjdk-8-jdk android-tools-adb
注:$符号不用输入,代表在终端输入。
由于不同系统自带环境不一样,缺少部分环境导致最后编译出现各种问题,所以推荐全部安装
同步代码
拉取flyme官方开放的插桩工具及源码
- 由于源码在github根据个人网速不一样,下载时间也不定,可能需要自备梯子
##拉取源码
建立项目文件夹 flyme 开始同步源码
$mkdir flyme
$cd flyme
$repo init --repo-url git://github.com/FlymeOS/repo.git \
-u https://github.com/FlymeOS/manifest.git \
-b marshmallow-6.0 --no-repo-verify
期间可能github可能需要你提供name和email
$git config --global user.email '你的邮箱'
$git config --global user.name '你的用户名'
然后同步代码
$repo sync --no-clone-bundle -c -j4
等待代码同步完成
如果出现网络中断或其他原因导致失败,再次执行即可
$repo sync --no-clone-bundle -c -j4
##目录解析
同步完成之后的文件夹如图
参考flyme github的解释
flyme 你之前建立的项目文件夹
+-- manifest 项目清单
+-- tutorials 教程文档
+-- plugins 扩展插件,用于扩展已有功能
+-- build 编译环境,用于构建和编译机型
+-- tools 适配工具
+-- flyme Flyme相关,内容定期更新
+-- release 官方发布的ROM包
+-- overlay 资源覆盖
+-- devices 机型目录
+-- base 官方提供的默认机型
+-- Z2121 待开发者适配的机型,这里我们在适配开始时会建立此文件夹
#选择合适的底包
新手建议用los13(cm13)做底包,因为没有各种问题,冲突也少大概只有80多个
- 基于Android 6.0
- 越稳定越好(官方包相对越稳定,插桩难度大)
- 对aosp修改越少(越接近原生,插桩难度小)
- 能root,或者刷super su
选择好合适的底包之后通过论坛上的教程刷入到自己手机
并且提取出底包中的 boot.img 和适合本机的 recovery.img (尽量使用官方的)待用
#开始插桩
##安装Beyond Compare
浏览器打开 http://www.scootersoftware.com/download.php
选择64-bit的debian
然后点击Save File,下载完成后在下载文件夹打开终端
$sudo apt install 'file'
‘flie’:刚才下载的bcompare安装文件
安装完成之后可以在所有软件里面找到bcompare,并且打开它
##初始化flyme环境
注意:每次重新打开终端都要初始化flyme运行环境
在flyme项目目录打开终端
$source build/envsetup.sh
##flyme config 拉取Makefile
在devices目录下建立机型目录Z2121,并且切换到机型目录Z2121
$cd devices
$mkdir Z2121
$cd Z2121
在手机中打开 开发者选项 > 开启调试,并且通过usb链接电脑
推荐机箱后置usb2.0接口
如果是虚拟机需要将usb设备添加到虚拟机
在终端中输入adb devices开启adb调试,并且在手机上允许调试
$adb devices
再次输入 adb devices 直到变成device就表示已经连上了
$adb devices
将之前准备好的 boot.img 和 recovery.img 放入到机型目录Z2121
终端切换到机型目录 Z2121 输入 flyme config,手机里面给adb shell root权限,开始拉取配Makefile
$flyme config
flyme config完成之后的文件截图如下
修改机型目录下面的Makefile文件
注意:所有修改都只修改自己的机型目录,不能动base目录
用bcompare比较 devices 目录下面的 base 和自己的机型目录 Z2121
打开Makefile文件
修改 romer ,和 model_romer 并且加入 device ,根据自己机型填写即可
去掉OTA前面的注释,不生成dat刷机包
保存机型目录的Makefile文件,暂时只修改这两处
##flyme newproject 拉包
终端切换至机型目录 Z2121 输入 flyme newproject 开始拉包
$flyme newproject
稍等片刻(几个小时)拉包完成
注:根据Makefile配置不同,几个反编译文件夹些许不同,其实有几个是多余的,先不管
##flyme patchall自动插桩
第一次插桩之前我们可以更新下源码,用flyme最新源码插桩(非必要),项目目录打开终端
$repo sync --no-clone-bundle -c -j4
终端在机型目录 Z2121 输入 flyme patchall 开始自动插桩,这个过程大概几十分钟吧,稍等片刻即
自动插桩完成,终端会有提示多少个冲突及冲突文件的位置
机型文件夹文件解析
Z2121 你之前建立的机型文件夹
+-- autopatch 自动插桩的产物
+-- aosp aosp部分框架层反编译之后的文件
+-- bosp bosp部分框架层反编译之后的文件
+-- reject patchall之后所有报冲突的smali文件
+-- patchall.xml patchall项目清单
...
+-- boot.img.out 厂商boot.img反编译之后的文件
+-- framework.jar.out 厂商framework.jar反编译之后的文件
+-- framework-res 厂商framework-res.apk反编译之后的文件
+-- services.jar.out 厂商services.jar反编译之后的文件
+-- telephony-common.jar.out 厂商telephony-common.jar反编译之后的文件
+-- wifi-service.jar.out 厂商wifi-service.jar反编译之后的文件
+-- vendor 拉包拉出来的厂商文件(可以暂时理解为手机根目录 /)
+-- out 输出目录
...
注意:aosp、bosp和reject这三个文件夹是用来给你对比差异的,不能修改
##手动解冲突
建议解冲突按照reject和机型目录对比一个文件一个文件解决
###入门级冲突
打开bcompare
开两个对比aosp和bosp的对比,reject和机型目录的对比
选择对比不同但不独有
先举一个修改boot的例子
通过reject和机型目录的对比看到init.environ.rc这个文件存在冲突
打开init.environ.rc首先 看到reject这一边标注出来了
<<<<<<< VENDOR
原厂的代码块
=======
Flyme的代码块
>>>>>>> BOSP
通过军华的三步骤对定调,首先是对比
打开aosp和bosp的init.environ.rc文件对比
然后定位,可以看到这个冲突只是bosp(flyme)对aosp添加了一部分,
最后调,同样我们把添加的这一部分放在我们厂商同样位置(这一行的末尾)
即解决了第一个简单的插入冲突
###通过上一个简单例子来了解插桩的原理
文字解释可能很生硬,当你去看看那些视频教程了就会知道大概了
插桩原理
即根据 bosp(flyme) 对 aosp(Android) 插入、修改、删除等操作在我们 厂商对应的文件 中做相同操作
冲突的产生
是因为flyme工具在自动帮你做上面那个 相同操作(patchall) 的时候是根据同名smali文件中的方法和上下文来插桩的,当工具发现上下文对不上、或者方法名字对不上的时候就给你报冲突了,并且把冲突用下面这种方式在reject文件中给你标记出来,
当你对比reject和机型目录的时候就很容易找到冲突位置
<<<<<<< VENDOR
原厂的代码块
=======
Flyme的代码块
>>>>>>> BOSP
冲突的解决——军华大神3步骤
注意:此位置只是工具找到的位置,不一定是正确的位置,需要你用对定调来解决
###简单的插入冲突