android - 指示 Android Gradle 脚本删除未对齐的 apk 并清理 Artif

几天前我开始使用 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 种风格的应用程序并使用相同的 key 对它们进行签名。我只是运行 gradle assembleRelease 并在 20 秒后将我的 apk 放在 build 文件夹中。但问题是生成了我不想要的其他文件,例如 appname-release-unaligned.apk。

我知道在签署 apk 之前需要此文件,但想在我的 gradle 脚本中添加删除这些文件的任务?

另外,如果可能的话,我想删除在构建期间生成的所有其他(shell 我说的是 Artifact 文件)。本质上,我想运行类似 gradle clean 之类的东西,但保留构建 apk 文件。我该怎么做?

奖励:如果有人有关于如何优化此脚本并启用 zip align 和 proguard(没有自定义规则,只是默认混淆是可以的)的指针,这也会对我有所帮助,因为我对 gradle 非常陌生,而且我没有任何教程下面解释了这些步骤。

最佳答案

2018 年 2 月更新。 使用 Android Gradle 插件 3.0 或更高版本时,此 block 将导致构建错误。请参阅下面的“deepSymmetry”评论。

“修复”是完全删除 block ,插件的默认行为会自动清理中间临时 apk(例如:app-debug-unaligned.apk)。


相当老的话题,但这里是删除不必要的“未对齐”文件的现代解决方案。这非常方便,尤其是在 CI 服务器上可以节省一些空间。

很遗憾,插件没有为 'zipAlign' 任务提供 Hook ,所以我们需要 Hook 在 '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 标志,还有另一个,但在这种情况下,您将被绑定(bind)到文件名中的“未对齐”常量,因为发布版本使用 zipAlignEnabled=true 并且没有signingConfig 跳过“zipAlign”任务并仅生成一个文件: 'app-release-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()
        }
    }
  }
}

我使用第一个以防万一。

关于android - 指示 Android Gradle 脚本删除未对齐的 apk 并清理 Artifact 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19857213/

相关文章:

android - Dagger2 生成的类突然从 Android Studio 中消失了

build - 我可以拥有同名的库和二进制文件吗?

python - LLVM clang 的 CMake 构建失败并显示 "Unexpected fa

xcode - 如何将编译源中的文件从一个目标复制并粘贴到另一个目标?

c# - 从构建输出中省略程序集的本地化版本

time - Jenkins——使用 "Build Time Trend"获取 "Remote Ac

build - hudson 的 "Started by an SCM change"是什么?

linux - 在 Debian 或 Ubuntu 下自动获取构建依赖项的 Debian 方式是什么

makefile - cmake和并行构建与 "make -jN"

build - 如何在 VSTS/VSO Build vNext 中创建 Web 部署包?