我几天前开始使用Gradle构建系统并让脚本按照我的意愿工作,这里是:
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脚本中添加一个删除这些文件的任务吗?
此外,如果有可能我想删除在构建期间生成的所有其他(shell我说的artefact文件)。基本上我想运行像gradle clean这样的东西,但留下构建apk文件。我该怎么做?
BONUS:如果有人有指针我如何优化这个脚本并启用zip align和proguard(没有自定义规则,只是默认模糊处理就可以了),这对我也很有帮助,因为我是新手,没有教程我接着解释了这些步骤。
答案 0 :(得分:20)
2018年2月更新。 使用Android Gradle插件3.0或更高版本,此块将导致生成错误。请参阅下面的“deepSymmetry”评论。
“修复”是完全删除该块,插件的默认行为将自动清理中间临时apks(例如:app-debug-unaligned.apk)。
相当古老的话题,但这里是删除不必要的“未对齐”文件的现代解决方案。这在CI服务器上非常方便,可以节省一些空间。
令人遗憾的是插件没有为'zipAlign'任务提供钩子,因此我们需要挂钩'zipAlign'之后的'assemble'任务。
适用于上一个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并且没有signedConfig跳过'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()
}
}
}
}
如果有人关心,我会使用第一个。
答案 1 :(得分:9)
我注意到这个问题上不时有一些活动,所以这就是我解决问题的方法,如果它有帮助的话。只需定义新任务即可复制文件,然后设置执行顺序。
task copyTask(type: Copy) {
from 'build/apk'
into 'apks'
exclude '**/*-unaligned.apk'
}
task allTask(dependsOn: ['clean', 'assembleRelease', 'copyTask']){
clean.mustRunAfter copyTask
copyTask.mustRunAfter assembleRelease
}
然后在你想要进行构建时调用this allTask。
答案 2 :(得分:1)
我至少可以回答你的奖金问题:
buildTypes {
release {
runProguard true
signingConfig signingConfigs.release
}
}
如果您有特定的proguard规则,只需在您的defaultConfig
或您的产品口味中输入此行:
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
第一个proguard规则是来自Android SDK的generla规则,第二个来自您的模块目录。
如果使用构建变体release
构建项目,则默认情况下会启用ZipAlign。
答案 3 :(得分:0)
来自@PSIXO,сonsideringAndroidStudio 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