【问题标题】:how to access resources (R.class) after apk to jar conversionapk到jar转换后如何访问资源(R.class)
【发布时间】:2015-01-19 16:12:18
【问题描述】:

我有一个 apk 文件。我使用 dex2jar 工具将其转换为 jar 文件以获得 jar 文件。我用java反编译器打开了jar文件。在代码(mainactivity.java)中有一段类似的代码

ContentValues localContentValues = new ContentValues();
localContentValues.put("title", "testtesttest");
localContentValues.put("url", getApplicationContext().getString(2131034115));
localContentValues.put("bookmark", Integer.valueOf(1));
getContentResolver().insert(Browser.BOOKMARKS_URI, localContentValues);

这实际上意味着什么以及我如何使用 java 反编译器获得 getApplicationContext().getString(2131034115) 的实际值。反编译后没有.xml等资源文件。 R.java 包含类似

的信息
public static final class string
  {
    public static final int action_settings = 2131034114;
    public static final int app_name = 2131034112;
    public static final int baseurl = 2131034115;
    public static final int hello_world = 2131034113;
  }

baseurl的实际字符串值是多少?

【问题讨论】:

    标签: java android


    【解决方案1】:

    使用APKTOOL反编译后

    转到生成反编译文件的输出文件夹,

    在该文件夹中,打开 ./res/values/public.xml 文件。在文件中,您将获得所有资源的十六进制代码及其字符串格式的 ID。

    谢谢。

    【讨论】:

    • 欢迎来到 Stackoveflow。您是否介意更多地扩展您的答案,让其他程序员了解它如何帮助解决问题。
    【解决方案2】:

    根据您想要完成的任务,您可能会采取两条路径:

    您已经使用的那个,即将 Dalvik 字节码 (dex) 反编译成可读的 Java 源代码。下一步是使用jd-gui。生成的源代码有助于阅读和理解应用程序的功能,但可能不会生成 100% 可用的代码。换句话说,你可以阅读源代码,但你不能真正修改和重新打包它。请注意,如果源代码已被 proguard 混淆,则生成的源代码将更难解开。

    另一个主要的替代方法是将字节码反汇编为smali,这是一种专门为此目的而设计的汇编语言。我发现最简单的方法是使用apktool。一旦你安装了 apktool,你可以将它指向一个 apk 文件,你会得到一个包含在应用程序中的每个类的 smali 文件。您可以读取和修改 smali,甚至通过从新的 Java 源生成 smali 来完全替换类(为此,您可以使用 javac 将 .java 源编译为 .class 文件,然后使用 Android 将 .class 文件转换为 .dex 文件) dx 编译器,然后使用 baksmali(smali 反汇编程序)将 .dex 转换为 .smali 文件,如this question 中所述。这里可能有一个快捷方式)。完成后,您可以再次使用 apktool 轻松地将 apk 打包备份。请注意,apktool 不会对生成的 apk 进行签名,因此您需要注意 just like any other Android application

    简而言之,您的选择几乎是反编译成 Java,它更具可读性但可能不可逆,或者反汇编成 smali,它更难阅读,但更灵活地进行更改和重新打包修改后的应用程序。您选择哪种方法取决于您要实现的目标。

    【讨论】:

    • 事实上,我不想使用代码或调试它。我只是想获得一个可读的代码,我实现了。有了这个可读的代码,我想获得一个链接,它是 arrayOfString[0] = (getApplicationContext().getString(2131034115) + str5 + str6 + (String)localObject2 + str7); 的结果。这条线。我有每个字符串变量,但没有 getApplicationContext().getString(2131034115)。我想我需要访问这个资源 2131034115,可能分配了一个静态字符串。但我无法访问它。
    • @TolgahanTÜRKER 你有没有发现?我有同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 2018-01-06
    • 2016-12-29
    • 2012-05-11
    • 2012-11-28
    • 2011-01-24
    相关资源
    最近更新 更多