Android Gradle APK分割,设置versionCode

11
我试图将一个应用程序分成适用于不同处理器架构的apk文件,但所有apk文件的版本号相同。为了上传到应用商店,它们需要有所区别。我是否漏掉了什么?

我尝试将应用程序拆分为特定于abi的apk包,但所有apk包的版本号都相同。它们需要不同才能上传到应用商店。我是不是漏掉了什么?

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

使用最新的AS和Gradle版本,我得到了以下错误信息:Gradle DSL方法未找到:'universalapk()'。 - David
4个回答

7
这是您的Gradle应该呈现的样子。您忘记为不同的架构版本分配标识符。
    android 
    {

    def versionMajor = 1
        def versionMinor = 0
        def versionPatch = 0
        def versionBuild = 0

        defaultConfig {
            applicationId "com.example.app"
            minSdkVersion 15
            targetSdkVersion 22

            versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild
            versionName "${versionMajor}.${versionMinor}.${versionPatch}"
        }

 splits {
        abi {
            enable true
            reset()
            include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
            universalApk true
        }
    }    

    // map for the version code
        project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]

        android.applicationVariants.all { variant ->
            // assign different version code for each output
            variant.outputs.each { output ->
                output.versionCodeOverride =
                        project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + android.defaultConfig.versionCode
            }
        }
    }

谢谢。我以前尝试过类似的东西,但没成功。不过我有机会的时候会原封不动地尝试你的代码。 - Daykm
@TarasVovkovych universalApk为true,如果您需要一个可以在所有平台上运行的apk。 - Ankush Sharma

4

我认为这样会更清晰一些。虽然它可能不是100%可自动化的,但我不喜欢* 1000000和字典查找技巧:

ext {
    versionCodeBase = 30 // 1 higher than current highest versionCode in Play store
}

android {
    splits {
        density {
            enable true // just enable them all
        }
        abi {
            enable true
            universalApk false
        }
    }

    android.applicationVariants.all { variant ->
        variant.outputs.eachWithIndex { output, outputIndex ->
            output.versionCodeOverride = project.ext.versionCodeBase + outputIndex
            println variant.buildType.name + ' - ' + output.getFilter(OutputFile.ABI) + ' - ' + output.getFilter(OutputFile.DENSITY) + ': ' + output.versionCodeOverride
        }
    }
}

请注意,我正在使用eachWithIndex循环遍历变量。

这样做是因为密度和abi不会在用户设备上更改。如果您要允许每个minSdkVersion有单独的apk文件,则需要在此脚本中进行更多工作。

让我也添加一下脚本的输出:

