Patchrom回编译错误解决方法

By Starstok

Patchrom回编译错误解决方法

1.

插桩回编译显示错误 Invalid register: v19. Must be between v0 and v15, inclusive.

在插入的代码上一行加入以下代码

move/from16 v16, v0

move/from16 v0, v16

move-object/from16 v1, p1

再对插入的代码进行调整

例子:

要插入的代码:

invoke-static {p1, v11}, Landroid/view/ViewConfigurationHelper;->getOverScrollDistance(Landroid/content/Context;I)I

move-result v11

回编译显示错误 Invalid register: v19. Must be between v0 and v15, inclusive.

修改后;

move/from16 v16, v0

move/from16 v0, v16

move-object/from16 v1, p1

invoke-static {v1, v0}, Landroid/view/ViewConfigurationHelper;->getOverScrollDistance(Landroid/content/Context;I)I

move-result v16

2.

插桩回编译显示错误 There is already a label with that name.

Exception in thread “main” brut.androlib.AndrolibException: Could not smali file

要对插入和没插入的代码进行对比调整,

例子:

要插入的代码:

.end local v0    # "_arg0":I
.end local v1    # "_arg1":I
:sswitch_12
const-string v4, "com.android.internal.statusbar.IStatusBar"

invoke-virtual {p2, v4}, Landroid/os/Parcel;->enforceInterface(Ljava/lang/String;)V

invoke-virtual {p2}, Landroid/os/Parcel;->readInt()I

move-result v0

.restart local v0    # "_arg0":I
invoke-virtual {p2}, Landroid/os/Parcel;->readString()Ljava/lang/String;

move-result-object v1

.local v1, "_arg1":Ljava/lang/String;
invoke-virtual {p2}, Landroid/os/Parcel;->readInt()I

move-result v4

if-eqz v4, :cond_6

sget-object v4, Landroid/os/Bundle;->CREATOR:Landroid/os/Parcelable$Creator;

invoke-interface {v4, p2}, Landroid/os/Parcelable$Creator;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;

move-result-object v2

check-cast v2, Landroid/os/Bundle;

.local v2, "_arg2":Landroid/os/Bundle;
:goto_7
invoke-virtual {p0, v0, v1, v2}, Lcom/android/internal/statusbar/IStatusBar$Stub;->setStatus(ILjava/lang/String;Landroid/os/Bundle;)V

goto/16 :goto_0

.end local v2    # "_arg2":Landroid/os/Bundle;
:cond_6
const/4 v2, 0x0

.restart local v2    # "_arg2":Landroid/os/Bundle;
goto :goto_7

修改后的代码:

.end local v0    # "_arg0":I
.end local v1    # "_arg1":I
:sswitch_stk     #对比原厂的代码发现要修改的地方,修改后回编译
const-string v4, "com.android.internal.statusbar.IStatusBar"

invoke-virtual {p2, v4}, Landroid/os/Parcel;->enforceInterface(Ljava/lang/String;)V

invoke-virtual {p2}, Landroid/os/Parcel;->readInt()I

move-result v0

.restart local v0    # "_arg0":I
invoke-virtual {p2}, Landroid/os/Parcel;->readString()Ljava/lang/String;

move-result-object v1

.local v1, "_arg1":Ljava/lang/String;
invoke-virtual {p2}, Landroid/os/Parcel;->readInt()I

move-result v4

if-eqz v4, :cond_6

sget-object v4, Landroid/os/Bundle;->CREATOR:Landroid/os/Parcelable$Creator;

invoke-interface {v4, p2}, Landroid/os/Parcelable$Creator;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;

move-result-object v2

check-cast v2, Landroid/os/Bundle;

.local v2, "_arg2":Landroid/os/Bundle;
:goto_stk     #仍然出现[错误行数的上一行,4] There is already a label with that name.修改此处后回编译
invoke-virtual {p0, v0, v1, v2}, Lcom/android/internal/statusbar/IStatusBar$Stub;->setStatus(ILjava/lang/String;Landroid/os/Bundle;)V

goto/16 :goto_0

.end local v2    # "_arg2":Landroid/os/Bundle;
:cond_stk     #仍然出现[错误行数的上一行,4] There is already a label with that name.修改此处后回编译
const/4 v2, 0x0

.restart local v2    # "_arg2":Landroid/os/Bundle;
goto :goto_7