Как добавить новый идентификатор ресурса для отрисовки в приложении, декомпилированном apktool? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь внедрить просмотр изображений в smali-код декомпилированного apk.Но для drawable, используемого imageview, нужен собственный уникальный идентификатор ресурса.До сих пор мне не удалось добавить новый идентификатор ресурса без получения ошибок сборки из apktool.Любая помощь будет принята с благодарностью.Вот шаги, которые я предпринял:

Шаг 1:

Найдите последний идентификатор ресурса в файле public.xml.В моем случае: <public type="menu" name="search_item_minioverflow" id="0x7f0d0003" />.

Преобразование идентификатора из шестнадцатеричного кода в текст, это дает мне следующее: 2131558403 .Увеличьте число на 1 и преобразуйте его в шестнадцатеричное: 0x7f0d0004 .

Шаг 2:

Вставьте новый ресурс с увеличенным идентификатором: <public type="drawable" name="cross" id="0x7f0d0004" /> в файле public.xml.

Шаг 3:

Вставьте новое статическое поле с увеличенным идентификатором: .field public static final cross:I = 0x7f0d0004 в R $ Drawable.файл smali.

Наконец:

Я пытаюсь собрать декомпилированный apk с помощью apktool, но получаю следующую ошибку сборки:

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

1 Ответ

0 голосов
/ 10 октября 2018

Вы не должны найти последний идентификатор ресурса, но последний идентификатор ресурса того типа, который вы хотите добавить.Вы увеличили значение 1 до идентификатора ресурса меню.

Вы не можете просто использовать любой идентификатор ресурса для любого типа ресурса.3-я и 4-я цифры идентификатора (после x) представляют тип.Например, в вашем проекте, по крайней мере, 0d для типа меню, в то время как 02 для типа рисования.

Вместо этого ищите последний идентификатор типа "drawable" в вашей общедоступной.xml (будьте осторожны, они не упорядочены по возрастанию) и вместо этого добавьте 1 к этому.Это должно быть 0x7f02xxxx + 1.

...