android studio 2.2压缩所有内置apk中的文件

时间:2016-10-14 07:04:00

标签: android

更新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插件优化呢?

4 个答案:

答案 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工作室设置以及项目特定。为此,我刚刚完成了这些步骤:

  1. 克隆android工作室项目,以获得干净的副本。
  2. 删除~/.AndroidStudio2.2/(在Linux上),c:\user\yourname\.AndroidStudio2.2(在Windows上)

  3. 启动Android studio时不要导入任何设置。

  4. 可能不是解决这个问题最优雅的方法,但它对我有用。

答案 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)
}