如何从发布APK中排除库JAR中包含的非类文件?

时间:2015-09-23 15:14:13

标签: android gradle proguard

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

我想应该可以告诉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

这将是完美的,让我们假设我想完成第二个示例中的操作,并从我的一个罐子中删除'images'目录中的所有内容。

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

(!images/**)

语句。

我期望工作的是与此类似的选项:

-stripfiles !images/**

2 个答案:

答案 0 :(得分: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文件。

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

答案 1 :(得分:0)

如果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?