Как установить versionName в APK filename, используя 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)
14 ответов
мне нужно только изменить имя версии в одном месте. Код тоже прост.
в приведенных ниже примерах будут созданы файлы 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-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)
приложение 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"
}
}
это решило мою проблему: использование 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"))
}
}
}
(отредактировано для работы с Android Studio 3.0 и Gradle 4)
Я искал более сложный вариант переименования имени файла apk, и я написал это в надежде, что это полезно для кого-то еще. Он переименовывает apk со следующими данными:
- вкус
- построить типа
- версия
- дата
Мне потребовалось немного исследований в классы gradle и немного копирования/вставки из других ответов. Я использую ш 3.1.3.
в построении.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
- 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
Примечание: unaligned версия 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)
подводя итог, для тех, кто не знает как импортировать пакет в 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
в своем такой:
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"))
}
}
}
}
в моем случае, я просто хотел найти способ автоматизировать создание различных 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.
ш 4
синтаксис немного изменился в Gradle 4 (Android Studio 3+) (от output.outputFile
to outputFileName
, представление от ответ сейчас:
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
def newName = outputFileName
newName.replace(".apk", "-${variant.versionName}.apk")
outputFileName = new File(newName)
}
}
}
есть много ответов, которые являются правильными либо в полном объеме или после некоторых изменений. Но я все равно добавлю свой, так как у меня была проблема со всеми из них, потому что я использовал скрипты для динамического создания 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 будет делать в этом случае:
Inject код версии / имя - > do preBuild действия - > заменить имя для 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"
}
}
}
applicationVariants.all { variant ->
variant.outputs.all { output ->
output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk")
}
}
в моем случае я решаю эту ошибку таким образом
добавление суффикса в отладочную версию, в этом случае я добавляю текст "- DEBUG " в мой debug deploy
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
defaultConfig {
debuggable true
versionNameSuffix "-DEBUG"
}
}
}
для последних версий gradle вы можете использовать следующий фрагмент:
Сначала установите местоположение манифеста приложения
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
{
}
и позже в строй.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"))
}
}
отрегулируйте, если у вас разные манифесты для каждого типа сборки. но так как у меня один - отлично работает для меня.
начиная с Android Studio 1.1.0, я обнаружил, что эта комбинация работает в android тело . Это если вы не можете понять, как импортировать данные 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"))
}
}
}
}