更新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中:
原始库:
+ --- armeabi | libsecuritysdk-3.1.27.so 210KB | + --- armeabi-v7a | libsecuritysdk-3.1.27.so 233KB | --- x86 libsecuritysdk-3.1.27.so 195KB
中间体和apk:YourProject\example\build\intermediates\transforms\stripDebugSymbol\debug\folders\2000\1f\main + --- armeabi | libsecuritysdk-3.1.27.so 9.06KB | + --- armeabi-v7a | libsecuritysdk-3.1.27.so 9.07KB | --- x86 libsecuritysdk-3.1.27.so 9.06KB
我尝试'assembleDebug --exclude-task transformNative_libsWithStripDebugSymbolForDebug',这将导致apk中没有.
那么如何防止gradle插件优化呢?
更新:使用官方doNotStrip选项https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
感谢Wayne Cai的回答.
此外,要禁用所有so文件上的strip,您可以添加以下内容build.gradle:
packagingOptions{
doNotStrip "**/*.so"
}
Run Code Online (Sandbox Code Playgroud)
老答案:
我有同样的问题,并没有找到任何官方方法来禁用互联网上的这个自动剥离功能.
幸运的是,我终于在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)
}
}
Run Code Online (Sandbox Code Playgroud)
希望这能解决你的问题.
我遇到了同样的问题,对我有用的是重置全局 Android studio 设置以及特定于项目的设置。为此,我刚刚完成了这些步骤:
删除~/.AndroidStudio2.2/(在 Linux 上)、c:\user\yourname\.AndroidStudio2.2(在 Windows 上)
启动 Android studio 时不要导入任何设置。
可能不是解决这个问题的最优雅的方法,但它对我有用。
| 归档时间: |
|
| 查看次数: |
2716 次 |
| 最近记录: |