module-build.gradle结构分析与相关使用介绍
gradle基本结构:
apply plugin: 'com.android.application'
android {
// 编译版本
compileSdkVersion 27
buildToolsVersion "27.0.2"
// 默认配置
defaultConfig {
applicationId "com.xxx.xxx" // 包名
minSdkVersion 16 // 最小兼容版本
targetSdkVersion 27 // 最大兼容版本
// 版本码 给设备程序识别版本(升级)用的,必须是一个interger值
versionCode 4
// 版本号 给用户看的
versionName "2.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
/*ndk {
//选择要添加的对应cpu类型的.so库。
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
// 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
}*/
// gradle(动态)设置manifest中的 内容
manifestPlaceholders = [
JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY : "xxxxxxxxxxxxxx", //JPush上注册的包名对应的appkey.
JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
]
}
//签名配置
signingConfigs {
config {
keyAlias 'key0' //key别名
keyPassword 'xxxx' //key密码,最好不要配置在脚本里
storeFile file('F:/xxxx/xxxxx.jks') //证书路径,证书最好不要放入项目源码
storePassword 'xxxx' //证书密码,最好不要配置在脚本里
}
}
buildTypes {
release { // 发行版设置
// 打开混淆
minifyEnabled true
// 打开压缩资源 没有使用的资源不会加载
shrinkResources true
// 混淆规则
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// 加入签名配置
signingConfig signingConfigs.config
}
}
}
//源文件目录设置,是AndroidSourceSet类型。
sourceSets{ }
//产品风格配置,ProductFlavor类型 可用于多渠道打包
productFlavors{ }
//测试配置,TestOptions类型
testOptions{ }
//aapt配置,AaptOptions类型
aaptOptions{ }
//lint配置,LintOptions类型
lintOptions{ }
//dex配置,DexOptions类型
dexOptions{ }
//编译配置,CompileOptions类型
compileOptions{ }
//PackagingOptions类型
packagingOptions{ }
//JacocoExtension类型。 用于设定 jacoco版本
jacoco{ }
//Splits类型
splits{ }
dependencies {
// 添加的各种第三方库
}
相关使用
一、gradle脚本自动化生成APK
1 在android{} 标签中
//签名配置
signingConfigs {
config {
keyAlias 'key0' //key别名
keyPassword 'xxxx' //key密码,最好不要配置在脚本里
storeFile file('F:/xxxx/xxxx.jks') //证书路径,证书最好不要放入项目源码
storePassword 'xxxx' //证书密码,最好不要配置在脚本里
}
}
2 在buildType中加入签名配置
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//加入签名配置
signingConfig signingConfigs.config
}
}
注意 signingConfigs 一定要在 buildTypes 之前 否则 找不到config
3 执行编译打包命令
若 gradle 加入了环境变量 则直接用 gradle命令即可
将gradle加入环境变量中
右键 我的电脑 ---》属性 ---》左边有个:高级系统设置 ---》高级 ---》环境变量 ---》系统变量 选项中 ---》新建 --》变量名:GRADLE_HOME,变量值:你复制的gradle 最高版本的gradle 根目录 ---》确定。
再在 系统变量 选项中 ---》找到:path 系统路径 ---》在变量值最后加入:%GRADLE_HOME%/bin (因为在bin文件夹下才有gradle.bat 可运行文件)---如果加入之前的系统路径最后没有“;”,要记得加入----》确定。
在windows开始菜单中,输入cmd,打开dos桌面,输入:gradle -v,回车
若出现了 Build time 等信息 而非 不是内部命令即成功
也可以通过./gradlew替代gradle(只能在项目根目录下使用)
用 gradle命令 生成 apk
在 项目的 根目录下 按着 shift+鼠标右键 打开cmd
输入命令
gradle assembleRelease
即可生成 发行版的 apk包
生成文件在 :G:\项目名\app\build\outputs\apk\release 下
问题:
Execution failed for task ‘:app:processReleaseResources’. > Failed to execute aapt
有可能是别的地方的错误,看看前面的出错
发现是找不到 dimen.xml这个文件
加上dimen.xml文件即可
dimen.xml 不是在 values.xml中加 (这个文件最好别修改)
而是自己新建dimen.xml 并且根据不同的 values适配 生成不同的 dimen.xml
二、把签名配置从源码的build.gradle中移除 因为放在源码中不安全 并且 不同开发人员的证书路径不同
1 在项目根目录下新建config/signgradle.txt文件,在项目外部创建sign.gradle文件
//在该文件里指定了sign.gradle文件路径
xxx/xxx/sign.gradle
2 源gradle中配置的内容放在 sign.gradle中
android {
//签名配置
signingConfigs {
config {
keyAlias 'key0' //key别名
keyPassword 'xxxxx' //key密码,最好不要配置在脚本里
storeFile file('F:/xxxx/xxxx.jks') //证书路径,证书最好不要放入项目源码
storePassword 'xxxx' //证书密码,最好不要配置在脚本里
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config //加入签名配置
}
}
}
3 在源gradle文件中加载 signgradle.txt文件
//加载签名信息
File configFile = file('../.config/signgradle.txt')
if (configFile.exists()) {
// 读取文件内容 即sign.gradle配置文件的地址
def signGradlePath = configFile.newReader().readLine().trim()
println 'lucher, path:' + signGradlePath
if (file(signGradlePath).exists()) {
apply from: signGradlePath
}
}
4 执行编译打包命令
4.1 编译所有productFlavor及对应所有buildType的apk.(productFlavor和buildType的笛卡尔积)
//如果当前Project包含多个Module,在Project根目录执行gradle assemble会编译所有的Module
$gradle assemble (简写:$gradle a) //仅仅执行项目打包所必须的任务集
$gradle build //执行项目打包所必须的任务集,以及执行自动化测试,所以会较慢
4.2 编译指定productFlavor及buildType的apk
//如果缺失某参数,则会把该参数的所有配置都进行编译,即如果运行gradle assembleflavor,则会编译出flavor所有buildType的apk
$gradle assemble[productFlavor][buildType]
//例如:
$gradle assemble (简写:$gradle a 、 $gradle ass)
$gradle assembleflavorRelease (简写:$gradle aR 、$gradle assflavorR)
$gradle assembleflavorDebug(简写:$gradle aD 、$gradle assflavorD)
5 不用手动输入 gradle命令 而是点击.bat文件自动批处理执行
在项目根目录下创建一个指定的文件夹(用于编译跑脚本用),例如config,然后在该目录下分别创建.bat文件(win上批处理后缀文件)和签名文件
批处理文件如下autoSignAndPackage.bat:
:快速编译打包apk脚本
echo " **************************打包开始 ************************** "
:执行打包命令前,需要先定位到项目根目录(即这里的上一层目录)
cd ..
:执行打包命令
gradle aRelease
echo "**************************打包完成************************** "
双击 bat文件 即可自动执行
shell脚本,即工程中.config/build.sh
#快速编译打包apk脚本
echo " **************************打包开始 ************************** "
sleep 1
#执行打包命令前,需要先定位到项目根目录
cd ..
#执行打包命令
gradle a
echo -e "**************************打包完成************************** "
#桌面右上角弹出通知
notify-send build.sh "打包完成!"
然后就可以直接通过./build.sh或者在文件管理器里双击build.sh文件来打包了
三、gradle中添加自定义方法
在android标签外
如 获取当前时间
//获取当前时间
def getCurrentTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
四、gradle修改apk文件名
结合三
//apk文件重命名
android.applicationVariants.all { variant ->
variant.outputs.all { 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 = "app_${variant.productFlavors[0].name}-V${defaultConfig.versionName}-${getCurrentTime()}-${buildType}.apk"
outputFileName = new File(fileName)
outputFileName = new File(outputFile.parent, fileName) // 该方式会加上前面的路径
}
}
}
gradle (动态) 更改 manifest中的 内容
manifestPlaceholders = [APP_NAME : "app-百度"]
然后 manifest中 的 application的lable使用
android:label="${APP_NAME}"
这样就可以 根据 gradle中 不同的渠道 去设置app不同的名称
通过该方式也可以添加产品风格配置脚本,用于多渠道打包
//产品风格配置,可用于多渠道打包
productFlavors {
//百度推广渠道
baidu {
applicationId "com.lucher.myapplication"
versionCode 1
versionName "1.0"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
manifestPlaceholders = [ APP_NAME : "app-百度"] //自定义App名称,需要把AndroidManifest.xml里的label改为: android:label="${APP_NAME}"
}
//360推广渠道
qh360 {
applicationId "com.lucher.myapplication"
versionCode 1
versionName "1.0"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
manifestPlaceholders = [ APP_NAME : "app-360"] //自定义App名称,需要把AndroidManifest.xml里的label改为: android:label="${APP_NAME}"
}