首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AndroidStudio2.2压缩内置apk中的所有so文件

AndroidStudio2.2压缩内置apk中的所有so文件
EN

Stack Overflow用户
提问于 2016-10-14 07:04:00
回答 3查看 3.8K关注 0票数 6

在更新了android工作室和插件之后,新构建的apk在发布时遇到了令人费解的原生问题,我发现armeabi/armeabi-v7a使得文件从200 to压缩到10 to。而老安卓工作室却不能这么做。

Android Studio版本:2.2(windows 64位) Gradle版本:2.14.1 Android插件版本:2.2.0

我阅读了Gradle发布说明的Android插件:

通过采用一个新的默认打包管道来提高构建性能,该管道在一个任务中处理压缩、签名和压缩。通过将android.useOldPackaging=true添加到gradle.properties文件中,您可以恢复到使用旧的打包工具。在使用新的打包工具时,zipalignDebug任务不可用。但是,您可以通过调用createZipAlignTask(String taskName,File,File )方法自己创建一个。

我使用了android.useOldPackaging=true,但是它不起作用,我发现优化发生在stripDebugSymbol中:

生唇: +--armeabi区libsecuritysdk-3.1.27.so 210 x86区+--armeabi-v7a区libsecuritysdk-3.1.27.so 233 x86区-x86 libsecuritysdk-3.1.27.so 195 x86 中间体和apk: YourProject\example\build\intermediates\transforms\stripDebugSymbol\debug\folders\2000\1f\main +--armeabi x libsecuritysdk-3.1.27.so 9.06KB x+--armeabi-v7a区libsecuritysdk-3.1.27.so 9.07KB区-x86 libsecuritysdk-3.1.27.so 9.06KB

我试着--排除--任务transformNative_libsWithStripDebugSymbolForDebug',--这将导致apk中没有这样的结果。

那么如何防止gradle插件优化这一点呢?

EN

回答 3

Stack Overflow用户

发布于 2016-11-04 03:18:09

更新:使用正式的doNotStrip选项https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html

多亏了蔡韦恩的回答。

此外,要禁用所有这样的文件,可以在build.gradle中添加以下内容

代码语言:javascript
复制
packagingOptions{
    doNotStrip "**/*.so"
}

旧的答案:

我也有同样的问题,也找不到任何官方的方法来禁用这个自动条形功能在互联网上。

幸运的是,我终于在build.gradle中完成了这项工作:

代码语言:javascript
复制
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)
    }
}

希望这能解决你的问题。

票数 6
EN

Stack Overflow用户

发布于 2017-02-16 08:57:13

在doNotStrip中有一个无文档化的方法‘packagingOptions’,只需在build.gradle中添加以下行

代码语言:javascript
复制
packagingOptions{
    doNotStrip "*/armeabi/*.so"
    doNotStrip "*/armeabi-v7a/*.so"
    doNotStrip "*/x86/*.so"
}

更新:它在2.3文档中。

票数 4
EN

Stack Overflow用户

发布于 2016-10-19 10:43:45

我也有同样的问题,对我起作用的是重置全球Android演播室的设置以及特定的项目。为了做到这一点,我刚刚完成了以下步骤:

  1. 克隆android工作室项目,以获得一个干净的副本。
  2. 删除~/.AndroidStudio2.2/ (在Linux上),c:\user\yourname\.AndroidStudio2.2 (在Windows上)
  3. 启动Android时不要导入任何设置。

也许这不是解决这个问题的最优雅的方法,但它对我有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40036945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档