Android 如何在apktool反编译的应用程序中为drawable添加新的资源标识符?

Android 如何在apktool反编译的应用程序中为drawable添加新的资源标识符?,android,android-drawable,android-resources,smali,Android,Android Drawable,Android Resources,Smali,我正在尝试将imageview注入到反编译的apk的smali代码中。但是imageview使用的drawable需要它自己的唯一资源标识符。到目前为止,我没有成功地添加新的资源标识符,也没有从apktool获得构建错误。任何帮助都将不胜感激。以下是我采取的步骤: 第1步: 在public.xml文件中查找最后一个资源id。 就我而言: 将id从十六进制转换为文本,这给了我以下信息:2131558403。 将数字增加1,并将其转换回十六进制:0x7f0d0004 第二步: 将id递增的新资源粘贴

我正在尝试将imageview注入到反编译的apk的smali代码中。但是imageview使用的drawable需要它自己的唯一资源标识符。到目前为止,我没有成功地添加新的资源标识符,也没有从apktool获得构建错误。任何帮助都将不胜感激。以下是我采取的步骤:

第1步:

在public.xml文件中查找最后一个资源id。 就我而言:

将id从十六进制转换为文本,这给了我以下信息:2131558403。 将数字增加1,并将其转换回十六进制:0x7f0d0004

第二步:

将id递增的新资源粘贴到public.xml文件中:

第三步:

将id递增的新静态字段粘贴到R$drawable.smali文件中:
.field public static final cross:I=0x7f0d0004

最后:

我尝试使用apktool构建反编译的apk,但收到以下构建错误:

res\values\public.xml:986: error: Public resource drawable/cross has conflicting type codes for its public identifiers (0x2 vs 0xd).
    W:
    brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\user\AppData\Local\Temp\brut_util_Jar_6742820997882567173.tmp, p, --forced-package-id, 127, --min-sdk-version, 14, --target-sdk-version, 25, --version-code, 111, --version-name, 5.2.1, --no-version-vectors, -F, C:\Users\user\AppData\Local\Temp\APKTOOL3513689331380739071.tmp, -0, arsc, -0, png, -0, arsc, -I, C:\Users\user\AppData\Local\Temp\1.apk, -S, C:\Users\user\Desktop\tune\res, -M, C:\Users\user\Desktop\tune\AndroidManifest.xml]
编辑:这是正在注入的smali代码,它在apk中正常运行,它取自:

.method public showDialog()V
    .locals 6

    .line 92
    new-instance v0, Landroid/widget/RelativeLayout;

    invoke-virtual {p0}, Lcom/example/MainActivity;->getApplicationContext()Landroid/content/Context;

    move-result-object v1

    invoke-direct {v0, v1}, Landroid/widget/RelativeLayout;-><init>(Landroid/content/Context;)V

    .line 93
    .local v0, "overlay":Landroid/widget/RelativeLayout;
    new-instance v1, Landroid/widget/RelativeLayout$LayoutParams;

    const/4 v2, -0x1

    invoke-direct {v1, v2, v2}, Landroid/widget/RelativeLayout$LayoutParams;-><init>(II)V

    .line 94
    .local v1, "params":Landroid/widget/RelativeLayout$LayoutParams;
    invoke-virtual {v0, v1}, Landroid/widget/RelativeLayout;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V

    .line 95
    const/4 v2, 0x0

    invoke-virtual {v0, v2}, Landroid/widget/RelativeLayout;->setBackgroundColor(I)V

    .line 96
    invoke-virtual {v0, v2}, Landroid/widget/RelativeLayout;->setClickable(Z)V

    .line 97
    invoke-virtual {v0, v2}, Landroid/widget/RelativeLayout;->setFocusable(Z)V

    .line 99
    new-instance v3, Landroid/widget/ImageView;

    invoke-virtual {p0}, Lcom/example/MainActivity;->getApplicationContext()Landroid/content/Context;

    move-result-object v4

    invoke-direct {v3, v4}, Landroid/widget/ImageView;-><init>(Landroid/content/Context;)V

    .line 100
    .local v3, "cross":Landroid/widget/ImageView;
    const v4, 0x7f060055

    invoke-virtual {v3, v4}, Landroid/widget/ImageView;->setImageResource(I)V

    .line 102
    new-instance v4, Landroid/widget/RelativeLayout$LayoutParams;

    const/4 v5, -0x2

    invoke-direct {v4, v5, v5}, Landroid/widget/RelativeLayout$LayoutParams;-><init>(II)V

    move-object v1, v4

    .line 103
    const/16 v4, 0xb

    invoke-virtual {v1, v4}, Landroid/widget/RelativeLayout$LayoutParams;->addRule(I)V

    .line 104
    invoke-virtual {v3}, Landroid/widget/ImageView;->getDrawable()Landroid/graphics/drawable/Drawable;

    move-result-object v4

    invoke-virtual {v4}, Landroid/graphics/drawable/Drawable;->getIntrinsicHeight()I

    move-result v4

    div-int/lit8 v4, v4, 0x2

    invoke-virtual {v3}, Landroid/widget/ImageView;->getDrawable()Landroid/graphics/drawable/Drawable;

    move-result-object v5

    invoke-virtual {v5}, Landroid/graphics/drawable/Drawable;->getIntrinsicWidth()I

    move-result v5

    div-int/lit8 v5, v5, 0x2

    rsub-int/lit8 v5, v5, 0x50

    invoke-virtual {v1, v2, v4, v5, v2}, Landroid/widget/RelativeLayout$LayoutParams;->setMargins(IIII)V

    .line 105
    invoke-virtual {v3, v1}, Landroid/widget/ImageView;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V

    .line 107
    invoke-virtual {v0, v3}, Landroid/widget/RelativeLayout;->addView(Landroid/view/View;)V

    .line 109
    new-instance v2, Landroid/app/Dialog;

    const v4, 0x1030010

    invoke-direct {v2, p0, v4}, Landroid/app/Dialog;-><init>(Landroid/content/Context;I)V

    .line 110
    .local v2, "topDialog":Landroid/app/Dialog;
    invoke-virtual {v2, v0}, Landroid/app/Dialog;->setContentView(Landroid/view/View;)V

    .line 111
    invoke-virtual {v2}, Landroid/app/Dialog;->show()V

    .line 113
    return-void
