TPS 解决冲突

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.其实解决冲突就是分两步.——简单的说就是传对参数,和调对方法.下面直接进行解决冲突的实例,就不多说了,大家自行研究.


  1. 更改setMobileDataEnabled方法名为tos_org_setMobileDataEnabled.
  2. 增加下面一个函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    .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
    .prologue
    const/4 v1, 0x1
    .line 1894xia
    new-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 1896
    iput-object p0, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->thisObject:Ljava/lang/Object;
    .line 1897
    new-array v1, v1, [Ljava/lang/Object;
    iput-object v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->args:[Ljava/lang/Object;
    .line 1898
    iget-object v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->args:[Ljava/lang/Object;
    const/4 v2, 0x0
    invoke-static {p2}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
    move-result-object v3
    aput-object v3, v1, v2
    .line 1899
    const-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 1900
    invoke-virtual {v0}, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->returnEarly()Z
    move-result v1
    if-eqz v1, :cond_0
    .line 1904
    :goto_0
    return-void
    .line 1903
    :cond_0
    invoke-virtual {p0, p1,p2}, Lcom/android/server/ConnectivityService;->tos_org_setMobileDataEnabled(Ljava/lang/String;Z)V
    goto :goto_0
    .end method
  3. 下面给出我没修改之前的的方法,大家自行对比,自行脑补,至于为神马,大家好好斟酌下 (传对参数,和调对方法)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    .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
    .prologue
    const/4 v1, 0x1
    .line 1894
    new-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 1896
    iput-object p0, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->thisObject:Ljava/lang/Object;
    .line 1897
    new-array v1, v1, [Ljava/lang/Object;
    iput-object v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->args:[Ljava/lang/Object;
    .line 1898
    iget-object v1, v0, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->args:[Ljava/lang/Object;
    const/4 v2, 0x0
    invoke-static {p1}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
    move-result-object v3
    aput-object v3, v1, v2
    .line 1899
    const-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 1900
    invoke-virtual {v0}, Lcom/android/internal/os/TosPlugMethod$MethodPlugParam;->returnEarly()Z
    move-result v1
    if-eqz v1, :cond_0
    .line 1904
    :goto_0
    return-void
    .line 1903
    :cond_0
    invoke-virtual {p0, p1}, Lcom/android/server/ConnectivityService;->tos_org_setMobileDataEnabled(Z)V
    goto :goto_0
    .end method

好了今天就写这么多..