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

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

Вот мое приложение build.gradle file

Результат сборки - это только один файл - 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'

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

Ответы

Ответ 1

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

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

gradlew assembleDebug

или

gradlew assembleRelease

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

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

Ответ 2

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

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