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

时间:2013-11-08 10:50:36

标签: android build gradle

我几天前开始使用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(没有自定义规则,只是默认模糊处理就可以了),这对我也很有帮助,因为我是新手,没有教程我接着解释了这些步骤。

4 个答案:

答案 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