我知道在Proguard中,建议您保留R内部类的字段名称,如ID。因为ProGuard不处理布局xml文件。你最终会得到破碎的链接
但是有没有通过其他方式来混淆像R $ id这样的类,即使它涉及在通过Ant传递给ProGuard之前执行它。
我问这个是因为如果你有一个id为 btnSaveArticle 的按钮,对于黑客而言,通过查看名称就可以很容易地掌握周围代码的作用。
是否可以将所有源代码(包括资源文件)复制到另一个文件夹,并使用ant运行regex来更改R.ids的名称以及更改它们在布局xml文件中的显示位置,以及然后运行生成重新创建R类?
或者您可以创建翻译类,例如TR,然后将其映射到R.class
中的字段例如。
TR.btnSaveArticle = R.id.DHTXM;
其中DHTXM在布局XML中使用的含义较少。但是在代码中你总是引用TR.btnSaveArticle,它将被proguard混淆。
有没有办法实现这一目标,还是我在浪费时间?
答案 0 :(得分:2)
我问这个是因为如果你有一个带有id btnSaveArticle的按钮,对于一个黑客来说,通过查看名称就可以很容易地掌握周围代码的作用。
使用层次结构视图,无论您为何命名,都需要不到30秒的时间来确定“保存文章”按钮的实际ID。我可以通过一些自定义工具设想更快的解决方案。
我浪费时间吗?
恕我直言,是的。
答案 1 :(得分:0)
使用Android的默认配置,ProGuard会完全删除R类,除非您的代码对它们进行内省。在后一种情况下,ProGuard还会保留字段的原始名称,以免破坏内省。
话虽这么说,资源名称也可以从资源XML文件中检索,ProGuard保持不变。
答案 2 :(得分:0)
可以通过Ant,因为它允许您设置不同的gen和res文件夹。
因此,您要做的是从原件复制到这些文件夹,然后使用正则表达式编辑文件以更新为新名称。
您需要这样的翻译类(例如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" />
设置需要一点时间,但一旦实施,它就可以用于其他项目。
答案 3 :(得分:0)
只需使用下面的内容,将其添加到Proguard配置文件
-keepclassmembers class **.R$* {
public static <fields>;}