Как установить versionName в имени файла APK с помощью gradle?
Я пытаюсь установить конкретный номер версии в 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 с именем named MyCompany-MyAppName-1.4.8-debug.apk или MyCompany-MyAppName-1.4.8-release.apk в зависимости от выбранного варианта построения.
Читайте Также: как изменить имя файла отображения proguard в gradle для Android project
решение для недавнего 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 file:
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.eachbuildTypes { 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, вы получите следующие имена файлов в зависимости от выбранного вами типа flavor и build:
- dev debug: myProject_dev_debug_1.3.6_131016_1047.apk
- версию: 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чтобы получить имя версии из манифеста, вы можете написать следующий код в сборке.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")) } } }===== редактировать =====
если
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.
Gradle 4
синтаксис немного изменился в Gradle 4 (Android Studio 3+) (от
output.outputFiletooutputFileName, представление от ответ сейчас: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 будет делать в этом случае:ввести код версии / имя - > сделать предварительно построенные действия - > заменить имя для apk
правильный способ переименовать apk, согласно @Jon answer
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")) } } } }
Comments