[android] Как установить имя версии в имени файла APK с помощью gradle?



Answers

Это решило мою проблему: using 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 + версиями плагинов для студии adroid.

Это делает трюк (ссылка на этот question ):

android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(
                    output.outputFile.parent,
                    output.outputFile.name.replace(".apk", "-${variant.versionName}.apk"))
        }
    }
}
Question

Я пытаюсь установить конкретный номер версии в автогенерированном имени файла 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"))
    }
}

Я пробовал код выше, не повезло. Какие-либо предложения? (с использованием градиента 1.6)




В моем случае я просто хотел найти способ автоматизации генерации разных имен 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)
    }
}

Для нового плагина 3.0.0 для Android 3.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 что-то вроде: My_nice_name_3.2.31_dbg.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"
            }
        }
    }



Если вы не укажете имя versionName в блоке defaultConfig.versionName то defaultConfig.versionName приведет к defaultConfig.versionName

для получения versionName из манифеста вы можете написать следующий код в build.gradle:

import com.android.builder.DefaultManifestParser

def manifestParser = new DefaultManifestParser()
println manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)



Для последних версий 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"))
    }
}

Отрегулируйте, если у вас есть разные манифесты для каждого типа сборки. но так как у меня есть единственная - отлично работает для меня.




Другой вариант - использовать следующее:

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.




Related