对于那些在android源代码中花费了大量时间的用户来说,在android.R
类中生成的id没有1:1反映在提供的jar的res/
目录中找到的实际资源,这不是什么新闻。许多绘图/样式/布局不是“公共”的,应用程序可以通过引用android.R.xxx
来访问它们。
我的问题是,是否有人知道Android
生成与实际资源图不同的r.java类的机制?其次,这是一种机制(使用构建规则等),我们作为开发人员可以利用它来部分保护在用作库的应用程序中公开的id吗?
提前谢谢!
最佳答案
android使用aapt打包资源,并在构建过程中使用此工具生成r文件。在这一步中,xml文件被编译成二进制文件,其他资源也被打包成二进制文件。您可以将.apk文件作为zip存档打开,并按原样访问所有资源文件。库项目只包含在编译时添加到项目中的源文件和资源,因此它们以某种方式存在于.apk文件中。可能布局不是1:1,因为已经为库项目编译了XML。可能有一种方法可以使用aapt从库项目中删除在生成时包含的文件,但这样就无法在项目中访问这些文件。还有一种方法可以在编译时使用aapt和ant混淆资源名,但这并不能阻止它们访问它们。
我不知道为什么您想要一个与实际资源图不同的r.java类。要么在构建时不包含这些资源,要么它们将在apk中。您的布局在输出中被压缩为二进制文件,因此我不确定它们在另一个项目中反编译或重用有多容易。
这里的结局是什么?如果是为了保护你的资源,那就很难了。如果有人能够在自己的手机上建立根目录,那么安卓系统是非常不安全的。如果你想保护你的IP,我假设这是最后一个游戏,我会尝试编译我的项目成一个APK,看看我是否可以反编译或从APK中提取关键资源。也许可以尝试一些模糊处理,但是我对编译后的xml文件知之甚少,不知道它们是否被模糊处理到不容易反编译的程度。
如果我错了,有人可以纠正我,但这只是我的2美分。