在不使用R.java的情况下管理Android资源ID的方法有哪些?

时间:2014-05-02 07:18:47

标签: java android

我是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中替换它时,该应用程序在移动设备上运行正常。

所以,

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

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

  3. 如何在应用程序中找到ID?

1 个答案:

答案 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);
    }
}