如何在apk到jar转换后访问资源(R.class)

时间:2014-11-21 13:34:53

标签: java android

我有一个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的实际字符串值是多少?

2 个答案:

答案 0 :(得分:3)

使用APKTOOL反编译后

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

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

感谢。

答案 1 :(得分:1)

根据您想要完成的任务,您可以在此处使用两条路径:

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

另一个主要的替代方法是将字节码反汇编为smali,这是一种专为此目的而设计的汇编语言。我发现最简单的方法是使用apktool。一旦你安装了apktool,你就可以将它指向一个apk文件,然后你将获得应用程序中包含的每个类的smali文件。您可以通过从新Java源生成smali来完全读取和修改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,这更难以阅读,但更灵活地进行更改并重新打包修改后的应用程序。您选择哪种方法取决于您希望实现的目标。