APK полностью затенен несколькими ABI APK - PullRequest
0 голосов
/ 21 мая 2019

ОБНОВЛЕНИЕ: попытался понизить "v7a" код версии ABI до префикса 4 (ниже 5, что означает "v8") без какой-либо удачи

В настоящее время мое приложение находится в стадии альфы.Каждый APK был сгенерирован одним и тем же разделением ABI и одним и тем же умножением версии для каждого ABI (включая код), как для «armeabi-v7a», так и для «arm64-v8a».Хотя я загрузил только v8a APK до сих пор.Теперь, когда я пытаюсь загрузить "v7a", я получаю следующую ошибку из консоли Google Play:

Проблема: Этот APK не будет обслуживаться ни одним пользователям, потому что он полностью скрытодин или несколько APK с кодами более высокой версии.Решение. Удалите этот APK из своего выпуска или просмотрите коды таргетинга и версии APK, которые вы включили в этот выпуск.

android {
compileSdkVersion 26

buildToolsVersion '28.0.3'

defaultConfig {
    multiDexEnabled true
    minSdkVersion 21
    versionCode 28
    versionName "1.36"
    targetSdkVersion 26
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    if (nativeBuildSystem == 'cmake') {
        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=gcc', '-DANDROID_STL=gnustl_static'
            }
        }
    }

}

if (nativeBuildSystem == 'cmake') {
    externalNativeBuild {
        cmake {
            path './jni/CMakeLists.txt'
        }
    }
}

// special for TFLite without it we will get an error when trying
// to use 'detect.tflite' assets file
aaptOptions {
    noCompress "tflite"
}

splits {
    abi {
        enable true
        reset()
        include "armeabi-v7a", "arm64-v8a"
        universalApk false
    }
}


lintOptions {
    abortOnError false
}

sourceSets {
    main {
        if (nativeBuildSystem == 'bazel' || nativeBuildSystem == 'makefile') {
            // TensorFlow Java API sources.
            java {
                srcDir '../../java/src/main/java'
                exclude '**/examples/**'
            }

            // Android TensorFlow wrappers, etc.
            java {
                srcDir '../../contrib/android/java'
            }
        }
        // Android demo app sources.
        java {
            srcDir 'src'
        }

        manifest.srcFile 'AndroidManifest.xml'
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = [project.ext.ASSET_DIR]
    }

    androidTest {
        java.srcDirs = ['src/androidTest/java', 'src']
    }

    debug.setRoot('build-types/debug')
    release.setRoot('build-types/release')
}

}

Разделение кода версии:

ext.versionCodes = ['arm64-v8a': 5, 'armeabi-v7a': 6]

import com.android.build.OutputFile


android.applicationVariants.all { variant ->
// assign different version code for each output
    variant.outputs.each { output ->

        def abiFilter = output.getFilter(OutputFile.ABI)
        def abiMultiplier = 0
        if (abiFilter != null) {
            abiMultiplier = (int) project.ext.versionCodes.get(abiFilter)
        }

        output.versionCodeOverride = (int) abiMultiplier * 1000 + (int) android.defaultConfig.versionCode
    }
}

Также прикреплены скриншоты из игровой приставки.Кажется, что версия «v7a» APK скрывает «v8», как будто игровая консоль, похоже, не различает архитектуры между ними.Эта гипотеза также подтверждается тем фактом, что в описании каждого APK указано, что APK поддерживает обе платформы.

enter image description here

enter image description here

enter image description here

enter image description here

Ответы [ 2 ]

3 голосов
/ 22 мая 2019

Код версии APK для arm64-v8a должен быть выше, чем код версии APK для armeavi-v7a.

Чтобы определить, какой APK обслуживается, Play выбирает самый высокий код версии, совместимый с данным устройством. Поскольку все устройства, поддерживающие 64 бита (arm64-v8a), также поддерживают 32 бита (armeabi-v7a), если вы установите 32-битный APK с более высоким versionCode, он также будет соответствовать для 64-битных устройств и, таким образом, это будет обслуживаться. вместо 64-битного. Вот почему Play сообщает вам, что arm64-v8a затенен.

Надеюсь, это поможет.

0 голосов
/ 22 мая 2019

Как предположил Пьер, каждый из APK (v7a, v8) содержал оба ABI.Но как это могло произойти, спросите вы?

Из-за JavaCV (библиотеки OpenCV) зависимости Gradle для обоих ABI в одном модуле:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:recyclerview-v7:26.1.0'

    api (group: 'org.bytedeco', name: 'javacv', version: '1.4.3', {
        exclude group: 'org.bytedeco.javacpp-presets', module: 'flandmark'
        exclude group: 'org.bytedeco.javacpp-presets', module: 'flycapture'
        exclude group: 'org.bytedeco.javacpp-presets', module: 'leptonica'
        exclude group: 'org.bytedeco.javacpp-presets', module: 'libdc1394'
        exclude group: 'org.bytedeco.javacpp-presets', module: 'libfreenect2'
        exclude group: 'org.bytedeco.javacpp-presets', module: 'libfreenect'
        exclude group: 'org.bytedeco.javacpp-presets', module: 'librealsense'
        exclude group: 'org.bytedeco.javacpp-presets', module: 'tesseract'
        exclude group: 'org.bytedeco.javacpp-presets', module: 'videoinput'
        exclude group: 'org.bytedeco.javacpp-presets', module: 'artoolkitplus'
    })

    // add the libraries you need depending on your mobile phone - if you get an exception or
    // "... class not found", or "didn't load library ...", try replace android-arm64 with android-arm, or with android-x86
    implementation group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.4.3-1.4.3', classifier: 'android-arm'
    implementation group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.4.3-1.4.3', classifier: 'android-arm64'
}

Я закомментировал implementation group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.4.3-1.4.3', classifier: 'android-arm64', перегрузил и все заработало.arm64 поддерживает руку, но не наоборот.

...