通过flyme官方开源patchrom工具插桩,禁止转载 需要了解linux基本操作,了解基本终端命令 本人刚学插桩,这只是我插桩的一个简单流程,中间可能有错误,可提醒我更改
推荐教程
百度云os学院相关教程了解插桩原理军华flyme公开课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 (尽量使用官方的)待用
浏览器打开 http://www.scootersoftware.com/download.php 选择64-bit的debian 然后点击Save File,下载完成后在下载文件夹打开终端
$sudo apt install 'file'‘flie’:刚才下载的bcompare安装文件
安装完成之后可以在所有软件里面找到bcompare,并且打开它
注意:每次重新打开终端都要初始化flyme运行环境
在flyme项目目录打开终端
$source build/envsetup.sh在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 configflyme config完成之后的文件截图如下
修改机型目录下面的Makefile文件
注意:所有修改都只修改自己的机型目录,不能动base目录
用bcompare比较 devices 目录下面的 base 和自己的机型目录 Z2121 打开Makefile文件
修改 romer ,和 model_romer 并且加入 device ,根据自己机型填写即可
去掉OTA前面的注释,不生成dat刷机包
保存机型目录的Makefile文件,暂时只修改这两处
终端切换至机型目录 Z2121 输入 flyme newproject 开始拉包
$flyme newproject稍等片刻(几个小时)拉包完成
注:根据Makefile配置不同,几个反编译文件夹些许不同,其实有几个是多余的,先不管
第一次插桩之前我们可以更新下源码,用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步骤
注意:此位置只是工具找到的位置,不一定是正确的位置,需要你用对定调来解决