Как установить versionName в APK-файле, используя gradle?
Я пытаюсь установить конкретный номер версии в автоматически сгенерированном имени файла APK.
Теперь Gradle генерирует myapp-release.apk
но я хочу, чтобы это выглядело примерно так myapp-release-1.0.apk
,
Я попытался переименовать варианты, которые кажутся грязными. Есть ли простой способ сделать это?
buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.each { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
Я попробовал код выше без удачи. Какие-либо предложения? (используя Gradle 1.6)
17 ответов
Это решило мою проблему: используя applicationVariants.all
вместо applicationVariants.each
buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.all { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
}
Обновить:
Таким образом, кажется, что это не работает с 0.14+ версиями плагина Android Studio Gradle.
Это делает трюк (ссылка на этот вопрос):
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-${variant.versionName}.apk"))
}
}
}
Мне нужно только изменить название версии в одном месте. Код тоже прост.
В приведенных ниже примерах будут создаваться файлы apk с именем MyCompany-MyAppName-1.4.8-debug.apk или MyCompany-MyAppName-1.4.8-release.apk в зависимости от выбранного варианта сборки.
См. Также: Как изменить имя файла отображения Proguard в Gradle для проекта Android
Решение для недавних плагинов Gradle
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.company.app"
minSdkVersion 13
targetSdkVersion 21
versionCode 14 // increment with every release
versionName '1.4.8' // change with every release
setProperty("archivesBaseName", "MyCompany-MyAppName-$versionName")
}
}
Вышеупомянутое решение было протестировано со следующими версиями плагина Android Gradle:
- 3.1.0 (март 2018 г.)
- 3.0.1 (ноябрь 2017 г.)
- 3.0.0 (октябрь 2017 г.)
- 2.3.2 (май 2017 г.)
- 2.3.1 (апрель 2017 г.)
- 2.3.0 (февраль 2017 г.)
- 2.2.3 (декабрь 2016 г.)
- 2.2.2
- 2.2.0 (сентябрь 2016 г.)
- 2.1.3 (август 2016 г.)
- 2.1.2
- 2.0.0 (апрель 2016 г.)
- 1.5.0 (2015/11/12)
- 1.4.0-бета6 (2015/10/05)
- 1.3.1 (2015/08/11)
Я буду обновлять этот пост по мере выхода новых версий.
Решение протестировано только на версиях 1.1.3-1.3.0
Следующее решение было протестировано со следующими версиями плагина Android Gradle:
- 1.3.0 (2015/07/30) - не работает, ошибка планируется исправить в 1.3.1
- 1.2.3 (2015/07/21)
- 1.2.2 (2015/04/28)
- 1.2.1 (2015/04/27)
- 1.2.0 (2015/04/26)
- 1.2.0-бета1 (2015/03/25)
- 1.1.3 (2015/03/06)
файл приложения Gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.company.app"
minSdkVersion 13
targetSdkVersion 21
versionCode 14 // increment with every release
versionName '1.4.8' // change with every release
archivesBaseName = "MyCompany-MyAppName-$versionName"
}
}
(ИЗМЕНЕНО для работы с Android Studio 3.0 и Gradle 4)
Я искал более сложную опцию переименования файла apk, и я написал эту в надежде, что она будет полезна для всех остальных. Переименовывает apk со следующими данными:
- аромат
- тип сборки
- версия
- Дата
Мне потребовалось немного исследований в классах Gradle и немного копирования / вставки из других ответов. Я использую Gradle 3.1.3.
В build.gradle:
android {
...
buildTypes {
release {
minifyEnabled true
...
}
debug {
minifyEnabled false
}
}
productFlavors {
prod {
applicationId "com.feraguiba.myproject"
versionCode 3
versionName "1.2.0"
}
dev {
applicationId "com.feraguiba.myproject.dev"
versionCode 15
versionName "1.3.6"
}
}
applicationVariants.all { variant ->
variant.outputs.all { output ->
def project = "myProject"
def SEP = "_"
def flavor = variant.productFlavors[0].name
def buildType = variant.variantData.variantConfiguration.buildType.name
def version = variant.versionName
def date = new Date();
def formattedDate = date.format('ddMMyy_HHmm')
def newApkName = project + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"
outputFileName = new File(newApkName)
}
}
}
Если вы скомпилируете сегодня (13-10-2016) в 10:47, вы получите следующие имена файлов в зависимости от выбранной вами разновидности и типа сборки:
- dev debug: myProject_dev_debug_1.3.6_131016_1047.apk
- релиз разработчика: myProject_dev_release_1.3.6_131016_1047.apk
- Отладка prod: myProject_prod_debug_1.2.0_131016_1047.apk
- релиз prod: myProject_prod_release_1.2.0_131016_1047.apk
Примечание: имя apk без выравнивания версии по-прежнему остается именем по умолчанию.
Подводя итог, для тех, кто не знает, как импортировать пакет в build.gradle
(как и я), используйте следующее buildTypes
,
buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.all { variant ->
def file = variant.outputFile
def manifestParser = new com.android.builder.core.DefaultManifestParser()
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) + ".apk"))
}
}
}
===== РЕДАКТИРОВАТЬ =====
Если вы установите свой versionCode
а также versionName
в вашем build.gradle
файл как это:
defaultConfig {
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName "1.0.0"
}
Вы должны установить это так:
buildTypes {
release {
signingConfig signingConfigs.releaseConfig
applicationVariants.all { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
}
====== РЕДАКТИРОВАТЬ с Android Studio 1.0 ======
Если вы используете Android Studio 1.0, вы получите такую ошибку:
Error:(78, 0) Could not find property 'outputFile' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@67e7625f.
Вы должны изменить build.Types
часть к этому:
buildTypes {
release {
signingConfig signingConfigs.releaseConfig
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
}
}
Если вы не укажете versionName в блоке defaultConfig, тогда defaultConfig.versionName
приведет к null
чтобы получить versionName из манифеста, вы можете написать следующий код в build.gradle:
import com.android.builder.DefaultManifestParser
def manifestParser = new DefaultManifestParser()
println manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)
Gradle 4
Синтаксис немного изменился в Gradle 4 (Android Studio 3+) (с output.outputFile
в outputFileName
, идея из этого ответа сейчас:
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
def newName = outputFileName
newName.replace(".apk", "-${variant.versionName}.apk")
outputFileName = new File(newName)
}
}
}
В моем случае я просто хотел найти способ автоматизировать генерацию разных apk
имя для release
а также debug
варианты. Мне удалось сделать это легко, поместив этот фрагмент как ребенок android
:
applicationVariants.all { variant ->
variant.outputs.each { output ->
def appName = "My_nice_name_"
def buildType = variant.variantData.variantConfiguration.buildType.name
def newName
if (buildType == 'debug'){
newName = "${appName}${defaultConfig.versionName}_dbg.apk"
} else {
newName = "${appName}${defaultConfig.versionName}_prd.apk"
}
output.outputFile = new File(output.outputFile.parent, newName)
}
}
Для нового плагина Android gradle 3.0.0 вы можете сделать что-то вроде этого:
applicationVariants.all { variant ->
variant.outputs.all {
def appName = "My_nice_name_"
def buildType = variant.variantData.variantConfiguration.buildType.name
def newName
if (buildType == 'debug'){
newName = "${appName}${defaultConfig.versionName}_dbg.apk"
} else {
newName = "${appName}${defaultConfig.versionName}_prd.apk"
}
outputFileName = newName
}
}
Это производит что-то вроде: My_nice_name_3.2.31_dbg.apk
Другой альтернативой является использование следующего:
String APK_NAME = "appname"
int VERSION_CODE = 1
String VERSION_NAME = "1.0.0"
project.archivesBaseName = APK_NAME + "-" + VERSION_NAME;
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
applicationId "com.myapp"
minSdkVersion 15
targetSdkVersion 21
versionCode VERSION_CODE
versionName VERSION_NAME
}
.... // Rest of your config
}
Это установит "appname-1.0.0" для всех ваших выходных apk.
Правильный способ переименовать apk, как в ответе @Jon
defaultConfig {
applicationId "com.irisvision.patientapp"
minSdkVersion 24
targetSdkVersion 22
versionCode 2 // increment with every release
versionName "0.2" // change with every release
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//add this line
archivesBaseName = "AppName-${versionName}-${new Date().format('yyMMdd')}"
}
Или другим способом вы можете достичь тех же результатов с
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
applicationVariants.all { variant ->
variant.outputs.all { output ->
def formattedDate = new Date().format('yyMMdd')
outputFileName = "${outputFileName.replace(".apk","")}-v${defaultConfig.versionCode}-${formattedDate}.apk"
}
}
}
Есть много ответов, которые являются правильными либо в полном объеме, либо после некоторых изменений. Но я собираюсь добавить свой в любом случае, так как у меня была проблема со всеми из них, потому что я использовал сценарии для динамического генерирования VersionName и VersionCode путем подключения к preBuild
задача.
Если вы используете какой-то похожий подход, это код, который будет работать:
project.android.applicationVariants.all { variant ->
variant.preBuild.doLast {
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-${variant.versionName}@${variant.versionCode}.apk"))
}
}
}
Объяснить: так как я переопределяю код версии и имя в первом действии preBuild
Я должен добавить переименование файла в конце этой задачи. Так что Gradle будет делать в этом случае:
Введите код версии / имя-> выполнить действия preBuild -> заменить имя для apk
applicationVariants.all { variant ->
variant.outputs.all { output ->
output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk")
}
}
В моем случае я решаю эту ошибку таким образом
добавив SUFFIX к версии Debug, в этом случае я добавляю текст "-DEBUG" в мое развертывание Debug
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
defaultConfig {
debuggable true
versionNameSuffix "-DEBUG"
}
}
}
Как я ответил здесь, если вы хотите добавить название версии и код версии в выходной файл, сделайте это так:
applicationVariants.all { variant ->
variant.outputs.all {
def versionName = variant.versionName
def versionCode = variant.versionCode
def variantName = variant.name
outputFileName = "${rootProject.name}" + '_' + variantName + '_' + versionName + '_' + versionCode + '.apk'
}
}
Для последних версий Gradle вы можете использовать следующий фрагмент:
Сначала установите местоположение манифеста приложения
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
{
}
И позже в build.gradle
import com.android.builder.core.DefaultManifestParser
def getVersionName(manifestFile) {
def manifestParser = new DefaultManifestParser();
return manifestParser.getVersionName(manifestFile);
}
def manifestFile = file(android.sourceSets.main.manifest.srcFile);
def version = getVersionName(manifestFile)
buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.each { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + versionName + ".apk"))
}
}
Отрегулируйте, если у вас есть разные манифесты для типа сборки. но так как у меня есть один - отлично работает для меня.
Вы также можете добавить отформатированное время сборки к имени apk, как показано ниже:
setProperty("archivesBaseName", "data-$versionName " + (new Date().format("HH-mm-ss")))
Начиная с Android Studio 1.1.0, эта комбинация работала в теле андроида build.gradle
файл. Это если вы не можете понять, как импортировать данные XML-файла манифеста. Хотелось бы, чтобы Android Studio больше его поддерживал, но просто поиграйте со значениями, пока не получите желаемый вывод имени apk:
defaultConfig {
applicationId "com.package.name"
minSdkVersion 14
targetSdkVersion 21
versionCode 6
versionName "2"
}
signingConfigs {
release {
keyAlias = "your key name"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "appName_" + versionName + ".apk"))
}
}
}
}
Вот как вы можете сделать это в Kotlin DSL:
applicationVariants.all {
outputs.all {
this as com.android.build.gradle.internal.api.ApkVariantOutputImpl
val apkName = outputFileName.replace(".apk", "-" + defaultConfig.versionName + ".apk")
outputFileName = apkName
}
}