众所周知,打包的需求千奇百怪,我们在打包时会遇到文件操作、版本定义、通过参数控制版本之类的需求。今天我们就来聊聊如何来实现这些需求……
一般我们通过gradle构建的命令是(之后为了简化,只写windows的):
gradlew build # windows
./gradlew build # unix,linux,mac os
打包命令是:
gradlew assembleRelease
有时候会要求多添加一种buildType,比如预发版、beta版,正式版这样的需求
我们就直接在buidtypes里面增加
/* 预发环境 */
preRelease {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
buildConfigField "String", "API_HOST", "${API_PRE_RELEASE_HOST}"//API Host
minifyEnabled true //是否混淆
//是否设置zip对齐优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
//签名
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
当我们打包时直接执行
gradlew assemblePreRelease
==PS 如果有其他的module,其它module的build.gradle中也必须包含这个buildtypes,否则会报错==
当我们在编译前需要执行一些自定义任务的时候,需要先定一个task。比如我这边一个需求是在打包前删除某些文件,然后在编译前调用它。
//自定义删除文件的任务
task deleteFile{
File file = file('src/main/assets/fonts.png')
file.delete()
println("delete success")
}
//编译前调用,这里的preBuild是build任务已有的,使这个任务依赖deleteFile,这样在执行preBuild钱就会先执行deleteFile
preBuild.dependsOn deleteFile
编译传参的原理很简单,就是通过构建命令将变量的值传入,这里有个案例,通过变量修改版本号:
先在gradle中用project.harProperty来做判断,如果不存在就使用默认值。
defaultConfig {
applicationId "com.example.gradle"
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName project.hasProperty('VERSION') ? VERSION : "1.0.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
signingConfig signingConfigs.config
}
想要使这个VERSION的值改变,可以在构建命令中传参,这样生成的package版本号就是传入的版本号了,用这个可以有很多想象空间。
gradlew assembleRelease -PVERSION=x.x.x
参考文章:Android使用Gradle命令动态传参完成打包,不需要修改代码