【问题标题】:Protected Android IDs in R.javaR.java 中受保护的 Android ID
【发布时间】:2012-03-07 00:25:09
【问题描述】:

对于那些在 Android 源代码中花费过任何时间的用户来说,android.R 类中生成的 ID 不是 1:1 反映在提供的 JAR。许多drawables/styles/layouts不是“公开的”,应用程序可以通过引用android.R.xxx来访问。

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

提前致谢!

【问题讨论】:

    标签: android resources r.java-file


    【解决方案1】:

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

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

    这里的结局是什么?如果是为了保护你的资源,那就很难了。如果有人能够 root 他们的手机,Android 是非常不安全的。如果你想保护你的 IP,我假设这是最后的结果,我会尝试将我的项目编译成 apk,看看我是否可以反编译或从 apk 中提取关键资源。也许可以尝试一些混淆,但同样,我对编译的 XML 文件了解不够,无法知道它们是否被混淆到不容易被反编译。

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

    【讨论】:

    • 这个问题的主要目标只是了解 R.java 的 Android ROM 构建如何能够排除资源。您对可能分两步编译的布局有一个有趣的观点,尽管这种逻辑不适用于被排除的可绘制对象,因此必须有另一种方法在起作用。关于第二个问题,安全性与其说是使用库项目清理最终 R.java 文件中发生的污染不如关注的问题,因为所有 id 最终都合并到主包中的单个 R 类引用中,通常会导致重叠。
    • @Devunwired 您使用的是 proguard 还是混淆工具?当我查看我的 apk 文件时,我的所有可绘制对象(例如 .png 图像)都只是位于它们各自位置的 res 文件夹中。同样,就像我说的,R.java 文件是在编译阶段的 aapt 步骤中创建的,所以如果你想要的任何东西都是可能的,它会在那个步骤之前或之中。
    • 这正是我的观点,但请使用 android.jar 而不是您自己的应用程序来做这个练习。您会注意到res/ 目录中的drawable 比您在代码中调用android.R.drawable.xxx 所能引用的要多得多。
    • @Devunwired 好点,我不知道这个事实。但是,我对您的最后一个问题是,您为什么要访问 res 文件夹中的文件,但不能从代码中访问它们?我遇到了在不同构建之间的 res 文件夹中有不需要的资源的问题,但我最终创建了一个简单的脚本,通过在构建之前删除不需要的资源然后在之后将它们重新添加来管理它。跨度>
    • 嗯,图书馆项目中的资源通常只对图书馆重要,而不是使用它的应用程序。最好不要让这些资源 ID 弄乱正在使用的应用程序项目。
    猜你喜欢
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 2014-05-02
    • 2015-09-05
    相关资源
    最近更新 更多