Как установить имя версии в имени файла 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:

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"))
                }
            }
        }
    }