debug - mips64 - null: 30
debug - x86_64 - null: 31
debug - x86 - null: 32
debug - armeabi-v7a - null: 33
debug - armeabi - null: 34
debug - mips - null: 35
debug - arm64-v8a - null: 36
debug - mips64 - xxxhdpi: 37
debug - x86_64 - xxxhdpi: 38
debug - x86 - xxxhdpi: 39
debug - armeabi-v7a - xxxhdpi: 40
debug - armeabi - xxxhdpi: 41
debug - mips - xxxhdpi: 42
debug - arm64-v8a - xxxhdpi: 43
debug - mips64 - mdpi: 44
debug - x86_64 - mdpi: 45
debug - x86 - mdpi: 46
debug - armeabi-v7a - mdpi: 47
debug - armeabi - mdpi: 48
debug - mips - mdpi: 49
debug - arm64-v8a - mdpi: 50
debug - mips64 - ldpi: 51
debug - x86_64 - ldpi: 52
debug - x86 - ldpi: 53
debug - armeabi-v7a - ldpi: 54
debug - armeabi - ldpi: 55
debug - mips - ldpi: 56
debug - arm64-v8a - ldpi: 57
debug - mips64 - xxhdpi: 58
debug - x86_64 - xxhdpi: 59
debug - x86 - xxhdpi: 60
debug - armeabi-v7a - xxhdpi: 61
debug - armeabi - xxhdpi: 62
debug - mips - xxhdpi: 63
debug - arm64-v8a - xxhdpi: 64
debug - mips64 - hdpi: 65
debug - x86_64 - hdpi: 66
debug - x86 - hdpi: 67
debug - armeabi-v7a - hdpi: 68
debug - armeabi - hdpi: 69
debug - mips - hdpi: 70
debug - arm64-v8a - hdpi: 71
debug - mips64 - xhdpi: 72
debug - x86_64 - xhdpi: 73
debug - x86 - xhdpi: 74
debug - armeabi-v7a - xhdpi: 75
debug - armeabi - xhdpi: 76
debug - mips - xhdpi: 77
debug - arm64-v8a - xhdpi: 78
release - mips64 - null: 30
release - x86_64 - null: 31
release - x86 - null: 32
release - armeabi-v7a - null: 33
release - armeabi - null: 34
release - mips - null: 35
release - arm64-v8a - null: 36
release - mips64 - xxxhdpi: 37
release - x86_64 - xxxhdpi: 38
release - x86 - xxxhdpi: 39
release - armeabi-v7a - xxxhdpi: 40
release - armeabi - xxxhdpi: 41
release - mips - xxxhdpi: 42
release - arm64-v8a - xxxhdpi: 43
release - mips64 - mdpi: 44
release - x86_64 - mdpi: 45
release - x86 - mdpi: 46
release - armeabi-v7a - mdpi: 47
release - armeabi - mdpi: 48
release - mips - mdpi: 49
release - arm64-v8a - mdpi: 50
release - mips64 - ldpi: 51
release - x86_64 - ldpi: 52
release - x86 - ldpi: 53
release - armeabi-v7a - ldpi: 54
release - armeabi - ldpi: 55
release - mips - ldpi: 56
release - arm64-v8a - ldpi: 57
release - mips64 - xxhdpi: 58
release - x86_64 - xxhdpi: 59
release - x86 - xxhdpi: 60
release - armeabi-v7a - xxhdpi: 61
release - armeabi - xxhdpi: 62
release - mips - xxhdpi: 63
release - arm64-v8a - xxhdpi: 64
release - mips64 - hdpi: 65
release - x86_64 - hdpi: 66
release - x86 - hdpi: 67
release - armeabi-v7a - hdpi: 68
release - armeabi - hdpi: 69
release - mips - hdpi: 70
release - arm64-v8a - hdpi: 71
release - mips64 - xhdpi: 72
release - x86_64 - xhdpi: 73
release - x86 - xhdpi: 74
release - armeabi-v7a - xhdpi: 75
release - armeabi - xhdpi: 76
release - mips - xhdpi: 77
release - arm64-v8a - xhdpi: 78

1
请注意,这并不是理想的解决方案。版本代码需要正确排序,例如 xxxhdpi 设备将使用适用于它们的最高版本代码。如果 xhdpi 的版本代码比 xxxhdpi 更高,则会运行 xhdpi 应用程序。使用其他答案中的查找表对它们进行排序并不是一个坏主意。 - xorgate

3

出于某种原因,我在使用提供的解决方案时总是会遇到错误。我的项目有多个productFlavors,现在我的解决方案如下:

android {
    flavorDimensions 'app', 'store'
    productFlavors {
        appFlavorOne {
            dimension 'app'
            applicationId "com.my.application.id"
            versionCode 123
            versionName '1.2.3'
        }
        appFlavorTwo {
            dimension 'app'
            applicationId "com.my.other.application.id"
            versionCode 100
            versionName '1.0.0'
        }
    }
    splits {
        abi {
            enable true
            reset()
            include 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86'
            universalApk true
        }
    }

    // APK Splits based on ABI, map for the version code. Uncomment for appFlavorTwo Builds!
    project.ext.versionCodes = ['null':0, 'armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'x86': 4]
    android.applicationVariants.all { variant ->
        // assign different version code for each output
        variant.outputs.each { output ->
            output.versionCodeOverride = android.productFlavors.appFlavorOne.versionCode + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0)
            output.versionNameOverride = android.productFlavors.appFlavorOne.versionName + ' (' + (project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) == 0 ? 'universal' : output.getFilter(com.android.build.OutputFile.ABI)) + ')'
            println output.versionNameOverride + ' (' + output.versionCodeOverride + ')'
        }
    }
}

0
使用ABI过滤器和APK分割为Android应用程序创建多个APK文件。
splits {
    density {
        enable true
        exclude "ldpi", "tvdpi", "xxxhdpi"
        compatibleScreens 'small', 'normal', 'large', 'xlarge'
    }
    abi {
        enable true
        reset()
        include 'armeabi-v7a', 'arm64-v8a'
        exclude "armeabi", "mips", "mips64", 'x86', 'x86_64'
        universalApk false
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接