Android Gradle 1.0计算多风味设置中的版本代码

时间:2014-12-16 15:58:25

标签: android android-gradle

计算不同产品风格的版本代码的代码不再适用于Android Gradle 1.0系统。我成功之前使用了下面的示例代码。

http://tools.android.com/tech-docs/new-build-system/tips#TOC-Computing-Version-code-in-multi-flavor-setup

productFlavors.get(0).versionCode现在计算为null。

Gradle code ..

android {

  buildscript {
    repositories {
      mavenCentral()
    }
    dependencies {
      classpath 'com.android.tools.build:gradle:1.0.0'
    }
  }

  // This actual the app version code. Our given range is [0, 99999]
  defaultConfig.versionCode = 123

  // 2 dimensions of flavors. API is more important than ABI.
  flavorGroups "api", "abi"

  productFlavors {
    gingerbread {
      flavorGroup "api"
      minSdkVersion 10
      versionCode = 1
    }
    icecreamSandwich {
      flavorGroup "api"
      minSdkVersion 14
      // this must be higher than the gingerbread version to ensure update of the
      // app when the device gets a system update from GB to ICS
      versionCode = 2
    }
    x86 {
      flavorGroup "abi"
      ndk.abiFilter "x86"
      // this is the flavor part of the version code.
      // It must be higher than the arm one for devices supporting
      // both, as x86 is preferred.
      versionCode = 3
    }
    arm {
      flavorGroup "abi"
      ndk.abiFilter "armeabi-v7a"
      versionCode = 1
    }
    mips {
      flavorGroup "abi"
      // It must be higher than the arm one for devices supporting
      // both, as mips is preferred.
      ndk.abiFilter "mips"
      versionCode = 2
    }
    fat {
      flavorGroup "abi"
      // fat binary, lowest version code to be
      // the last option
      versionCode = 0
    }
  }

  // make per-variant version code
  applicationVariants.all { variant ->
    // get the version code of each flavor
    def apiVersion = variant.productFlavors.get(0).versionCode
    def abiVersion = variant.productFlavors.get(1).versionCode

    // set the composite code
     variant.mergedFlavor.versionCode = apiVersion * 1000000 + abiVersion * 100000 + defaultConfig.versionCode
  }
}

1 个答案:

答案 0 :(得分:11)

来自Google user guide

  

多味变体

     

在某些情况下,可能需要创建相同应用的多个版本   基于多个标准。例如,支持多个apk   Google Play支持4种不同的过滤器。创建不同的APK   在每个过滤器上拆分需要能够使用多个过滤器   产品口味的维度。

     

考虑一个拥有演示和付费版本的游戏示例   想在多apk支持中使用ABI过滤器。有3个ABI和   该应用程序的两个版本,需要生成6个APK(不是   计算由不同构建类型引入的变体)。   但是,付费版本的代码对于所有三个ABI都是相同的,   因此,创造简单的6种口味是不可取的。相反,有   风味的两个维度,变体应该自动构建所有   可能的组合。

     

此功能使用Flavor Dimensions实现。味道是   分配给特定维度android {       ...

flavorDimensions "abi", "version"

productFlavors {
    freeapp {
        flavorDimension "version"
        ...
    }

    x86 {
        flavorDimension "abi"
        ...
    }
} }

flavorGroups已被flavorDimensions取代,因此您需要使用build.gradle处的下一代码

   // 2 dimensions of flavors. API is more important than ABI.
flavorDimensions "api", "abi"

productFlavors {
    gingerbread {
        flavorDimension "api"
        minSdkVersion 10
        versionCode = 1
    }
    icecreamSandwich {
        flavorDimension "api"
        minSdkVersion 14
        // this must be higher than the gingerbread version to ensure update of the
        // app when the device gets a system update from GB to ICS
        versionCode = 2
    }
    x86 {
        flavorDimension "abi"
        ndk.abiFilter "x86"
        // this is the flavor part of the version code.
        // It must be higher than the arm one for devices supporting
        // both, as x86 is preferred.
        versionCode = 3
    }
    arm {
        flavorDimension "abi"
        ndk.abiFilter "armeabi-v7a"
        versionCode = 1
    }
    mips {
        flavorDimension "abi"
        // It must be higher than the arm one for devices supporting
        // both, as mips is preferred.
        ndk.abiFilter "mips"
        versionCode = 2
    }
    fat {
        flavorDimension "abi"
        // fat binary, lowest version code to be
        // the last option
        versionCode = 0
    }
}

// make per-variant version code
applicationVariants.all { variant ->
    // get the version code of each flavor
    def apiVersion = variant.productFlavors.get(0).versionCode
    def abiVersion = variant.productFlavors.get(1).versionCode

    // set the composite code
    variant.mergedFlavor.versionCode = apiVersion * 1000000 + abiVersion * 100000 + defaultConfig.versionCode
}

<强>更新

添加这些行,以便能够在apk的生成名称中看到versionCode

    applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def apk = output.outputFile;
        def newName =  "${output.name}-${variant.mergedFlavor.versionCode}"
        if (variant.buildType.versionNameSuffix) {
            newName += "-${variant.buildType.versionNameSuffix}"
        }
        if (output.zipAlign) {
            output.zipAlign.outputFile = new File((File) apk.parentFile, newName + '-aligned.apk');
        }
        output.packageApplication.outputFile = new File((File) apk.parentFile, newName + ".apk")
    }
}

见下面的构建结果:

    gingerbreadArmDebug-1100123.apk
    gingerbreadArmDebug-1100123-aligned.apk
    gingerbreadFatDebug-1000123.apk
    gingerbreadFatDebug-1000123-aligned.apk
    gingerbreadMipsDebug-1200123.apk
    gingerbreadMipsDebug-1200123-aligned.apk
    gingerbreadX86Debug-1300123.apk
    gingerbreadX86Debug-1300123-aligned.apk
    icecreamSandwichArmDebug-2100123.apk
    icecreamSandwichArmDebug-2100123-aligned.apk
    icecreamSandwichFatDebug-2000123.apk
    icecreamSandwichFatDebug-2000123-aligned.apk
    icecreamSandwichMipsDebug-2200123.apk
    icecreamSandwichMipsDebug-2200123-aligned.apk
    icecreamSandwichX86Debug-2300123.apk
    icecreamSandwichX86Debug-2300123-aligned.apk
    gingerbreadArmRelease-1100123.apk
    gingerbreadFatRelease-1000123.apk
    gingerbreadMipsRelease-1200123.apk
    gingerbreadX86Release-1300123.apk
    icecreamSandwichArmRelease-2100123.apk
    icecreamSandwichFatRelease-2000123.apk
    icecreamSandwichMipsRelease-2200123.apk
    icecreamSandwichX86Release-2300123.apk

来自其中一个的信息,由apktool提取:

version: 2.0.0-RC3
apkFileName: gingerbreadArmDebug-1100123.apk
isFrameworkApk: false
usesFramework:
  ids:
  - 1
sdkInfo:
  minSdkVersion: '10'
  targetSdkVersion: '21'
packageInfo:
  forced-package-id: '127'
versionInfo:
  versionCode: '1100123'
  versionName: '1.0'
compressionType: false

更新2:

GitHub

发布了我的测试项目