在更新了android工作室和插件之后,新构建的apk在发布时遇到了令人费解的原生问题,我发现armeabi/armeabi-v7a使得文件从200 to压缩到10 to。而老安卓工作室却不能这么做。
Android Studio版本:2.2(windows 64位) Gradle版本:2.14.1 Android插件版本:2.2.0
我阅读了Gradle发布说明的Android插件:
通过采用一个新的默认打包管道来提高构建性能,该管道在一个任务中处理压缩、签名和压缩。通过将android.useOldPackaging=true添加到gradle.properties文件中,您可以恢复到使用旧的打包工具。在使用新的打包工具时,zipalignDebug任务不可用。但是,您可以通过调用createZipAlignTask(String taskName,File,File )方法自己创建一个。
我使用了android.useOldPackaging=true,但是它不起作用,我发现优化发生在stripDebugSymbol中:
生唇: +--armeabi区libsecuritysdk-3.1.27.so 210 x86区+--armeabi-v7a区libsecuritysdk-3.1.27.so 233 x86区-x86 libsecuritysdk-3.1.27.so 195 x86 中间体和apk: YourProject\example\build\intermediates\transforms\stripDebugSymbol\debug\folders\2000\1f\main +--armeabi x libsecuritysdk-3.1.27.so 9.06KB x+--armeabi-v7a区libsecuritysdk-3.1.27.so 9.07KB区-x86 libsecuritysdk-3.1.27.so 9.06KB
我试着--排除--任务transformNative_libsWithStripDebugSymbolForDebug',--这将导致apk中没有这样的结果。
那么如何防止gradle插件优化这一点呢?
发布于 2016-11-04 03:18:09
更新:使用正式的doNotStrip选项https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
多亏了蔡韦恩的回答。
此外,要禁用所有这样的文件,可以在build.gradle中添加以下内容
packagingOptions{
doNotStrip "**/*.so"
}旧的答案:
我也有同样的问题,也找不到任何官方的方法来禁用这个自动条形功能在互联网上。
幸运的是,我终于在build.gradle中完成了这项工作:
applicationVariants.all { variant ->
def copyUnstripedJniLibTask = tasks.create(name: "copyUnstripedJniLibFor${variant.name.capitalize()}") << {
def destDirRoot = new File(projectDir, "build/intermediates/transforms/stripDebugSymbol/${variant.dirName}/folders/")
if (!destDirRoot.isDirectory()) return
// the folder contains final so files is something like "stripDebugSymbol/variantName/debug/folders/2000/1f/main/lib/",
// I don't know how to generate the "2000/1f" part, so I have to search for it.
// If you got better idea, please comment.
def list = FileUtils.listFiles(destDirRoot, FileFilterUtils.suffixFileFilter("so"), FileFilterUtils.trueFileFilter());
if (list.size() <= 0) return
def destDir = list[0].getParentFile().getParentFile()
def srcDir = new File(destDir.getAbsolutePath().replace("stripDebugSymbol", "mergeJniLibs"))
println "Copying unstriped jni libs ..."
println " from ${srcDir}"
println " to ${destDir}"
// Copy the unstriped so files to overwrite the striped ones.
FileUtils.copyDirectory(srcDir, destDir)
}
def transformNativeLibsTask = project.tasks.findByName("transformNative_libsWithStripDebugSymbolFor${variant.name.capitalize()}")
if (transformNativeLibsTask) {
transformNativeLibsTask.finalizedBy(copyUnstripedJniLibTask)
}
}希望这能解决你的问题。
发布于 2017-02-16 08:57:13
在doNotStrip中有一个无文档化的方法‘packagingOptions’,只需在build.gradle中添加以下行
packagingOptions{
doNotStrip "*/armeabi/*.so"
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
}更新:它在2.3文档中。
发布于 2016-10-19 10:43:45
我也有同样的问题,对我起作用的是重置全球Android演播室的设置以及特定的项目。为了做到这一点,我刚刚完成了以下步骤:
~/.AndroidStudio2.2/ (在Linux上),c:\user\yourname\.AndroidStudio2.2 (在Windows上)也许这不是解决这个问题的最优雅的方法,但它对我有效。
https://stackoverflow.com/questions/40036945
复制相似问题