【问题标题】:How can I exclude non-class files contained in library JARs from release APKs?如何从发布的 APK 中排除库 JAR 中包含的非类文件?
【发布时间】:2015-09-23 15:14:13
【问题描述】:

我正在使用 gradle 构建 APK 文件,并让 proguard 缩小和混淆我的代码。我使用的一个外部库包含一些我不需要但最终出现在我的最终 APK 文件中的 *.so 文件。

我想应该可以告诉 proguard 忽略这些文件,但是如何呢?

proguard (http://proguard.sourceforge.net/manual/usage.html#filters) 的文档解释了如何使用过滤器,例如这是如何避免重复 MANIFEST 文件的错误:

-injars  in1.jar
-injars  in2.jar(!META-INF/MANIFEST.MF)
-injars  in3.jar(!META-INF/MANIFEST.MF)
-outjars out.jar

我们还可以根据文件名和模式进行过滤:

-injars  in.jar(!images/**)
-outjars out.jar

这将是完美的,假设我想完全按照第二个示例执行操作,并从我的一个 jar 中删除“图像”目录中的所有内容。

问题是,在 Android 项目的 gradle 构建中使用 proguard 时,我们没有像这些示例中那样自己指定输入和输出。相反,gradle 可能会告诉 proguard 要处理哪些 JAR 以及将结果写入何处。所以配置文件中没有地方放

(!images/**)

声明。

我期望工作的是一个类似于这个的选项:

-stripfiles !images/**

【问题讨论】:

    标签: android gradle proguard


    【解决方案1】:

    好了,终于通过这个问题找到了解决办法: Android Gradle plugin 0.7.0: "duplicate files during packaging of APK"

    可以通过添加排除任意文件打包进APK

    android {
        packagingOptions { 
            exclude 'path/to/file/to/be/ignored.so'
        }
    }
    

    build.gradle 文件。

    不幸的是,它似乎不支持正则表达式。

    【讨论】:

      【解决方案2】:

      如果libs文件夹中有以下文件:

      app/libs
          ├─ library-1.0.jar
          ├─ library-1.0-sources.jar
          └─ library-1.0-javadoc.jar
      

      然后library-1.0-sources.jarlibrary-1.0-javadoc.jar 将包含在构建的APK 中(在顶级根目录中)。

      您应该像这样在 app/build.gradle 文件中排除它们:

      dependencies {
          compile fileTree(include: ['*.jar'], exclude: ['*-sources.jar', '*-javadoc.jar'], dir: 'libs')
      }
      

      另请参阅:How to attach javadoc or sources to jars in libs folder?

      【讨论】:

      • 嘿 Mr-IDE,这个问题是关于文件 within 个单独的 jar,而不是关于首先要考虑哪些 jar 文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2012-05-13
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多