1:这边不喜欢用连接手机处理,因为麻烦,虚拟机也难链接,因此我们使用OTA方法处理。
以下教程都以处理Redme2手机作为目标机。
下载网上的redme2的刷机包,用rar打开看下是否system下只有一个build.prop文件,如果是,则需要将外面的system.transfer.list system.new.dat 转换为system.img再次转为system目录结构,放置进OTA压缩包里面。
如何处理转换过程,我这边使用ROM助手处理,你也可以选择工具处理。
下载redme2的recovery.img 作为我们设计的recovery。
以上文件到时候会上传。
安装VM+ubuntu12.04 搭建环境,这个百度。
下载flymeos代码
mkdir flyme
repo init -u https://github.com/FlymeOS/manifest.git -b lollipop-5.1
repo sync
代码下载完成,我们开始操作。
mkdir -p devices/redmi2/
source ./build/envsetup.sh
cd devices/redmi2/
将我们下载的ota.zip recovery.img 复制到这里。
修改tools/config 下面的makeconfig 文件,将里面的FROM_OTA=0 改为FROM_OTA=1
flyme config
生成配置文件
flyme newproject
生成工程,解出boot.img recovery.img 解出system目录的关键jar进行反编译处理。
flyme patchall
合并处理,这里是关键,要处理冲突解决,解决完后操作
flyme fullota
生成最终的ota包,进行烧机验证。
我们主要需要完成的是patchall这个动作出错后,需要进行的插桩动作。
插桩基本要领:
新增,直接补充进来。
条件选择,需要耐心修复。
我们摘出一个fullota的一个输出片段:
aapt package -u -x -z \
\
--min-sdk-version 22 \
--target-sdk-version 22 \
--version-name builder.20160120113539_R \
-M out/obj/system/framework/framework-res/AndroidManifest.xml \
-A /home/lxm/flyme/devices/redmi2/framework-res/assets \
\
-S out/obj/system/framework/framework-res/board-res-overlay \
-S /home/lxm/flyme/devices/redmi2/framework-res/res \
-F out/obj/system/framework/framework-res.apk.tmp 1>/dev/null
可以看到编译时候是如何查找文件的,因此我们修改的文件就知道在哪里了。
这里有一个技巧可以传授下:
在使用newproject完成后,将redmi2目录备份下来。
运行patchall后,可以对比下这个目录前后的差异,这个就是自动插桩完成的情况,可以学到默认插桩的一些方法。
麻烦的地方主要是系统资源framework-res 的冲突,需要重新定义,修改出错的地方,回编测试。
主要就是id 字串,数值,对照着devices\redmi2\autopatch\bosp devices\redmi2\framework-res 去修改。
修改完后,apk回编成功,这个解决完毕。
在对应的bosp找到冲突代码,查找method 来锁定具体逻辑函数范围。
出错记录:
1:
out/obj/system/framework/android.policy.elb/smali/com/android/internal/policy/impl/PhoneWindow$DecorView.smali[4878,4] no viable alternative at input 'invoke-direct'
Exception in thread "main" brut.androlib.AndrolibException: Could not smali file: com/android/internal/policy/impl/PhoneWindow$DecorView.smali
at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilder.java:71)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:55)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:41)
at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:385)
at brut.androlib.Androlib.buildSources(Androlib.java:312)
at brut.androlib.Androlib.build(Androlib.java:295)
at brut.androlib.Androlib.build(Androlib.java:268)
at brut.apktool.Main.cmdBuild(Main.java:225)
at brut.apktool.Main.main(Main.java:84)
make[1]: *** [out/obj/system/framework/android.policy.jar] Error 161
make[1]: Leaving directory `/home/lxm/flyme/devices/redmi2'
make: *** [ota] Error 2
找到代码,
const v11, #android:attr@actionModePopupWindowStyle#t
invoke-direct {v8, v0, v13, v11}, Landroid/widget/PopupWindow;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
这里意思是l/PhoneWindow$DecorView.smali[4878,4] no viable alte 4878行第四个参数有问题。
查找和aosp对比res下的资源文件,发现缺少声明,在public.xml里面追加一行<public type="attr" name="actionModePopupWindowStyle" id="0x01010924" /> 这里id后面值跟别的不重复就行。
2:
out/obj/system/framework/framework.KPz/smali/android/content/res/Resources.smali[5937,4] Invalid register: v16. Must be between v0 and v15, inclusive.
Exception in thread "main" brut.androlib.AndrolibException: Could not smali file: android/content/res/Resources.smali
at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilder.java:71)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:55)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:41)
at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:385)
at brut.androlib.Androlib.buildSources(Androlib.java:312)
at brut.androlib.Androlib.build(Androlib.java:295)
at brut.androlib.Androlib.build(Androlib.java:268)
at brut.apktool.Main.cmdBuild(Main.java:225)
at brut.apktool.Main.main(Main.java:84)
make[1]: *** [out/obj/system/framework/framework.jar] Error 161
make[1]: Leaving directory `/home/lxm/flyme/devices/redmi2'
make: *** [ota] Error 2
这个错误很明显,参数过多。这里我们注意下,不是修改out/obj/system/framework/framework.KPz/smali/android/c 这个路径下,而是当前目录下的framework.jar.out/smali/android
Resources.smali[5937,4]
找到这里5937行,找到这个对应的函数,在前面.locals 16 发现原始版本只有.locals 12,需要重新修改这个代码。
多于15各参数不能直接去掉。
3
out/obj/system/framework/framework.ciU/smali/android/preference/PreferenceFragment.smali[599,4] no viable alternative at input 'invoke-virtual'
Exception in thread "main" brut.androlib.AndrolibException: Could not smali file: android/preference/PreferenceFragment.smali
at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilder.java:71)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:55)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:41)
at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:385)
at brut.androlib.Androlib.buildSources(Androlib.java:312)
at brut.androlib.Androlib.build(Androlib.java:295)
at brut.androlib.Androlib.build(Androlib.java:268)
at brut.apktool.Main.cmdBuild(Main.java:225)
at brut.apktool.Main.main(Main.java:84)
make[1]: *** [out/obj/system/framework/framework.jar] Error 161
make[1]: Leaving directory `/home/lxm/flyme/devices/redmi2'
make: *** [ota] Error 2
一个错误,添加属性。
出现
org.jf.util.ExceptionWithContext: Unsigned short value out of range: 66611
需要将包里面的一些移动到别的目录去
out/obj/system/framework/services.XaF/smali/com/android/server/SystemServer.smali[10,8] no viable alternative at input 'Lcom/android/server/SystemServer$FlymeInjector;'
Exception in thread "main" brut.androlib.AndrolibException: Could not smali file: com/android/server/SystemServer.smali
at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilder.java:71)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:55)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:41)
at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:385)
at brut.androlib.Androlib.buildSources(Androlib.java:312)
at brut.androlib.Androlib.build(Androlib.java:295)
at brut.androlib.Androlib.build(Androlib.java:268)
at brut.apktool.Main.cmdBuild(Main.java:225)
at brut.apktool.Main.main(Main.java:84)
make[1]: *** [out/obj/system/framework/services.jar] Error 161
make[1]: Leaving directory `/home/lxm/flyme/devices/redmi2'
make: *** [ota] Error 2
缺少一个,
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcom/android/server/SystemServer$AdbPortObserver;
Lcom/android/server/SystemServer$FlymeInjector;
}
.end annotation
Lcom/android/server/SystemServer$AdbPortObserver; 后面加,
out/obj/system/framework/services.WR5/smali/com/android/server/SystemServer.smali[3443,4] There is already a label with that name.
Exception in thread "main" brut.androlib.AndrolibException: Could not smali file: com/android/server/SystemServer.smali
at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilder.java:71)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:55)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:41)
at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:385)
at brut.androlib.Androlib.buildSources(Androlib.java:312)
at brut.androlib.Androlib.build(Androlib.java:295)
at brut.androlib.Androlib.build(Androlib.java:268)
at brut.apktool.Main.cmdBuild(Main.java:225)
at brut.apktool.Main.main(Main.java:84)
make[1]: *** [out/obj/system/framework/services.jar] Error 161
make[1]: Leaving director
label 有重复的,看代码自己删除一个即可。
ro.product.device=hammerhead
在自己的ota包里面的build.prop 需要这个值。这个值在后面升级包里面做校验用,此处我是乱写的。
用dedat out/ota/ 去解包dat文件
./tools/reverses/de-dat/make_ext4fs -T 0 -S ./devices/redmi2/out/ota/file_contexts -l 1610612736 -a system system.rimg ./devices/redmi2/out/ota/system/
./tools/reverses/de-dat/rimg2sdat system.rimg
手机终于连接上虚拟机了。
按照网上的方案,一直不行,最后发现是电脑前面的usb虚拟机不能识别。。。
然后我们将手机连接,不想使用手机里面的boot rec ,这里将makeconfig 文件注掉#prepare_boot_recovery
fullota 动作
先执行prepare_board.mk 文件内容,主要动作,将board的文件复制过来,并且将里面的boot.img recovery.img解压。
修改两个值:
ro.adb.secure=0
ro.secure=0
ro.debuggable=1
使得开机可以连接adb ,录取log
插桩老是验证机型,这里去掉
build\tools\releasetools edify_generator.py 里面注掉
def AssertDeviceCoron(self, device, devicealias=None):
if not devicealias:
import string
cmd = ('assert(getprop("ro.product.device") == "%s" ||\0'
'getprop("ro.build.product") == "%s" || \0'
'getprop("ro.product.device") == "%s" ||\0'
'getprop("ro.build.product") == "%s");' % (device, device, string.lower(device), string.lower(device)))
#lxm self.script.append(self._WordWrap(cmd))
else:
即可。
修改flyme 主题配色问题:
<style name="AlertDialog.Material" parent="@style/AlertDialog">
<item name="fullDark">@null</item>
<item name="topDark">@null</item>
<item name="centerDark">@null</item>
<item name="bottomDark">@null</item>
<item name="fullBright">@null</item>
<item name="topBright">@null</item>
<item name="centerBright">@null</item>
<item name="bottomBright">@null</item>
<item name="bottomMedium">@null</item>
<item name="centerMedium">@null</item>
<item name="layout">@layout/alert_dialog_material</item>
<item name="listLayout">@layout/select_dialog_material</item>
<item name="multiChoiceItemLayout">@layout/select_dialog_multichoice_material</item>
<item name="singleChoiceItemLayout">@layout/select_dialog_singlechoice_material</item>
<item name="listItemLayout">@layout/select_dialog_item_material</item>
<item name="progressLayout">@layout/progress_dialog_material</item>
<item name="horizontalProgressLayout">@layout/alert_dialog_progress_material</item>
</style>