[英]android studio 2.2 compress all so files in built apk
更新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 : doNotStrip
感謝Wayne Cai的回答。
此外,要在所有so文件上禁用strip,可以在build.gradle
添加以下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)
}
}
希望這能解決你的問題。
在packagingOptions中有一個未記錄的方法'doNotStrip',只需在build.gradle中添加以下行
packagingOptions{
doNotStrip "*/armeabi/*.so"
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
}
更新:它在2.3文檔中。
我有同樣的問題,對我有用的是重置全球Android工作室設置以及項目特定。 為此,我剛剛完成了這些步驟:
刪除~/.AndroidStudio2.2/
(在Linux上), c:\\user\\yourname\\.AndroidStudio2.2
(在Windows上)
啟動Android Studio時不要導入任何設置。
可能不是解決這個問題最優雅的方法,但它對我有用。
這是@ 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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.