为什么,android中的资源在R.java中被转换成十六进制

为什么,android中的资源在R.java中被转换成十六进制,android,r.java-file,Android,R.java File,为什么,这些资源被转换成十六进制,这是否会为应用程序创建对资源的快速访问。R.java文件由Android Resource ManagerAndroid asset Manager packer(aapt.exe)生成,并包含对应用程序所有资源的引用。每个引用都是唯一的id(公共静态final int)。这些常量以十六进制格式写入R.java文件。从android的角度来看,这是一种体系结构。当您开发Android应用程序并构建代码(未安装在设备/模拟器上)时,资源管理器会将唯一地址分配给所有

为什么,这些资源被转换成十六进制,这是否会为应用程序创建对资源的快速访问。

R.java文件由Android Resource ManagerAndroid asset Manager packer(aapt.exe)生成,并包含对应用程序所有资源的引用。每个引用都是唯一的id(公共静态final int)。这些常量以十六进制格式写入R.java文件。

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


希望这能回答您的问题。

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;
    } 
}
它仍然有效

没有什么是“转换”的,您只是使用一个常量来引用索引号。编译器会处理它。你只是碰巧看到它是十六进制的,但最终,就像你应用程序中的所有东西一样,它只是一和零

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


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

hmm。。。你提到的这个奇怪的.exe是什么?@ElefantPhace没什么奇怪的。是安卓资产管理公司的包装工。嘿,丹尼。我不小心否决了你(昏昏欲睡的错误点击)。请编辑您的答案(即使添加空格也可以),这样我就可以纠正我的错误。@Simon,仅供参考,您自己也可以编辑答案来撤销错误的投票。@JamesWebster Doh。两年过去了,我错过了……谢谢,但是,你觉得。。。。一个单位地址操作搜索=0x7f020000;ic_启动器=0x7f020001;一个位地址就足以产生差异。我迫不及待地想听听你对我电脑上的编译器如何使用我手机上的DVM来构建这些“内存地址”的解释。当我不插上电话时,它似乎也能工作!太棒了@user2125918:只有它存储的地址,另一段内存是从堆中给出的。您只需想象一下,如果每件事情都是在编译时分配的,那么应用程序的大小将是巨大的size@Simon:R.java只是编译时创建的内存映射,因此当您在设备上实际部署该映射时,它将根据分配的设备堆在设备内存中复制该映射。希望helps@Drax你对R.java的理解太离谱了。这可不是那种事。请参阅我的答案,以获得简短的介绍。它们没有转换成任何东西。您只是碰巧将它们视为十六进制。它可能同样是八进制的,或者实际上是二进制的,这就是它们真正的含义。