.end method
.method public showDialog()V
.本地人6
.第92行
新实例v0,Landroid/widget/RelativeLayout;
调用虚拟{p0},Lcom/example/MainActivity;->getApplicationContext()Landroid/content/Context;
移动结果对象v1
调用直接{v0,v1},Landroid/widget/RelativeLayout;->(Landroid/content/Context;)V
.第93行
.本地v0,“覆盖”:Landroid/widget/RelativeLayout;
新实例v1,Landroid/widget/RelativeLayout$LayoutParams;
常量/4 v2,-0x1
调用直接{v1,v2,v2},Landroid/widget/RelativeLayout$LayoutParams;->(二) 五
.第94行
.local v1,“params”:Landroid/widget/RelativeLayout$layoutparms;
调用虚拟{v0,v1},Landroid/widget/RelativeLayout;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V
.第95行
常数/4 v2,0x0
调用虚拟{v0,v2},Landroid/widget/RelativeLayout;->挫折背景色(I)V
.第96行
调用虚拟{v0,v2},Landroid/widget/RelativeLayout;->可点击设置(Z)V
.第97行
调用虚拟{v0,v2},Landroid/widget/RelativeLayout;->可调焦距(Z)V
.第99行
新实例v3,Landroid/widget/ImageView;
调用虚拟{p0},Lcom/example/MainActivity;->getApplicationContext()Landroid/content/Context;
移动结果对象v4
调用直接{v3,v4},Landroid/widget/ImageView;->(Landroid/content/Context;)V
.第100行
.localv3,“交叉”:Landroid/widget/ImageView;
常数v4,0x7f060055
调用虚拟{v3,v4},Landroid/widget/ImageView;->setImageResource(I)V
.第102行
新实例v4,Landroid/widget/RelativeLayout$LayoutParams;
常数/4 v5,-0x2
调用直接{v4,v5,v5},Landroid/widget/RelativeLayout$LayoutParams;->(二) 五
移动对象v1、v4
.第103行
常量/16 v4,0xb
调用虚拟{v1,v4},Landroid/widget/RelativeLayout$LayoutParams;->添加规则(I)V
.第104行
调用虚拟{v3},Landroid/widget/ImageView;->getDrawable()Landroid/graphics/drawable/drawable;
移动结果对象v4
调用虚拟{v4},Landroid/graphics/drawable/drawable;->getIntrinsicHeight()I
移动结果v4
div int/lit8 v4,v4,0x2
调用虚拟{v3},Landroid/widget/ImageView;->getDrawable()Landroid/graphics/drawable/drawable;
移动结果对象v5
调用虚拟{v5},Landroid/graphics/drawable/drawable;->getIntrinsicWidth()I
移动结果v5
div int/lit8 v5、v5、0x2
rsub int/lit8 v5、v5、0x50
调用虚拟{v1,v2,v4,v5,v2},Landroid/widget/RelativeLayout$LayoutParams;->设定利润率(IIII)V
.第105行
调用虚拟{v3,v1},Landroid/widget/ImageView;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V
.第107行
调用虚拟{v0,v3},Landroid/widget/RelativeLayout;->addView(Landroid/view/view;)V
.第109行
新实例v2,Landroid/app/Dialog;
常数v4,0x1030010
调用直接{v2,p0,v4},Landroid/app/Dialog;->(Landroid/content/Context;I)V
.第110行
.local v2,“topDialog”:Landroid/app/Dialog;
调用虚拟{v2,v0},Landroid/app/Dialog;->setContentView(Landroid/view/view;)V
.第111行
调用虚拟{v2},Landroid/app/Dialog;->show()V
.第113行
退票无效
.结束方法

您不应该找到最后一个资源ID,而是要添加类型的最后一个资源ID。您将菜单的资源ID增加1

您不能只对任何资源类型使用任何资源ID。ID的第3位和第4位(在
x
之后)表示类型。例如,在您的项目中,至少,
0d
用于菜单类型,而
02
用于可绘制类型


相反,在public.xml中查找类型为“drawable”的最后一个ID(注意,它们不是按递增顺序排列的),而是向该ID添加1。它应该是
0x7f02xxxx
+1。

您不应该找到最后一个资源ID,而是要添加类型的最后一个资源ID。您将菜单的资源ID增加1

您不能只对任何资源类型使用任何资源ID。ID的第3位和第4位(在
x
之后)表示类型。例如,在您的项目中,至少,
0d
用于菜单类型,而
02
用于可绘制类型


相反,在public.xml中查找类型为“drawable”的最后一个ID(注意,它们不是按递增顺序排列的),而是向该ID添加1。它应该是
0x7f02xxxx
+1。

是的,现在正在建造!谢谢你的快速回复。但是我的图像视图仍然没有显示。我是否还需要采取其他步骤来创建新的资源id?我注入的其他视图工作正常,只有资源id为的imageview给我带来了麻烦