【问题标题】:How can I exclude external .jar from obfuscation by Proguard (Android project)?如何从 Proguard(Android 项目)的混淆中排除外部 .jar?
【发布时间】:2011-05-27 09:08:05
【问题描述】:

当我使用 proguard.cfg 导出 android 项目时,所有引用的 .jar 文件也会被混淆。如何从混淆中排除其中一些 .jar?

【问题讨论】:

    标签: android obfuscation proguard


    【解决方案1】:

    如果您不想编辑 Ant 脚本,您可以在 proguard.cfg 中为这些外部 jar 中的类添加 -keep 选项。例如:

    -keep class othercode.** { *; }
    

    或者使用包含否定符的正则表达式:

    -keep class !mycode.** { *; }
    

    尽管如此,标准 Ant 脚本仍会将所有引用的 jar 合并到单个输出 jar 中。

    【讨论】:

    • 我也是这样做的(但使用了keepclasseswithmembers类和保持接口)在我的情况下它或多或少地工作得很好,因为单独的.jar文件有不同的包名......
    • 还以为保留了名字,代码好像还是被处理和混淆了。
    • @Eric 请回复,在 android studio 中,在 'proguard-project.txt' 或 'proguard-rules.pro' 中添加这些行?
    • @ShirishHerwade proguard-rules.pro
    • 仅供参考:第二种语法(否定语法)在 R8 中不起作用(在较新版本的 Android 构建工具中运行混淆),您需要添加一个额外的“,**” ,看到这个答案:stackoverflow.com/a/59273778
    【解决方案2】:

    在您的配置文件中,将您的 jar 设置为库 jar,而不是输入 jar。这使他们保持原样。

    -libjars <path/to/jars>
    

    【讨论】:

    • 我没有设置输入或库 jars。这是由平台 ant 脚本完成的。我尽量避免编辑该文件。
    【解决方案3】:

    使用 proguard maven 插件我就是这样做的

    <inclusion>
       <groupId>foo.bar</groupId>
       <artifactId>foo-bar</artifactId>
       <library>true</library>
       <filter>!META-INF/**</filter>
    </inclusion>
    

    <library>true</library> 
    

    导致混淆后的外部jar合并到最终jar中。但这可能会导致 Manifest 被覆盖。我还没有想出如何避免这种最好的方法。

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多