我知道在Proguard中,建议您保留R内部类的字段名,如ID。因为Proguard不处理布局xml文件。你将以断开的链接结束
但是,是否可以通过其他方式混淆R$id等类,即使这涉及到在通过Ant将其传递给ProGuard之前进行混淆。
我之所以这么问,是因为如果你有一个id为btnSaveArticle的按钮,对于黑客来说,通过查看名称就很容易掌握周围的代码在做什么。
是否可以将所有源代码(包括资源文件)复制到另一个文件夹,并使用ant运行regex来更改R.id的名称,以及更改它们在布局xml文件中的位置,然后以某种方式运行generate来重新创建R类?
或者你可以创建翻译类,例如TR,然后将其映射到R.class 中的字段
例如。
TR.btnSaveArticle = R.id.DHTXM;
其中DHTXM是一些可以在布局XML中使用的无意义单词。但在代码中,您总是引用TR.btnSaveArticle,这将被proguard混淆。
有没有办法做到这一点,还是我在浪费时间?
只需使用以下内容,将其添加到Proguard配置文件中
-keepclassmembers class **.R$* {
public static <fields>;}
我之所以这么问,是因为如果你有一个id为btnSaveArticle的按钮,对于黑客来说,通过查看名称就很容易掌握周围的代码在做什么。
使用层次结构视图,无论你给它起什么名字,他们都需要不到30秒的时间来确定"保存文章"按钮的实际ID。我可以设想使用一些自定义工具的更快的解决方案。
我在浪费时间吗?
IMHO,是的。
使用Android的默认配置,ProGuard会完全删除R类,除非您的代码对它们进行内省。在后一种情况下,ProGuard还会保留字段的原始名称,以免破坏内省。
也就是说,资源名称也可以从资源XML文件中检索,ProGuard保留这些文件不变。
通过Ant可以设置不同的gen和res文件夹。
因此,您所做的是将原始文件复制到这些文件夹,然后使用regex编辑文件以更新为新名称。
你需要一个像这样的翻译类(例如D)来将其映射到R.class中的字段,这样在你的代码中你就可以使用非模糊名称。
public final class D{
public static final class id{
D.btnSaveArticle = R.id.btnSaveArticle //DHTXM;
然后,您还需要创建一个不同的src文件夹,并从原始文件夹进行复制。在那里,你运行一个任务来编辑D类,使其成为
D.btnSaveArticle = R.id.DHTXM;
我不得不创建一个通过ant运行的java程序,将名称交换为模糊名称。
如果你对字符串做了类似的操作,并且在apk中对你的XML进行样式设置,结果会是这样的:
<TextView
android:id="@+id/GnvCMa"
android:text="@string/OVuCbd"
style="@style/ZOVkuu.MGTRgZ" />
设置起来有点耗时,但一旦实现,就可以用于其他项目。