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
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
@TWilly, ha aggiornato il tuo codice e sembra che calcolerà diversi 'versionCode' per ogni variante, in base alla sua implementazione. – gio
def apiVersion = variant.productFlavors.get (0) .versionCode sta ancora calcolando null quale è il mio problema originale – TWilly