J'ai un projet Android qui utilise Gradle pour le processus de construction. Maintenant, je veux ajouter deux types de compilation supplémentaires, la production intermédiaire et la production, afin que mon build.gradle contienne:
Android {
buildTypes {
release {
runProguard false
proguardFile getDefaultProguardFile('proguard-Android.txt')
}
staging {
signingConfig signingConfigs.staging
applicationVariants.all { variant ->
appendVersionNameVersionCode(variant, defaultConfig)
}
}
production {
signingConfig signingConfigs.production
}
}
}
et mon appndVersionNameVersionCode ressemble à:
def appendVersionNameVersionCode(variant, defaultConfig) {
if(variant.zipAlign) {
def file = variant.outputFile
def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
variant.outputFile = new File(file.parent, fileName)
}
def file = variant.packageApplication.outputFile
def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
variant.packageApplication.outputFile = new File(file.parent, fileName)
}
Si j'exécute la tâche assembleStaging , alors j'obtiens le nom propre de mon apk, mais lorsque j'exécute assembleProduction , alors les noms de mes apk sont modifiés (comme dans le cas de la cascade). Par exemple:
MyApp-defaultFlavor-production-9.9.9-999.apk
MyApp-defaultFlavor-production-9.9.9-999.apk
Il semble que le type de construction en production soit exécuté appendVersionNameVersionCode . Comment puis-je l'éviter?
Comme CommonsWare l’a écrit dans son commentaire, vous ne devez appeler appendVersionNameVersionCode
que pour les variantes de présentation. Vous pouvez facilement le faire, il suffit de modifier légèrement votre méthode appendVersionNameVersionCode
, par exemple:
def appendVersionNameVersionCode(variant, defaultConfig) {
//check if staging variant
if(variant.name == Android.buildTypes.staging.name){
if(variant.zipAlign) {
def file = variant.outputFile
def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
variant.outputFile = new File(file.parent, fileName)
}
def file = variant.packageApplication.outputFile
def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
variant.packageApplication.outputFile = new File(file.parent, fileName)
}
}
La solution de Lecho ne fonctionne pas pour Android Gradle Plugin 0.14.3+ à cause de la suppression des APIS obsolètes: http://tools.Android.com/tech-docs/new-build-system
Presque 1.0: propriétés/méthodes obsolètes supprimées
...
- Variant.packageApplication/zipAlign/createZipAlignTask/outputFile/processResources/processManifest (utilisez la sortie de variante)
Ce qui suit fonctionne pour moi:
def appendVersionNameVersionCode(variant, defaultConfig) {
variant.outputs.each { output ->
if (output.zipAlign) {
def file = output.outputFile
def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
output.outputFile = new File(file.parent, fileName)
}
def file = output.packageApplication.outputFile
def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
output.packageApplication.outputFile = new File(file.parent, fileName)
}
}
J'en ai utilisé une petite version générique. Construisez et installez bien . Par exemple, votre nom de projet est "Salade", puis pour la mise en place de l'apk, le nom sera "Salade-staging-jj-MM-AA", vous pouvez également changer pour le débogage et la libération d'apk. espérons que ma solution sera meilleure .
Changement dans projectName/app/build.gradle
buildTypes {
debug{
}
staging{
debuggable true
signingConfig signingConfigs.debug
applicationVariants.all { variant ->
variant.outputs.each { output ->
def date = new Date();
def formattedDate = date.format('dd-MM-yyyy')
def appName = getProjectDir().getParentFile().name
output.outputFile = new File(output.outputFile.parent,
output.outputFile.name.replace(getProjectDir().name +"-staging", "$appName-staging-" + formattedDate)
//for Debug use output.outputFile = new File(output.outputFile.parent,
// output.outputFile.name.replace("-debug", "-" + formattedDate)
)
}
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
changer le nom de l'application Android ref
Voici ce que j'ai fait:
def appName
if (project.hasProperty("applicationName")) {
appName = applicationName
} else {
appName = parent.name
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", appName + "_V" + versionCode + ".apk"))
}
}