java - 不使用 R.java 管理 Android 资源 id 的方法有哪些?

标签 java android

我是 Android 新手。 。到目前为止,我一直认为 Android 应用程序中的所有资源 id 都是使用 R.java 文件进行管理和映射的。但是我在市场上有一个应用程序需要处理,在使用 dex2jar 实用程序反编译后,我没有在其中找到 R.java/R.class 文件 我的问题是,到目前为止,我的工作依赖于 R.java/R.class 文件,我正在使用此文件和反射概念访问应用程序中的所有 id。但由于这个应用程序不包含 R.class 文件,我的工作现在陷入困境。

对我来说有趣的是,当我从这个 jar 创建 dex 文件并将其替换到应用程序中并使用 one_click_signer 签署应用程序时,该应用程序在移动设备上运行良好。

所以,

  1. 我想知道他们如何在没有 R.java 的情况下管理 ids?

  2. 是否可以有一个没有 R.java 的应用程序,或者我可能有 反编译应用程序时出错?

  3. 如何在应用程序中找到 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/

相关文章:

AndroidHttpClient 关闭后无法 getEntity().getContent()

java - 给定 View 类 [org.springframework.web.servlet.view.tiles3.TilesView] 不是 [org.springframework.web.servlet.view.AbstractUrlBasedView] 类型

java - 从输入/文本文件中查找所有奇数和偶数的平均值

java - 在 eclipse 中看不到建议

java - 如何通过Java小程序进行文件上传?

android - 如何在edittext中计算其他语言的字符数

java - 错误 :Failed to complete Gradle execution. 原因:设备上没有剩余空间

java - Enum 类型转换为 int

java - 如何在 JavaFX 中创建对话框

java - 将 rand 变量从一个类传递到具有相同值的另一个类