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>