APK完全被多个ABI APK遮盖了

时间:2019-05-21 20:27:00

标签: android android-gradle apk abi

更新:尝试将“ v7a” ABI版本代码降低到前缀4(小于5,即“ v8”),没有任何运气

当前我的应用程序处于Alpha阶段。每个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 个答案:

答案 0 :(得分:3)

arm64-v8a APK的versionCode应该高​​于armeavi-v7a APK的versionCode。

要确定提供哪个APK,Play会选择与给定设备兼容的最高versionCode。由于所有支持64位(arm64-v8a)的设备也都支持32位(armeabi-v7a),因此,如果您将32位APK放置在更高版本的代码中,则它也将与64位设备匹配,因此可以使用其中的一个而不是64位的这就是Play告诉您arm64-v8a阴影的原因。

希望有帮助。

答案 1 :(得分:0)

如Pierre所建议,每个APK(v7a,v8)都包含两个ABI。但是你怎么会这样呢?

由于JavaCV(OpenCV库)在一个模块中两个ABI的Gradle依赖性:

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支持arm,但不支持。