关于gradle下Android{}的配置字段说明如下:
defaultConfig{}默认配置,是PriductFlavor类型,它共享给其他ProductFlavor使用
sourceSets{}源文件目录设置,是AndroidSourceSet类型
buildtypes{} buildtype类型
sigingConfigs{}签名配置,signingConfig类型
productFlavors{} 产品风格配置,ProductFlavor类型
testOptions{} 测试配置 testOptions类型
aaptOptions{} aapt配置 AaptOptions类型
lintOtions{} lint配置 lintOptons类型
dexOptions{} dex配置,DexOptions类型
compileOptions{} 编译配置,CompileOptions类型
packagingOptions{} PackagingOptions类型
jacoco{} jacocoExtension类型 用于设定jacoco版本
splits{} Splits类型
脚本构建工作如下
关于gradle配置编译APK相关签名如下;
signingConfigs {
release {
storeFile file('E:\Gsafty\keystoreName.keystore') //绝对路径
storePassword "12345678"
keyAlias "alias"
keyPassword "12345678"
}
}
构建类型(开发过程中会不断的提交测试debug包到测试人员去测试)
如下代码仅做参考:
buildTypes {
release {
minifyEnabled false
shrinkResources false
zipAlignEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
debug {
minifyEnabled false
shrinkResources false
zipAlignEnabled false
}
custom {
minifyEnabled false
shrinkResources false
zipAlignEnabled false
}
sourceSets {
main {
jni.srcDirs = []
}
}
}
多渠道打包构建不同渠道的多尔类型APK
这里不同的渠道会根据构建类型生产对应的apk,其对应关系为渠道种类*构建编译类型数等于编译出的APK数。
/*多渠道包*/
productFlavors{
tencent{
applicationId "com.domin.armn"
versionCode "1.0"
versionName "1.2.0"
manifestPlaceholders = [appName: "tencent"]
}
baidu{
applicationId "com.domin.armn"
versionCode "1.0"
versionName "1.2.0"
manifestPlaceholders = [appName: "baidu"]
}
}
自定义生产APK包名称
例如:module——flavor-version-time-buildtye.apk
在app下的build.gradle跟目录下声明如下。
//获取当前时间
def getCurrentTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
在Android{}目录下声明如下:
/*apk重命名*/
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def buildType = variant.buildType.name
//这里修改apk文件名,格式为 module_flavor-version-time-buildtype.apk
def fileName = "Gsafety_${variant.productFlavors[0].name}-V${defaultConfig.versionName}-${getCurrentTime()}-${buildType}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
进阶配置项
以上所有的配置尚且不能够完全满足自动化编译,乃然需要用户手动输入命令去进行编译APK包,这当然不是我们最想要的结果
gradle执行相关命令如下:
注:在使用编译命令之前请确保gradle已经加入环境变量,如果没加入可以通过./gradlew代替gradle(只能在项目更目录下使用)
1编译所有productFlavor及对应所有buildType的apk
$gradle assemble //仅仅执行项目打包所必须的任务集
$gradle build //执行项目打包所必须的任务及,以及执行自动化测试,所以会较慢
如果缺失某参数,则会把该参数的所有配置都进行编译,即如果运行gradle assembleFlavor,则会编译出flavor所有buildType的apk
例如:
$gradle assemble
$gradle assembleflavorRelease
$gradle assembleflavorDebug
注:gradle支持命令缩写,上面两个命令也可以写成如下格式
$gradle a
$gradle ass
$gradle aR
$gradle assflavorR
$gradle aD
$gradle assflavorD
在项目跟目录下创建一个指定的文件夹(用于编译跑脚本用),例如.config,然后在该目录下分别创建.bat文件(win7上批处理后缀文件)和签名文件
批处理文件如下build.bat
注意:这里可能会在cmd窗口出现中文乱码,这是由于便于问题,不会影响编译。
快速编译打包apk脚本
echo 打包开始
sleep 1
执行打包命令前,需要先定位到项目更目录
cd
执行打包命令
gradle a
echo -e 打包完成
桌面右上角弹出通知
notify-send build.sh 打包完成
创建签名文件sign.txt
签名文件之所以放在外边这里是为了更好的保护签名文件,尽量少的给其他人知道《安全考虑》
android {
signingConfigs {
release {
storeFile file('E:\Gsafty\keystoreName.keystore') //绝对路径
storePassword "12345678"
keyAlias "alias"
keyPassword "12345678"
}
}
}
将签名文件应用到app的buid.gradle文件下的Android{}
//加载签名信息
File configFile = file('../.config/sign.txt')
if (configFile.exists()) {
def signGradlePath = configFile.newReader().readLine().trim()
println 'lucher, path:' + signGradlePath
if (file(signGradlePath).exists()) {
apply from: signGradlePath
}
}
最后就是给开发人员的福利,在window机器上直接点击.bat文件执行批处理命令,即可在项目build目录下的apk目录下的到对应的apk包。