Поручить Android Gradle script удалить неприглаженные апки и очистить файлы артефакта
Я начал использовать систему сборки Gradle несколько дней назад и получил script для работы так, как я хотел, вот он:
buildscript {
repositories {
mavenCentral()
}
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 17
buildToolsVersion '18.0.1'
productFlavors {
flavor1 {
packageName "flavor1"
}
flavor2 {
packageName "flavor2"
}
flavor3 {
packageName "flavor3"
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
signingConfigs {
release {
storeFile file("test.keystore")
storePassword "*****"
keyAlias "****"
keyPassword "*****"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
}
Как вы можете видеть, здесь нет ничего фантастического, просто создавая 3 варианта приложения и подписывая их одним и тем же ключом. Я просто запускаю Gradle assembleRelease и через 20 секунд у меня есть apks в папке сборки. Но проблема в том, что есть другие файлы, которые мне не нужны, например appname-release-unaligned.apk.
Я знаю, что этот файл необходим до того, как apk может быть подписан, но хотел бы добавить задачу для удаления этих файлов в моем Gradle script?
Также, если это возможно, я хотел бы удалить все остальные (shell я говорю файлы артефакта), созданные во время сборки. По сути, я хотел бы запустить что-то вроде Gradle clean, но оставить файлы сборки apk. Как это сделать?
БОНУС: Если у кого-то есть указатели на то, как я могу оптимизировать этот script и включить zip-align и proguard (без пользовательских правил просто по умолчанию obfuscation в порядке), что также поможет мне, так как я очень новичок в Gradle и ни один из приведенных ниже руководств объясняет эти шаги.
Ответы
Ответ 1
ОБНОВЛЕНИЕ 1-dec-2017.
Вероятно, не работает с gradle 3.0. См. Комментарий "deepSymmetry" ниже.
Довольно старая тема, но вот современное решение для удаления ненужного "невысокого" файла. Это очень удобно, особенно на серверах CI, чтобы сэкономить некоторое пространство.
Стыдно, что плагин не обеспечивает привязку к задаче zipAlign, поэтому нам нужно зацепить задачу "собрать", которая идет после "zipAlign".
Работает с последним gradle плагином 1.2.0 (gradle -2.4), но должен быть действительным для 1. +
// delete unaligned files
android.applicationVariants.all { variant ->
variant.assemble.doLast {
variant.outputs.each { output ->
println "aligned " + output.outputFile
println "unaligned " + output.packageApplication.outputFile
File unaligned = output.packageApplication.outputFile;
File aligned = output.outputFile
if (!unaligned.getName().equalsIgnoreCase(aligned.getName())) {
println "deleting " + unaligned.getName()
unaligned.delete()
}
}
}
}
И еще один, если вы предпочитаете проверять флаг zipAlignEnable, но в этом случае вы будете привязаны к "невыровненной" константе в имени файла, потому что релиз строит с помощью zipAlignEnabled = true И без подписанияConfig пропустить задачу zipAlign и создать только один файл: 'приложение-релиз-unsigned.apk'.
// delete unaligned files
android.applicationVariants.all { variant ->
variant.assemble.doLast {
variant.outputs.each { output ->
println "aligned " + output.outputFile
println "unaligned " + output.packageApplication.outputFile
File file = output.packageApplication.outputFile;
if (variant.buildType.zipAlignEnabled && file.getName().contains("unaligned")) {
println "deleting " + file.getName()
file.delete()
}
}
}
}
Я использую первую в случае, если кто-то заботится.
Ответ 2
Я заметил, что время от времени есть какая-то деятельность по этому вопросу, так что вот как я решил проблему, если она кому-то помогает. Просто определите новую задачу для копирования файла, а затем установите порядок выполнения.
task copyTask(type: Copy) {
from 'build/apk'
into 'apks'
exclude '**/*-unaligned.apk'
}
task allTask(dependsOn: ['clean', 'assembleRelease', 'copyTask']){
clean.mustRunAfter copyTask
copyTask.mustRunAfter assembleRelease
}
то просто вызовите эту allTask, когда хотите сделать сборку.
Ответ 3
Я могу хотя бы ответить на ваш бонусный вопрос:
buildTypes {
release {
runProguard true
signingConfig signingConfigs.release
}
}
Если у вас есть специальные правила proguard, просто введите эту строку в свой defaultConfig
или к вашему продукту:
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
Первое правило proguard является общим с вашего Android SDK, второе из вашего модуля-каталога.
ZipAlign включен по умолчанию, если вы создаете проект с вариантом сборки release
.
Ответ 4
Просто немного измененный ответ от @PSIXO, рассматривающий Android Studio 1.5, запуск тестовых примеров и переименование файла apk для лучшей интеграции CI:
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.mydemoci"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
archivesBaseName = "$applicationId-v$versionName"
}
}
task copyOutputApk(type: Copy) {
from 'build/outputs/apk'
into 'apk'
exclude '**/*-unaligned.apk'
}
task buildTestDebug(dependsOn: ['clean', 'assembleDebug', 'check', 'copyOutputApk']) {
check.mustRunAfter assembleDebug
copyOutputApk.mustRunAfter check
clean.mustRunAfter copyOutputApk
}
Чтобы начать выполнение сборки gradlew buildTestDebug