Как установить имя версии в имени файла APK с помощью gradle?
Я пытаюсь установить конкретный номер версии в имени файла APK с открытым кодом gradle.
Теперь 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)
Ответы
Ответ 1
Это решило мою проблему: используя 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"))
}
}
}
Update:
Итак, похоже, что это не работает с 0.14+ версиями плагина android studio gradle.
Это делает трюк (ссылка из этого question
):
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-${variant.versionName}.apk"))
}
}
}
Ответ 2
Мне нужно только изменить имя версии в одном месте. Код также прост.
В приведенных ниже примерах будут созданы файлы 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.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-beta6 (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-beta1 (2015/03/25)
- 1.1.3 (2015/03/06)
app 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"
}
}
Ответ 3
Я искал более сложный вариант переименования файлов apk, и я написал это в надежде, что он будет полезен для кого-либо еще. Он переименовывает apk со следующими данными:
- вкус
- тип сборки
- версия
- Дата
Мне потребовалось немного исследований в классах gradle и немного копировать/вставить из других ответов. Я использую gradle 2.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.each { 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"
output.outputFile = new File(output.outputFile.parent, newApkName)
}
}
}
Если вы собрали сегодня (13-10-2016) в 10:47, вы получите следующие имена файлов в зависимости от выбранного вами вкуса и типа сборки:
- dev debug: myProject_ dev_debug_1.3.6 _131016_1047.apk
- dev release: myProject_ dev_release_1.3.6 _131016_1047.apk
- prod debug: myProject_ prod_debug_1.2.0 _131016_1047.apk
- prod release: myProject_ prod_release_1.2.0 _131016_1047.apk
Примечание: имя файла apk без знака по-прежнему является значением по умолчанию.
Ответ 4
Если вы не укажете 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)
Ответ 5
Подводя итог, для тех, кто не знает, как импортировать пакет в 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"))
}
}
}
===== EDIT =====
Если вы установите 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"))
}
}
}
====== EDIT с Android Studio 1.0 ======
Если вы используете Android Studio 1.0, вы получите сообщение об ошибке:
Error:(78, 0) Could not find property 'outputFile' on com.and[email protected]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"))
}
}
}
}
Ответ 6
Другой альтернативой является использование следующего:
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.
Ответ 7
В моем случае я просто хотел найти способ автоматизации генерации разных имен 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
Ответ 8
Есть много ответов, которые верны либо полностью, либо после некоторых изменений. Но я все равно добавлю свое имя, поскольку у меня возникла проблема со всеми из них, потому что я использовал сценарии для генерации 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 в этом случае:
Вставить код версии /name → выполнить действия preBuild → заменить имя для apk
Ответ 9
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)
}
}
}
Ответ 10
В моем случае я решаю эту ошибку таким образом
добавление 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"
}
}
}
Ответ 11
Для последних версий 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"))
}
}
Отрегулируйте, если у вас есть разные манифесты для каждого типа сборки. но так как у меня есть единственный - отлично работает для меня.
Ответ 12
Как и в случае с Android Studio 1.1.0, я обнаружил, что эта комбинация работает в теге android файла 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"))
}
}
}
}