Android-андроид 2.2 сжимает все файлы в встроенном apk

После обновления студии и плагинов Android новая встроенная apk встречает загадочную проблему при запуске, я нашел armeabi / armeabi-v7a, поэтому файлы сжаты с 200 КБ до 10 КБ. Хотя старая андроид-студия не может этого сделать.

Android Studio Версия: 2.2 (Windows 64bit) Gradle Версия: 2.14.1 Android Plugin Версия: 2.2.0

Я прочитал Android-плагин для Gradle Release Notes:

Улучшает производительность сборки, применяя новый по умолчанию упаковочный конвейер, который обрабатывает записями, подписанием и zipaligning в одной задаче. Вы можете вернуться к использованию старых упаковочных инструментов, добавив в файл gradle.properties файл android.useOldPackaging = true. При использовании нового инструмента упаковки задача 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 | — x86 libsecuritysdk-3.1.27.so 195KB

Intermediates & 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 оптимизировать это?

У меня была такая же проблема, и я не могу найти какой-либо официальный способ отключить эту функцию автоматической полосы в Интернете.

К счастью, я, наконец, получил эту работу в 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) } } 

Надеюсь, это решит вашу проблему.

Существует недокументированный метод «doNotStrip» в области упаковкиОптимы, просто добавьте следующие строки в свой build.gradle

 packagingOptions{ doNotStrip "*/armeabi/*.so" doNotStrip "*/armeabi-v7a/*.so" doNotStrip "*/x86/*.so" } 

Update: это в документе 2.3.

У меня была такая же проблема, и для меня это работало, чтобы сбросить глобальные настройки студии Android, а также конкретные проекты. Для этого я просто сделал следующие шаги:

  1. Клонируйте проект студии Android, чтобы иметь чистую копию.
  2. Удалите ~/.AndroidStudio2.2/ (в Linux), c:\user\yourname\.AndroidStudio2.2 (в Windows)

  3. Не загружайте никаких настроек при запуске студии Android.

Наверное, это не самый элегантный способ решить это, но он работает для меня.

Вот мой вариант ответа @ 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) }