我是 Android 新手。 。到目前为止,我一直认为 Android 应用程序中的所有资源 id 都是使用 R.java 文件进行管理和映射的。但是我在市场上有一个应用程序需要处理,在使用 dex2jar 实用程序反编译后,我没有在其中找到 R.java/R.class 文件 我的问题是,到目前为止,我的工作依赖于 R.java/R.class 文件,我正在使用此文件和反射概念访问应用程序中的所有 id。但由于这个应用程序不包含 R.class 文件,我的工作现在陷入困境。
对我来说有趣的是,当我从这个 jar 创建 dex 文件并将其替换到应用程序中并使用 one_click_signer 签署应用程序时,该应用程序在移动设备上运行良好。
所以,
我想知道他们如何在没有 R.java 的情况下管理 ids?
是否可以有一个没有 R.java 的应用程序,或者我可能有 反编译应用程序时出错?
如何在应用程序中找到 ID?
最佳答案
他们使用 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 时,编译器“内联”静态最终字段 - 用值替换字段访问,因为编译器已经知道该值。这意味着编译器将代码翻译为:
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);
}
}
关于java - 不使用 R.java 管理 Android 资源 id 的方法有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23422834/