簡體   English   中英

android studio 2.2壓縮所有內置apk中的文件

[英]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選項, httpsdoNotStrip

感謝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工作室設置以及項目特定。 為此,我剛剛完成了這些步驟:

  1. 克隆android工作室項目,有一個干凈的副本。
  2. 刪除~/.AndroidStudio2.2/ (在Linux上), c:\\user\\yourname\\.AndroidStudio2.2 (在Windows上)

  3. 啟動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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM