TPS 解决冲突
首先感谢hendy为我们带来这么强悍的框架,减少机型适配中百分之八十的重复劳动,之前开机都是一个大关,但是用TPS和新的架构开机不再是一件难事,减少我们之前的解决reject阶段,直接进入fix bug 阶段. 也许大家习惯之前的patchrom方案. 之所以叫patchrom 在我个人理解来看来是因为patchrom工具核心使用diff 和patch 命令来进行代码的插入.当然patch不可能百分百正确,才需要人力去解决冲突修复bug.小米patch我也做过,真是深恶痛绝好多重复劳动,做起来让人抓狂,让我最新欢的coron项目的patchrom ,它核心是围绕diff3命令进行的,用makefile进行流程控制,用起来真是爱不释手,工具好用只是前提,更重要的是百度云rom开发人员对代码进行重构,使reject减少,即便是冲突不用对比也能直接插入的.
在介绍新的适配方案之前首先分析下传统patchrom中的各种体力活.
- access方法错位,这个就是重复劳动,(miui并没有对access方法进行格式化,coron项目会自动access方法格式化,这是我喜欢coron的一个原因)
- id的错位,这个只是小的问题,根据开发者的熟练程度可以很容易判别什么id需要替换.但是我不喜欢看红红的一片(coron也对id进行格式化处理(很棒的功能))
- fix reject阶段,其实这个阶段主要就是对比,对寄存器进行微调.只有少数的情况需要人去判别代码的取舍(coron对代码进行重构,所以更容易插入)
新架构介绍
上面介绍传统的patchrom适配的中遇到的各种体力活,这里就介绍hendy带来的强悍架构,从原理上来讲现在适配方案已经不是patchrom了,因为从头到位都没用到diff和path命令.而是一种全新的架构.经过测试miui color都是直接开机的,其他的肯定也是不在话下的.首先介绍现在架构的优点.
- 以前百分之八十的解决冲突的时间减少,一个机型适配解决冲突个数不会超于5个.而且解决冲突也是及其简单.(但是如果解决不了就是个大坑)
- 直接开机,直接进入解决冲突阶段,以前大家习惯对比aosp和base进行修bug,在现在适配工程中解决bug也是及其少数的,解决bug就是做减法,尽量还原aosp就ok
任何事物有优点当然也存在缺点,但是比起优点,这些缺点确实不是问题.
- fix bug过程需要转变以前修bug思路,因为这已经不是patchrom.需要从代码上读懂逻辑再去修改
- 解决bug有时候很难解决的如果官方不支援的情况下.就好比以前的百度云非常容易开机 但是其中的一个坑就是音量面板,因为百度云是自己的音量面板是继承原生的音量面板的,但是现在很多UI都喜欢修改音量面板,所以这个修bug是个抓狂的事情,当然现在的tps也不例外.当碰见定制大的UI也是傻眼.
fix reject 实例
fix reject 有的情况是可以使代码生效的的,这里简单介绍两种产生rejet的两种情况.
- 函数参数比安卓原生参数多几个参数,这种reject是最好修的.今天介绍的就是这种reject解决方法.
- 函数参数变少了.. 这个应该不常见.所以直接忽略,至于为何不常见,是因为厂商对aosp修改一般都会加参数,在原来函数完成更复杂的逻辑.
- 类被继承,这就意味者你要去子类里面fix reject 和fix bug ,当然也可以干掉子类.这个难度确实挺高.在今天适配小米的过程,最为抓狂的是editor,小米把这个改的面目全非,再者是音量面板和PhoneWindowManager,这两个还好,没那么坑,干掉子类就解决这个问题.
在机型适配中见过最常见的一个冲突,就是函数参数多一个或者多个,今天就以miui color都存在的一个reject为实例来解决冲突.这个冲突的函数名字是setMobileDataEnabled(Z)V 在aosp中存在这个函数但是厂商中是setMobileDataEnabled(Ljava/lang/String;Z)V 造成无法插入.进入解决冲突前我默认大家熟悉P命名法和V命名法,如果不会请自行google.其实解决冲突就是分两步.——简单的说就是传对参数,和调对方法.下面直接进行解决冲突的实例,就不多说了,大家自行研究.
- 更改setMobileDataEnabled方法名为tos_org_setMobileDataEnabled.
增加下面一个函数
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162.method public setMobileDataEnabled(Ljava/lang/String;Z)V.locals 4.parameter "callingPackage".parameter "enabled".annotation build Landroid/annotation/TOSHook;hooktype = .enum Landroid/annotation/TOSHook$TOSHookType;->CHANGE_METHOD:Landroid/annotation/TOSHook$TOSHookType;note = "SetupFlashRom: permission part::tamrylei::2015-05-26"romtype = .enum Landroid/annotation/TOSHook$TOSRomType;->ROM:Landroid/annotation/TOSHook$TOSRomType;.end annotation.prologueconst/4 v1, 0x1.line 1894xianew-instance v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;invoke-direct {v0}, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;-><init>()V.line 1895.local v0, param:Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;iput v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->invokeType:I.line 1896iput-object p0, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->thisObject:Ljava/lang/Object;.line 1897new-array v1, v1, [Ljava/lang/Object;iput-object v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->args:[Ljava/lang/Object;.line 1898iget-object v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->args:[Ljava/lang/Object;const/4 v2, 0x0invoke-static {p2}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;move-result-object v3aput-object v3, v1, v2.line 1899const-string v1, "com.android.server.ConnectivityService#setMobileDataEnabled"invoke-static {v1, v0}, Lcom/android/internal/os/TosModulesLoader;->invoke(Ljava/lang/String;Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;)V.line 1900invoke-virtual {v0}, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->returnEarly()Zmove-result v1if-eqz v1, :cond_0.line 1904:goto_0return-void.line 1903:cond_0invoke-virtual {p0, p1,p2}, Lcom/android/server/ConnectivityService;->tos_org_setMobileDataEnabled(Ljava/lang/String;Z)Vgoto :goto_0.end method下面给出我没修改之前的的方法,大家自行对比,自行脑补,至于为神马,大家好好斟酌下 (传对参数,和调对方法)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162.method public setMobileDataEnabled(Z)V.locals 4.parameter "enabled".annotation build Landroid/annotation/TOSHook;hooktype = .enum Landroid/annotation/TOSHook$TOSHookType;->CHANGE_METHOD:Landroid/annotation/TOSHook$TOSHookType;note = "SetupFlashRom: permission part::tamrylei::2015-05-26"romtype = .enum Landroid/annotation/TOSHook$TOSRomType;->ROM:Landroid/annotation/TOSHook$TOSRomType;.end annotation.prologueconst/4 v1, 0x1.line 1894new-instance v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;invoke-direct {v0}, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;-><init>()V.line 1895.local v0, param:Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;iput v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->invokeType:I.line 1896iput-object p0, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->thisObject:Ljava/lang/Object;.line 1897new-array v1, v1, [Ljava/lang/Object;iput-object v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->args:[Ljava/lang/Object;.line 1898iget-object v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->args:[Ljava/lang/Object;const/4 v2, 0x0invoke-static {p1}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;move-result-object v3aput-object v3, v1, v2.line 1899const-string v1, "com.android.server.ConnectivityService#setMobileDataEnabled"invoke-static {v1, v0}, Lcom/android/internal/os/TosModulesLoader;->invoke(Ljava/lang/String;Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;)V.line 1900invoke-virtual {v0}, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->returnEarly()Zmove-result v1if-eqz v1, :cond_0.line 1904:goto_0return-void.line 1903:cond_0invoke-virtual {p0, p1}, Lcom/android/server/ConnectivityService;->tos_org_setMobileDataEnabled(Z)Vgoto :goto_0.end method
好了今天就写这么多..