如何从发布 APK 中排除库 JAR 中包含的非 class 文件?
How can I exclude non-class files contained in library JARs from release APKs?
我正在使用 gradle 构建 APK 文件并让混淆器压缩和混淆我的代码。我使用的一个外部库包含一些我不需要但最终出现在我的最终 APK 文件中的 *.so 文件。
我想应该可以让混淆器忽略这些文件,但是怎么做呢?
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 中删除 'images' 目录中的所有内容。
问题是,当在 Android 项目的 gradle 构建中使用混淆器时,我们没有像这些示例中那样自己指定输入和输出。相反,可能 gradle 告诉混淆器要处理哪些 JAR 以及将结果写入何处。所以在配置文件中没有地方放
(!images/**)
声明。
我希望工作的是一个类似于这个的选项:
-stripfiles !images/**
好吧,终于通过这个问题找到了解决办法:
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
文件。
不幸的是,它似乎不支持正则表达式。
如果 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')
}
另请参阅:How to attach javadoc or sources to jars in libs folder?
我正在使用 gradle 构建 APK 文件并让混淆器压缩和混淆我的代码。我使用的一个外部库包含一些我不需要但最终出现在我的最终 APK 文件中的 *.so 文件。
我想应该可以让混淆器忽略这些文件,但是怎么做呢?
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 中删除 'images' 目录中的所有内容。
问题是,当在 Android 项目的 gradle 构建中使用混淆器时,我们没有像这些示例中那样自己指定输入和输出。相反,可能 gradle 告诉混淆器要处理哪些 JAR 以及将结果写入何处。所以在配置文件中没有地方放
(!images/**)
声明。
我希望工作的是一个类似于这个的选项:
-stripfiles !images/**
好吧,终于通过这个问题找到了解决办法: 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
文件。
不幸的是,它似乎不支持正则表达式。
如果 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')
}
另请参阅:How to attach javadoc or sources to jars in libs folder?