【问题标题】:why , resources in android are converted into HEXA-DECIMAL inside R.java [closed]为什么,android中的资源在R.java中被转换为HEXA-DECIMAL [关闭]
【发布时间】:2013-03-02 05:17:40
【问题描述】:

为什么,资源被转换成 HEXAdecimal ,它是否会为您的应用程序创建一些对资源的快速访问。

【问题讨论】:

  • 它们没有被转换成任何东西。您只是碰巧将它们视为十六进制。它可能同样是八进制或实际上是二进制,这就是它们的真正含义。

标签: android r.java-file


【解决方案1】:

R.java 只不过是一个类文件,对于项目中的每个资源都有一个静态常量。常量是一个有效的文件系统的索引号。所以 myicon.png 被赋予了 12345 的文件号。资源管理器使用这个索引在运行时加载资源。打开它。看看吧。

我们来看一个R.java的例子:

public final class R {
    public static final class id {
        public static final int myTextView=0x7f090008;
    } 
}

我可以使用以下方法引用 myTextview:

findViewById(R.id.myTextView) - constant
findViewById(0x7f090008) - hex
findViewById(2131296264) - decimal
findViewById(017702200010) - octal
findViewById(0b1111111000010010000000000001000) - binary

它们都是等价的。

同样,我可以像这样编写我的 R.java 文件:

public final class R {
    public static final class id {
        public static final int myTextView=0b1111111000010010000000000001000;
    } 
}

它仍然有效。

没有什么是“转换的”,你只是使用一个常量来引用索引号。编译器会处理它。您只是碰巧将其视为十六进制,但最终,就像您应用中的所有内容一样,它只是 1 和 0。

这样做的唯一原因是您可以使用这些常量。想象一下,如果您必须使用实际的索引值来维护您的代码,尤其是考虑到它们可能会在您每次重建 R.java 时发生变化。

索引号不是内存地址、偏移量或特殊类型的奶酪。它们只是由编译器生成的常量,使您能够使用友好的名称访问资源。

【讨论】:

    【解决方案2】:

    R.java 文件由 Android 资源管理器Android 资产管理器打包器(aapt.exe) 生成,其中包含对您应用的所有资源的引用。每个引用都是一个唯一的 id(public static final int)。这些常量以十六进制格式写入 R.java 文件。

    【讨论】:

    • 嗯...你提到的这个奇怪的.exe是什么?
    • @ElefantPhace 这没什么奇怪的。它是 Android 资产管理器打包程序。
    • 嘿丹尼。我不小心对你投了反对票(昏昏欲睡的错误点击)。请编辑您的答案(即使添加空格也可以),以便我纠正错误。
    • @Simon,仅供参考,您自己也可以编辑答案以撤消错误的投票。
    • @JamesWebster Doh。 2 年在这里,我错过了..谢谢
    【解决方案3】:

    从 android 的角度来看,这是一种架构。当您开发 Android 应用程序并只是构建代码(未安装在设备/模拟器上)时,资源管理器会为所有资源分配唯一地址。一旦应用程序安装在设备上,实际的内存分配就会发生,这个文件将帮助 Android 映射它所需的实际内存。

    希望这能回答你的问题

    【讨论】:

    • 但是,你有没有想过这个....一个位 addressic_action_search=0x7f020000; ic_launcher=0x7f020001;一个位地址足以产生差异。
    • 我迫不及待想听听您对我 PC 上的编译器如何使用手机上的 DVM 构建这些“内存地址”的解释。当我不插入手机时,它似乎也可以工作!太棒了!
    • @user2125918 :只是它存储另一块内存的地址是从堆中给出的。如果每件事都在编译时分配,那么你只是在想象,那么应用程序的大小将会很大
    • @Simon : R.java 只是在编译时创建的内存映射,因此当您实际在设备上部署它时,它会根据分配的设备堆将其复制到设备内存中。希望有帮助
    • @Drax 您的理解或 R.java 离题太远了。这不是那种事。请参阅我的答案以获得简要介绍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多