2012-02-15 47 views
13

对于那些在Android源代码中花费任何时间的用户,并不是新闻,android.R类中生成的ID不是1:1反映了在res/提供的JAR的目录。许多可绘制/样式/布局不是“公开”的,并且可以通过参考android.R.xxx而被应用程序访问。R.java中受保护的Android ID

我的问题是没有人知道由Android是能够产生与实际资源图形不同的R.java类的机制?其次,它是一种机制(使用构建规则等),我们作为开发人员可以利用这些机制来部分保护在用作库的应用程序中公开的ID。

在此先感谢!

回答

1

使用AAPT Android包资源,并且使用在生成过程中该工具R档。在这一步中,XML文件被编译为二进制文件,其他资源只是按原样打包。您可以打开一个.apk文件作为zip存档并按原样访问所有资源文件。库项目只包含编译时添加到项目中的源文件和资源,因此它们将以某种方式存在于.apk文件中。可能布局不是1:1,因为XML已经为图书馆项目编译。您可能有一种方法可以使用aapt从构建时将库项目中的文件删除,但在项目中无法访问这些文件。也可能有一种方法可以在编译时使用aapt和ant来混淆资源名称,但这并不能阻止它们访问它们。

我不知道你为什么会想希望从实际的资源图的不同的R.java类。在构建时不要包含这些资源,否则它们将在apk中。您的布局在输出中被压缩为二进制文件,所以我不确定在另一个项目中反编译或重用它们是多么容易。

什么残局吗?如果是为了保护您的资源,这将是艰难的。如果有人能够为他们的手机打电话,Android是非常不安全的。如果你想保护你的IP,我认为这是最终结果,我会试着将我的项目编译成一个apk文件,看看我是否可以反编译或从apk中提取关键资源。也许尝试一些模糊处理,但是再次,我对编译的XML文件知之甚少,无法知道它们是否足够混乱以致不易反编译。

有人随时纠正我,如果我错了,但这只是我的2美分。

+0

问题的主要目标很简单,就是学习R.java的Android的ROM编译如何能够排除的资源。关于可能以两步编译的布局,你有一个有趣的观点,尽管这个逻辑对于被排除的drawables不起作用,所以必须有另一种方法在发挥作用。关于第二个问题,安全问题不像关于使用库项目清理最终R.java文件中发生的污染那样重要,因为所有的id最终都会结合到主包中的单个“R”类引用中,通常导致重叠。 – Devunwired 2012-02-15 21:02:29

+0

@Devunwired你使用proguard还是obsfucation工具?当我浏览我的apk文件时,我所有的drawable(如.png图像)都位于res文件夹中各自的位置。同样,正如我所说的,R.java文件是在编译阶段的aapt步骤中创建的,所以如果您想要的任何内容都可能,那么它将在该步骤之前或之中。 – onit 2012-02-15 21:32:39

+0

这正是我的观点,但是用android.jar而不是自己的应用来锻炼。你会注意到'res /'目录有更多的drawables,你可以通过在你的代码中调用'android.R.drawable.xxx'来引用它。 – Devunwired 2012-02-15 22:22:40