【问题标题】:Android Proguard - is it best practice to -keep all 3rd party libs?Android Proguard - 保留所有第 3 方库是最佳做法吗?
【发布时间】:2022-01-18 21:08:08
【问题描述】:

我正在为使用 3rd 方库的应用配置 Proguard。包含以下行是否是“最佳实践”(以避免将来难以发现的错误):

-keep class 3rd_party_lib_name.** {*;}

对于每个没有来自其开发人员的特定 Proguard 指令的第三方开源库?

另外,还有一个相关的问题:我应该使用哪些情况下是否有一般指导方针

-keep class 

在什么情况下我应该使用

-keep public class

非常感谢

【问题讨论】:

    标签: android proguard


    【解决方案1】:

    一般来说,proguard 和代码混淆的主要问题是修改了类名、方法和字段名。 (即myExplicitMethodName()变成a()

    当类名、方法名或字段被修改时,您无法使用反射 API 访问它(即 Class.classForName(...) ,...)

    知道这一点后,最佳做法是-keep 所有可以使用反射 API 调用的类和库。

    对于第 3 方库,如果您不知道他们是否使用反射 API:那么 -keep

    对于您自己的代码:希望您知道在哪些类中使用它。所以对这些类使用-keep

    请注意,一些流行的框架(如 dagger 或 jackson)在您自己的类中使用反射 API,因此如果您使用它们,请小心!

    【讨论】:

      【解决方案2】:

      在优化和混淆方面,您可以使用的 -keep 选项越少,结果就越好。如果您没有时间找到最佳配置,您可以采取更保守的方法。最保守的解决方案是保留库中的所有类、字段和方法,因此任何内部反射都将继续工作:

      -keep class 3rd_party_lib_name.** {*;}
      

      稍微不那么保守,但通常足够:保留所有公共 API:

      -keep public class 3rd_party_lib_name.** {
          public *;
      }
      

      更不保守:只保留公共类,但不一定保留它们的字段或方法:

      -keep public class 3rd_party_lib_name.**
      

      可以进行一些实验。

      正如 ben75 提到的,这并没有考虑到第三方库对您自己的代码执行反射。

      【讨论】:

      • 这看起来不错。我的问题主要是无论我采用哪种方法,我都无法立即判断它是否破坏了我的应用程序 - 几个月后某些模块中可能会出现错误,我永远无法判断它是由这个引起的。这是我最担心的事情。
      【解决方案3】:

      由于某些库对某些类使用反射或 json 转换,如果您不保留库类,您的应用将无法正常运行。对于一个示例案例, 我使用带有 proguard 的 Honeywell rfid 库。当一些类和枚举没有保留时,发生了一个奇怪的情况。尝试编写 rfid 标签时,即使失败,库也会返回它是成功的写入。所有其他方法都正常工作。那么如何保护自己的代码。 在 Android Studio 中双击打开第三方库文件。进入 classes.jar 文件并确定使用哪些包。然后将这些包保存在 proguard 文件中。

      例如: [![要包括的第三方包][1]][1] [1]:https://i.stack.imgur.com/lr2fb.png

      proguard-rules.pro 文件必须如下所示。

      -keep class com.honeywell.** { *; }
      -keep class com.silionmodule.** { *; }
      -keep class com.bth.** { *; }
      -keep class com.communication.** { *; }
      -keep class com.thingmagic.** { *; }
      -keep class com.tool.** { *; }
      
      -keep enum com.honeywell.** { *; }
      -keep enum com.silionmodule.** { *; }
      -keep enum com.bth.** { *; }
      -keep enum com.communication.** { *; }
      -keep enum com.thingmagic.** { *; }
      -keep enum com.tool.** { *; }
      

      【讨论】:

        猜你喜欢
        • 2019-06-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-23
        相关资源
        最近更新 更多