我是Android新手。 。到目前为止,我认为使用R.java文件管理和映射Android应用程序中的所有资源ID。但我在市场上有一个应用程序,在我使用R.java/R.class
实用程序对其进行反编译后,我没有在其中找到dex2jar
文件
我的问题是,到目前为止,我的工作依赖于R.java / R.class文件,我使用此文件和反射概念访问应用程序中的所有ID。但由于这个应用程序不包含R.class文件,我的工作现在已经停止了。
对我来说有趣的是,当我从这个jar创建dex文件并使用one_click_signer在app和sign app中替换它时,该应用程序在移动设备上运行正常。
所以,
我想知道在没有R.java的情况下如何管理ID?
是否有可能没有R.java的应用程序,或者我可能有 反编译app时出错?
如何在应用程序中找到ID?
答案 0 :(得分:1)
他们使用了R但是它被优化了。
让我们说应用程序有这个代码:
public class R {
public static class id {
public static final int something = 123456;
}
}
public class Main {
public void doSomething() {
doSomethingWith(R.id.something);
}
}
编译Java时,编译器"内联" static final fields - 用值替换字段访问,因为编译器已经知道该值。这意味着编译器将代码转换为:
public class R {
public static class id {
public static final int something = 123456;
}
}
public class Main {
public void doSomething() {
doSomethingWith(123456);
}
}
如果应用程序使用Proguard进行优化/混淆 - 这在Android应用程序中很常见 - 那么Proguard会检测到该类" R"未使用并删除它,导致:
public class Main {
public void doSomething() {
doSomethingWith(123456);
}
}