Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从版本APK中排除库JAR中包含的非类文件?_Android_Gradle_Proguard - Fatal编程技术网

Android 如何从版本APK中排除库JAR中包含的非类文件?

Android 如何从版本APK中排除库JAR中包含的非类文件?,android,gradle,proguard,Android,Gradle,Proguard,我正在使用gradle构建APK文件,让proguard收缩并混淆我的代码。我使用的一个外部库包含一些*.so文件,这些文件我不需要,但最终会出现在我的最终APK文件中 我想应该可以告诉proguard忽略这些文件,但是怎么做呢 proguard()的文档说明了如何使用过滤器,例如,这是如何避免重复清单文件的错误: -injars in1.jar -injars in2.jar(!META-INF/MANIFEST.MF) -injars in3.jar(!META-INF/MANIFES

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

我想应该可以告诉proguard忽略这些文件,但是怎么做呢

proguard()的文档说明了如何使用过滤器,例如,这是如何避免重复清单文件的错误:

-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中删除一个“images”目录中的所有内容

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

(!images/**)
声明

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

-stripfiles !images/**

好,终于通过这个问题找到了解决办法:

通过添加

android {
    packagingOptions { 
        exclude 'path/to/file/to/be/ignored.so'
    }
}
转到
build.gradle
文件


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

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

app/libs
    ├─ library-1.0.jar
    ├─ library-1.0-sources.jar
    └─ library-1.0-javadoc.jar
然后,
library-1.0-sources.jar
library-1.0-javadoc.jar
将包含在构建的APK中(在顶级根目录下)

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

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

嘿,IDE先生,这个问题是关于单个罐中的文件,而不是首先考虑哪些jar文件。