Изменить имя apk с помощью Gradle
У меня есть проект Android, который использует Gradle для процесса сборки. Теперь я хочу добавить два дополнительных типа сборки и постановку, поэтому мой файл build.gradle содержит:
android {
buildTypes {
release {
runProguard false
proguardFile getDefaultProguardFile('proguard-android.txt')
}
staging {
signingConfig signingConfigs.staging
applicationVariants.all { variant ->
appendVersionNameVersionCode(variant, defaultConfig)
}
}
production {
signingConfig signingConfigs.production
}
}
}
и мой appndVersionNameVersionCode выглядит так:
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)
}
Если я выполняю задачу assembleStaging, тогда я получаю собственное имя apk, но когда я выполняю сборку, я получаю измененные имена моего apk (например, в стадии постановки). Например:
MyApp-defaultFlavor-production-9.9.9-999.apk
MyApp-defaultFlavor-production-9.9.9-999.apk
Похоже, что в производственной форме сборки выполняется appendVersionNameVersionCode. Как я могу избежать этого?
Ответы
Ответ 1
Как CommonsWare написал в своем комментарии, вы должны называть appendVersionNameVersionCode
только для вариантов постановки. Вы можете легко это сделать, просто слегка измените свой метод appendVersionNameVersionCode
, например:
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)
}
}
Ответ 2
Решение Lecho не работает для Android Gradle Плагин 0.14.3+ из-за удаления устаревших APIS:
http://tools.android.com/tech-docs/new-build-system
Почти 1.0: удаленные устаревшие свойства/методы
...
- Variant.packageApplication/zipAlign/createZipAlignTask/outputFile/processResources/processManifest (используйте вариант вывода)
Для меня работает следующее:
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)
}
}
Ответ 3
У меня есть небольшая общая версия. строить и устанавливать штраф.
например, ваше имя проекта - это "Салат", тогда для постановки названия apk будет "Salad-staging-dd-MM-YY", вы также можете изменить для debug и release apk. надеюсь, что мое решение будет лучше.
Изменение в 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'
}
чтобы изменить название приложения Android ref
Ответ 4
Вот что я сделал:
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"))
}
}