指示Android Gradle脚本删除未alignment的apks并清除工件文件

几天前我开始使用Gradle构build系统,并得到脚本工作,因为我想,这里是:

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') } } 

正如你所看到的,这里没有什么特别的东西只是构build了3个应用程序的风格,并用相同的密钥签名。 我只是运行gradle assembleRelease,20秒后,我有我的生成文件夹。 但问题是,有其他文件生成,我不希望例如appname-release-unaligned.apk。

我知道这个文件需要apk才能签名,但想添加一个任务来删除我的gradle脚本中的这些文件?

另外,如果可能的话,我想删除所有其他(壳我说文件文件)在生成过程中生成。 本质上,我想运行像gradle干净的东西,但离开构buildapk文件。 我该怎么做呢?

奖金:如果有人有指示我怎样才能优化这个脚本,并启用拉链alignment和proguard(没有自定义规则只是默认混淆是好的),这也将帮助我,因为我是很新的gradle和我遵循的教程没有一个解释这些脚步。

Solutions Collecting From Web of "指示Android Gradle脚本删除未alignment的apks并清除工件文件"

更新1-dec-2017
可能不适用于gradle 3.0。 请参阅下面的deepSymmetry的评论。


很老的话题,但这里是删除不必要的'未alignment'的文件的现代解决scheme。 这在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标志,但在这种情况下,你将被绑定到“unaligned”常量在文件名,因为发布版本与zipAlignEnabled = true,而不signedConfig跳过'zipAlign'任务,只产生一个文件:'app-释放-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() } } } } 

如果有人在意,我正在使用第一个。

我注意到在这个问题上有一些活动,所以这里是我解决问题的方式,如果它有助于某人。 只需定义新的任务来复制文件,然后设置执行顺序。

 task copyTask(type: Copy) { from 'build/apk' into 'apks' exclude '**/*-unaligned.apk' } task allTask(dependsOn: ['clean', 'assembleRelease', 'copyTask']){ clean.mustRunAfter copyTask copyTask.mustRunAfter assembleRelease } 

那么只要你想做一个构build就调用这个allTask​​。

我至less可以回答你的奖金问题:

 buildTypes { release { runProguard true signingConfig signingConfigs.release } } 

如果你有特定的proguard规则,只需input这行到你的defaultConfig或你的产品口味:

 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 

第一个proguard规则是Android SDK中的generla规则,第二个规则是来自你的模块目录。

如果使用构build变体release构build项目,则默认启用ZipAlign。

只是从@PSIXO,一点点修改的答案,考虑Android Studio 1.5,运行testing用例和重命名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 } 

开始构build运行gradlew buildTestDebug