0

我知道在 Proguard 中,建议您保留 R 内部类的字段名称,例如 ID。因为 ProGuard 不处理布局 xml 文件。你最终会得到断开的链接

但是是否可以通过其他方式混淆 R$id 之类的类,即使它涉及在通过 Ant 将其传递给 ProGuard 之前进行混淆。

我问这个是因为如果你有一个 id为btnSaveArticle的按钮,对于黑客来说,通过查看名称就很容易掌握周围的代码在做什么。

是否可以将所有源代码(包括资源文件)复制到另一个文件夹并使用 ant 运行正则表达式来更改 R.ids 的名称以及更改它们在布局 xml 文件中出现的位置,然后以某种方式运行生成重新创建R类?

或者您可以创建翻译类,例如 TR 然后将其映射到 R.class 中的字段

例如。

TR.btnSaveArticle = R.id.DHTXM; 

其中 DHTXM 是一些含义较少的词,可以在布局 XML 中使用。但是在代码中你总是引用 TR.btnSaveArticle,它会被 proguard 混淆。

有没有办法做到这一点,还是我在浪费时间?

4

4 回答 4

2

只需在下面使用,将其添加到您的 Proguard 配置文件中

-keepclassmembers class **.R$* {
public static <fields>;}
于 2013-12-09T09:37:37.913 回答
2

我问这个是因为如果你有一个 id 为 btnSaveArticle 的按钮,那么对于黑客来说,通过查看名称就很容易掌握周围的代码在做什么。

使用 Hierarchy View,无论您将其命名为什么,它们都将花费不到 30 秒的时间来确定“保存文章”按钮的实际 ID。而且我可以通过一些定制工具来设想更快的解决方案。

我在浪费时间吗?

恕我直言,是的。

于 2013-08-16T12:54:10.260 回答
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" />

设置起来有点费时,但一旦实施,它就可以用于其他项目。

于 2013-08-21T02:03:46.310 回答
0

使用 Android 的默认配置,ProGuard 会完全删除 R 类,除非您的代码对它们执行自省。在后一种情况下,ProGuard 还保留具有原始名称的字段,以免破坏自省。

话虽如此,资源名称也可以从资源 XML 文件中检索,ProGuard 保持不变。

于 2013-08-17T23:01:25.147 回答