2014-12-16 9 views
5

Il codice per calcolare il codice di versione per diversi gusti prodotto non funziona più nel sistema Android Gradle 1.0. Ho usato il codice di esempio qui sotto prima con successo.Codice versione di Android Gradle 1.0 Computing in configurazione multi-aroma

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

productFlavors.get (0) .versionCode è ora calcolato come null.

codice Gradle ..

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 
    } 
} 

risposta

8

Da Google user guide

Multi-sapore varianti

In alcuni casi, si può decidere di creare diverse versioni delle stesse applicazioni basate su più di un criterio. Ad esempio, il supporto multi-apk in Google Play supporta 4 diversi filtri. La creazione di diversi APK suddivisi su ciascun filtro richiede la possibilità di utilizzare più di una dimensione di Prodotti.

Considerare l'esempio di un gioco che ha una versione demo e una versione a pagamento e desidera utilizzare il filtro ABI nel supporto multi-apk. Con 3 ABI e due versioni dell'applicazione, è necessario generare 6 APK (non contando le varianti introdotte dai diversi Tipi di costruzione). Tuttavia, il codice della versione a pagamento è lo stesso per tutte e tre le ABI, , quindi creare semplicemente 6 sapori non è la strada da percorrere. Invece, ci sono due dimensioni di sapori e le varianti dovrebbero automaticamente creare tutte le combinazioni possibili .

Questa funzione è implementata utilizzando Dimensioni gusto. I sapori sono assegnati a una specifica dimensione Android { ...

flavorDimensions "abi", "version" 

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

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

flavorGroups è stato sostituito da flavorDimensions, quindi è necessario utilizzare il codice successivo alle 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 
} 

Aggiornamento:

Aggiungi queste righe per vedere versionCode presso nomi generati su apk

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") 
    } 
} 

Vedi risultato muggito di costruzione:

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 

informazioni da uno di loro, estratto dal 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 

Aggiornamento 2:

Pubblicato il mio test project at GitHub

+0

come fai a sapere con quale variante stai lavorando?Dal momento che voglio calcolare codici di versione differenti per ciascuna variante. Il codice calcolerebbe lo stesso codice di versione per tutte le varianti, giusto? – TWilly

+0

@TWilly, ha aggiornato il tuo codice e sembra che calcolerà diversi 'versionCode' per ogni variante, in base alla sua implementazione. – gio

+0

def apiVersion = variant.productFlavors.get (0) .versionCode sta ancora calcolando null quale è il mio problema originale – TWilly

Problemi correlati