Intereting Posts
Фоновое изображение Android замедляет приложение Кинжал 2: @ Компонент.Builder пропускает сеттеры для необходимых модулей или компонентов: ` Графический звуковой анализатор микрофона Кордоба не может построить для Android после настройки конфигурации Установка системного времени ROOTED Как получить необработанную запись сканирования (рекламный пакет) при сканировании классических устройств Bluetooth на Android? Использование календаря для определения дат AM или PM Android multitouch: ACTION_UP не всегда называется? Как установить пользовательский шрифт для диалогового окна предупреждения в Android? Как использовать библиотеку поддержки предпочтений v7 / v14? Невозможно показать клавиатуру автоматически в SearchView PopupWindow вне экрана, когда размер неуточнен Как определить состояние питания? Как реализовать распознавание жестов при износе android Использование listpreference и получение ключа работает, но не кнопка ok

Как автоматически увеличить и освободить подписанный apk в Android Studio с использованием сценария Gradle

Я пытаюсь автоматически обновить параметры versionName и VersionCode в Android Manifest и использовать их в имени выходного файла вместо «app-release.apk».

С этого сайта я добавил этот код в файл build.gradle:

import java.util.regex.Pattern import com.android.builder.core.DefaultManifestParser def mVersionCode def mNextVersionName def newName task ('increaseVersionCode') << { def manifestFile = file("src/main/AndroidManifest.xml") def pattern = Pattern.compile("versionCode=\"(\\d+)\"") def manifestText = manifestFile.getText() def matcher = pattern.matcher(manifestText) matcher.find() mVersionCode = Integer.parseInt(matcher.group(1)) def manifestContent = matcher.replaceAll("versionCode=\"" + ++mVersionCode + "\"") manifestFile.write(manifestContent) } task ('incrementVersionName') << { def manifestFile = file("src/main/AndroidManifest.xml") def patternVersionNumber = Pattern.compile("versionName=\"(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)\"") def manifestText = manifestFile.getText() def matcherVersionNumber = patternVersionNumber.matcher(manifestText) matcherVersionNumber.find() def majorVersion = Integer.parseInt(matcherVersionNumber.group(1)) def minorVersion = Integer.parseInt(matcherVersionNumber.group(2)) def pointVersion = Integer.parseInt(matcherVersionNumber.group(3)) def buildVersion = Integer.parseInt(matcherVersionNumber.group(4)) mNextVersionName = majorVersion + "." + minorVersion + "." + pointVersion + "." + (buildVersion + 1) def manifestContent = matcherVersionNumber.replaceAll("versionName=\"" + mNextVersionName + "\"") manifestFile.write(manifestContent) } tasks.whenTaskAdded { task -> if (task.name == 'generateReleaseBuildConfig') { task.dependsOn 'increaseVersionCode' task.dependsOn 'incrementVersionName' } } 

Этот код работает отлично, 2 задачи запускаются и корректно обновляют файл манифеста. Теперь я хочу использовать 2 переменные mVersionCode и mNextVersionName в блоке release внутри buildTypes как это:

 newName = defaultConfig.applicationId + "-" + mNextVersionName + " (" + mVersionCode + ").apk" applicationVariants.all { variant -> variant.outputs.each {output -> def file = output.outputFile output.outputFile = new File(file.parent, file.name.replace("app-release.apk", newName)) } } 

Но возвращаемое значение 2 равно null.

Я также попытался установить свойства и дополнительные свойства:

 task.setProperty("vName", mNextVersionName) ext.vName = mNextVersionName extensions.extraProperties.set("vName", mNextVersionName) 

В 2 задачах и получить их в блоке release без везения.

Есть ли у кого-то идеи о том, как это сделать?

Solutions Collecting From Web of "Как автоматически увеличить и освободить подписанный apk в Android Studio с использованием сценария Gradle"

Все верно, вот мой код build.gradle модуля приложения:

 apply plugin: 'com.android.application' apply from: 'versionalization.gradle' def genVersionName = VersionInfo.versionName def genVersionCode = VersionInfo.versionCode android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.vincestyling.exerciseapk" minSdkVersion 10 targetSdkVersion 22 versionName genVersionName versionCode genVersionCode } } android.applicationVariants.all { variant -> def taskSuffix = variant.name.capitalize() def assembleTaskName = "assemble${taskSuffix}" if (tasks.findByName(assembleTaskName)) { def processAPKTask = tasks.create(name: "process${taskSuffix}Apk", type: Copy) { variant.outputs.each { output -> from output.outputFile into output.outputFile.parent def newApkName = android.defaultConfig.applicationId + "-" + variant.buildType.name + "-" + genVersionName + " (" + genVersionCode + ").apk" rename ~/(.+)/, newApkName } } tasks[assembleTaskName].finalizedBy processAPKTask } } 

versionalization.gradle который применяется на голове, является тем, что я использую для увеличения версии VersionInfo , а затем возвращаю два значения для использования.

 task VersionInfo { String FACTOR_KEY = "BUILD_NUMBER_FACTOR" File buildDir = file("build") buildDir.mkdir() File factorPropFile = new File(buildDir, "kbuildfactor.prop") Properties props = new Properties() if (factorPropFile.exists()) { props.load(new FileInputStream(factorPropFile)) } int buildNumberFactor = props.get(FACTOR_KEY) as Integer ?: 0 buildNumberFactor += 1 props.put(FACTOR_KEY, buildNumberFactor as String) props.store(new FileOutputStream(factorPropFile), null) String BASE_VERSION_NAME = "BASE_VERSION_NAME" String BASE_VERSION_CODE = "BASE_VERSION_CODE" File versionPropFile = file("versioning.properties") props.load(new FileInputStream(versionPropFile)) String baseVersionName = props.get(BASE_VERSION_NAME) as String Integer baseVersionCode = props.get(BASE_VERSION_CODE) as Integer ext.versionName = baseVersionName + "." + buildNumberFactor ext.versionCode = baseVersionCode * 1000 + buildNumberFactor } 

Это довольно просто, прочитайте два файла, чтобы взять необходимые поля для создания информации о версии.

Мы скопируем / переименуем окончательный APK.

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

 android.applicationVariants.all { variant -> variant.outputs.each {output -> def newApkName = android.defaultConfig.applicationId + "-" + variant.buildType.name + "-" + genVersionName + " (" + genVersionCode + ").apk" def oldApkName = "app-${variant.buildType.name}.apk" def file = output.outputFile output.outputFile = new File(file.parent, file.name.replace(oldApkName, newApkName)) } } 

Никто не ответил, но я нашел рабочее решение. Мне это не нравится, это можно сделать лучше, но пока это единственный обходной путь, который я нашел.

Я все еще ищу лучшее решение, если оно у вас есть, я буду рад прочитать и использовать его вместо моего.


Итак, я добавил новую задачу в файл gradle.build, она просто копирует файл app-release.apk и переименовывает его, используя значения в файле манифеста:

 task copia{ dependsOn('assembleRelease') def manifestFile = file("src/main/AndroidManifest.xml") def patternVersionNumber = Pattern.compile("versionName=\"(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)\"") def manifestText = manifestFile.getText() def matcherVersionNumber = patternVersionNumber.matcher(manifestText) matcherVersionNumber.find() def majorVersion = Integer.parseInt(matcherVersionNumber.group(1)) def minorVersion = Integer.parseInt(matcherVersionNumber.group(2)) def pointVersion = Integer.parseInt(matcherVersionNumber.group(3)) def buildVersion = Integer.parseInt(matcherVersionNumber.group(4)) def mVersionName = majorVersion + "." + minorVersion + "." + pointVersion + "." + (buildVersion) def pattern = Pattern.compile("versionCode=\"(\\d+)\"") def matcher = pattern.matcher(manifestText) matcher.find() def myVersionCode = Integer.parseInt(matcher.group(1)) copy { from 'app-release.apk' rename { String fileName -> fileName.replace('app-release.apk', 'com.walker93.catpadova-' + mVersionName + ' (' + myVersionCode + ').apk') } into 'apk_outputs' } } 

Как вы можете видеть, это всего лишь копия и отредактированная версия кода в двух предыдущих задачах с функцией copy {} (здесь docs ), она считывает значения versionName и versionCode без их увеличения, а затем помещает их в новое имя файла Я собираюсь заменить.

Эта задача по-прежнему требует еще двух задач, поэтому в итоге у вас будет 3 задачи. В первой строке этой задачи существует dependsOn(assembleRelease) . Это очень важно, он будет запускать все остальные задачи по умолчанию для выпуска по умолчанию (включая наши 2 задачи, которые увеличиваются и записываются в манифесте), которые генерируют обновленный и подписанный apk.

Теперь, если вы попытаетесь запустить «сгенерировать подписанный APK …», вы заметите, что эта задача не будет выполняться. Вместо этого вам придется вручную запустить его:

Добавьте свою задачу в «конфигурации запуска», как это, и тогда вы должны будете запустить задачу здесь или здесь, когда хотите опубликовать подписанный apk с пользовательским именем. Если вы хотите сгенерировать подписанный apk с именем по умолчанию (и все еще увеличивать versionName и versionCode), просто используйте параметр «сгенерировать подписанный APK …», как раньше.

Используя этот метод, нет необходимости добавлять код в часть buildTypes файла.

Чтобы использовать дополнительные расширения свойств, вам необходимо определить их следующим образом:

 ext { mVersionCode = 0 mNextVersionName = "" } 

Тогда вы сможете получить доступ к ним свободно в своем buildscript, просто используя их точно так же, как вы использовали их в своих задачах выше.