更新android studio和插件后,新建的apk在启动时遇到了令人费解的本机问题,我发现armeabi / armeabi-v7a所以文件压缩从200KB到10KB。虽然旧的android工作室无法做到这一点。
Android Studio版本:2.2(Windows 64位)Gradle版本:2.14.1 Android插件版本:2.2.0
我阅读了Gradle Release Notes的Android插件:
通过采用新的默认打包管道来改进构建性能,该管道在一个任务中处理压缩,签名和zipaligning。您可以通过将android.useOldPackaging = true添加到gradle.properties文件来恢复使用旧的打包工具。使用新的打包工具时,zipalignDebug任务不可用。但是,您可以通过调用createZipAlignTask(String taskName,File inputFile,File outputFile)方法自己创建一个。
我使用了android.useOldPackaging = true,但它不起作用,我发现优化发生在stripDebugSymbol中:
raw libs:
+ --- armeabi | libsecuritysdk-3.1.27.so 210KB | + --- armeabi-v7a | libsecuritysdk-3.1.27.so 233KB | --- 86 libsecuritysdk-3.1.27.so 195KB
中间体&安培; APK: YourProject \示例\构建\中间体\变换\ stripDebugSymbol \调试\文件夹\ 2000 \ 1F \主 + --- armeabi | libsecuritysdk-3.1.27.so 9.06KB | + --- armeabi-v7a | libsecuritysdk-3.1.27.so 9.07KB | --- 86 libsecuritysdk-3.1.27.so 9.06KB
我尝试' assembleDebug --exclude-task transformNative_libsWithStripDebugSymbolForDebug'这将导致apk中没有。
那么如何防止gradle插件优化呢?
答案 0 :(得分:5)
更新:使用官方doNotStrip
选项,https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
感谢Wayne Cai的回答。
此外,要禁用所有这些文件的条带,您可以在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)
}
}
希望这能解决您的问题。
答案 1 :(得分:3)
这是一种没有记录的方法&#39; doNotStrip&#39;在packagingOptions中,只需在build.gradle
中添加以下行packagingOptions{
doNotStrip "*/armeabi/*.so"
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
}
更新:它在2.3文档中。
答案 2 :(得分:1)
我遇到了同样的问题,对我有用的是重置全球Android工作室设置以及项目特定。为此,我刚刚完成了这些步骤:
删除~/.AndroidStudio2.2/
(在Linux上),c:\user\yourname\.AndroidStudio2.2
(在Windows上)
启动Android studio时不要导入任何设置。
可能不是解决这个问题最优雅的方法,但它对我有用。
答案 3 :(得分:0)
这是我对@ recih的答案的变体,它适用于实验性插件:
tasks.whenTaskAdded { task ->
if (task.name.startsWith('transformNative_libsWithStripDebugSymbolFor')) {
task.finalizedBy copyUnstripedJniLibTask
}
}
task copyUnstripedJniLibTask() << {
def destDirRoot = new File(projectDir, "build/intermediates/transforms/stripDebugSymbol/unprotected/debug/folders/")
if (!destDirRoot.isDirectory()) return
def destDir = destDirRoot
def srcDir = new File(destDirRoot.getAbsolutePath().replace("stripDebugSymbol", "mergeJniLibs"))
println "Copying unstriped jni libs ..."
println " from ${srcDir}"
println " to ${destDir}"
// Copy the unstripped so files to overwrite the striped ones.
FileUtils.copyDirectory(srcDir, destDir)
}