flyme6 patchrom插桩从入门到放弃

xiaoxiao2021-02-28  137

前言

通过flyme官方开源patchrom工具插桩,禁止转载 需要了解linux基本操作,了解基本终端命令 本人刚学插桩,这只是我插桩的一个简单流程,中间可能有错误,可提醒我更改

推荐教程

百度云os学院相关教程了解插桩原理军华flyme公开课

系统环境配置

使用系统是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步骤

注意:此位置只是工具找到的位置,不一定是正确的位置,需要你用对定调来解决

简单的插入冲突


转载请注明原文地址: https://www.6miu.com/read-25240.html

最新回复(0)