Включение externalNativeBuild с разделом ABI

Я переключился на систему сборки cmake из ndk-build . Но не может заставить функцию разделения APK работать.

Вот мой файл build.gradle приложения

Результатом сборки является только один файл – foo.bar-armeabi-v7a-release-1.5.1.apk .
Если я создаю приложение для эмулятора x86, результатом будет foo.bar-x86-release-1.5.1.apk

 buildscript { repositories { maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'io.fabric.tools:gradle:1.+' } } apply plugin: 'com.android.application' apply plugin: 'io.fabric' repositories { jcenter() maven { url 'https://maven.fabric.io/public' } } android { compileOptions.encoding = 'ISO-8859-1' compileSdkVersion CompiledSdkVersion buildToolsVersion BuildToolsVersion defaultConfig { applicationId "foo.bar" minSdkVersion MinSdkVersion targetSdkVersion TargetSdkVersion versionCode VersionCode versionName VersionName vectorDrawables.useSupportLibrary = true externalNativeBuild { cmake { cppFlags "-fexceptions", "-std=c++11" } } ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64" } } signingConfigs { release { storeFile file("..\\release.keystore") } } lintOptions { checkReleaseBuilds false abortOnError false } buildTypes { release { signingConfig signingConfigs.release minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' } } splits { abi { enable true reset() include "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64" universalApk true } } project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9] android.applicationVariants.all { variant -> variant.outputs.each { output -> output.versionCodeOverride = project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.FilterType.ABI), 0) * 1000000 + android.defaultConfig.versionCode output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(".apk", "-${variant.versionName}.apk")) } } externalNativeBuild { cmake { path 'src/main/jni/CMakeLists.txt' } } } crashlytics { enableNdk false // too many reports for third-party modules androidNdkOut '.externalNativeBuild/cmake/release' androidNdkLibsOut 'src/main/libs' } dependencies { compile project(':common-sources') compile project(':chess-board-library') compile project(':number-picker') compile files('libs/kxml2-2.3.0.jar') compile files('libs/StartADLib-1.0.1.jar') compile Dependencies.appCompat compile Dependencies.cardView compile Dependencies.firebaseAds compile Dependencies.googleAnalytics compile Dependencies.googlePlus compile Dependencies.googleGames compile(Dependencies.crashlytics) { transitive = true } compile(Dependencies.crashlyticsNdk) { transitive = true } } apply plugin: 'com.google.gms.google-services' 

PS Пожалуйста, проголосуйте за мою проблему в Google tracker, если вы можете воспроизвести ошибку, но не можете найти решение.

Solutions Collecting From Web of "Включение externalNativeBuild с разделом ABI"

Похоже, это ошибка в сборке. ABI Split не работает даже со старой ndk-сборкой.

Во время исследования я нашел хорошее обходное решение – запуск сборки прямо из командной строки.

 gradlew assembleDebug 

или

 gradlew assembleRelease 

Команду нужно запускать из корневого каталога проекта.

Большое спасибо за этот неожиданный комментарий 🙂

Похоже, ваша проблема в вашем варианте .outputs.each. Во-первых, getFilter принимает только один аргумент. (См. Реализацию класса Output .)

См. Это сообщение, почему вы не должны использовать com.android.build.OutputFile.ABI (вместо этого используйте OutputFile.FilterType.ABI). Эта проблема вызвала аналогичный сбой APK для этого плаката.