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





приложение андроид (12)


Если вы не укажете имя 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)

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




Начиная с Android Studio 1.1.0, я обнаружил, что эта комбинация работает в корпусе build.gradle файла 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"))
                }
            }
        }
    }



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




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

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




    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk")
        }
    }



Есть много ответов, которые верны либо полностью, либо после некоторых изменений. Но я все равно добавлю мое, поскольку у меня возникла проблема со всеми из них, потому что я использовал сценарии для генерации 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 я должен добавить переименование файла в конец этой задачи. Итак, какой град будет делать в этом случае:

Вставить код версии / name-> выполнить действия preBuild -> заменить имя для apk




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

  • аромат
  • тип сборки
  • версия
  • Дата

Мне потребовалось немного исследований в классах градлей и немного копий / пасты из других ответов. Я использую 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 без знака по-прежнему является значением по умолчанию.




Подводя итог, для тех, кто не знает, как импортировать пакет в 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 и build.gradle файле 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"))
                }
            }
        }
    }



В моем случае я решаю эту ошибку таким образом

добавление 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"
            }
        }
    }



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

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.




Это решило мою проблему: 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"))
        }
    }
}



Есть несколько способов сделать это:

  1. Используйте функцию «Профиль или отладка APK» в Android Studio 3.0.

    Это позволяет вам открывать и исследовать APK в Android Studio. Классы декомпилируются в smali. Ресурсы не извлекаются, и такие вещи, как «Перейти к определению», «Найти все ссылки» и отладки, не работают без исходного кода (android studio 3.0 canary 9). Некоторые smali-функции могут работать с smalidea .

  2. Используйте jadx .

    Jadx декомпилирует код в заданном APK для исходных файлов java.

  3. Используйте apktool .

    Apktool - это инструмент командной строки, который извлекает ресурсы и декомпилирует код в smali для данного apk. Вы также можете перекомпилировать, используя apktool. Вот пример этого в действии:

    $ apktool d test.apk
    I: Using Apktool 2.2.4 on test.apk
    I: Loading resource table...
    I: Decoding AndroidManifest.xml with resources...
    I: Loading resource table from file: 1.apk
    I: Regular manifest package...
    I: Decoding file-resources...
    I: Decoding values */* XMLs...
    I: Baksmaling classes.dex...
    I: Copying assets and libs...
    I: Copying unknown files...
    I: Copying original files...
    $ apktool b test
    I: Using Apktool 2.2.4 on test
    I: Checking whether sources has changed...
    I: Smaling smali folder into classes.dex...
    I: Checking whether resources has changed...
    I: Building resources...
    I: Building apk file...
    I: Copying unknown files/dir...
    






android build gradle apk android-gradle