一、什么是Gradle
Gradle是一个工具,同时它也是一个编程框架.。可以调用Gradle自带的api编译我们的android工程,打包成apk或aar,也可以在.gradle文件中使用Groovy语言进行逻辑编程。我们在android工程中使用的每个.gradle文件 和task执行时都会转换成一个个的java对象,运行在java虚拟机上。其中主要的有Gradle对象、Project对象和Settings对象。
二、实践
后面我们通过配置和创建属性文件实现以下几个任务:
1、实现多渠道打包
2、通过文件方式配置版本号 及版本名等信息
3、通过文件方式配置签名文件
4、根据不同渠道动态修改程序名称和包名
5、根据不同渠道生成apk文件名称及自定义文件输出路径
6、根据不同渠道定制专属页面
在实现任务之前 先要说几个基础知识:
1、声明变量
Gradle中声明变量有三种方式 一种是 通过def关键字 如 def a =1 ,这种声明只能在声明所在的方法中使用相当于临时变量,原因后面会详细说下,另一种是 ext关键字 如ext.a = 1,这种方式是可以在外部声明在其中方法中使用的, 类似于我们成员变量,另外还有就是 直接声明 a =1,这种方式也可以在外部声明在其中方法中使用,但不能在文件外部调用,其实还有一种方式 和ext 效果一样,
1. import groovy.transform.Field; //必须要先import
2. @Field x = 1
这种方式 在我们android开发中基本不会使用 。
2、定义方法
定义方法 使用def 关键字
如 def printName(name){
println "hello"+name //结束没有 ;
}
或 def sayHello(){
println "hello"
}
3、调用方法
调用方法可以用两种方式 比如 printName("gqs") 也可以 printName "gqs"
下面直接贴 .gradle文件,所有的说明都穿插在代码中:
//导入插件 真正工作的就是这些插件 gradle 只是设置使用规则
//apply 其实也是一个方法,就是这样定义的
//void apply(Map<String, ?> options);
apply plugin: 'com.android.application'
// 默认版本号
ext.appVersionCode = 1
// 默认版本名z
ext.appVersionName = "1.0"
// 默认apk输出路径
ext.appReleaseDir = "../apks"
// 默认正式包后缀名
ext.appSuffixName = "_release.apk"
// 也可以向下面这种方式声明变量
ext{
a =1
b = 2
}
//定义一个测试方法
def printName(name){
println "hello====" +name
}
//可以如下调用
printName "gqs"
//printName("gqs")
定义一个方法 获取当前日期
def getPackageTime() {
def date = new Date()
def formattedDate = date.format('yyyy_MM_dd_HHmm')
return formattedDate
}
// 加载版本信息配置文件方法
def loadProperties() {
//将我们的版本号等信息配置在了local.properties 文件中,这里的file() 是一个方法,返回一个File对象
def proFile = file("../local.properties")
//Properties 是一种数据类型,其实是就是继承自hashtable , 可以解析.properties文件,并以键值对方式存储起来
//public class Properties extends Hashtable
Properties pro = new Properties()
proFile.withInputStream { stream->
pro.load(stream)
}
//为上面定义的变量赋值
appReleaseDir = pro.appReleaseDir
appVersionCode = Integer.valueOf(pro.appVersionCode)
appVersionName = pro.appVersionName
appSuffixName = pro.appSuffixName
}
// 调用方法 加载版本信息
loadProperties()
android {
compileSdkVersion 24
buildToolsVersion "24.0.0"
defaultConfig {
applicationId "com.gqs.demo"
minSdkVersion 14
targetSdkVersion 24
versionCode appVersionCode
versionName appVersionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// 到这里就完成了 任务 2 通过文件方式配置版本号 及版本名等信息
//signingConfigs 是对签名文件的配置 使用时会转成一个java方法
signingConfigs {
debug {
}
release {
def Properties localProps = new Properties()
//signature.properties 是配置签名信息的配置文件 后面会贴出来
localProps.load(new FileInputStream(file('../signature.properties')))
storeFile file(localProps["STORE_FILE"])
keyAlias localProps["KEY_ALIAS"]
storePassword localProps["STORE_PASSWORD"]
keyPassword localProps["KEY_PASSWORD"]
}
}
// 到这里就完成了 任务 3 通过文件方式配置签名文件
//buildTypes 对不同的打包类型 进行配置
buildTypes {
release {
minifyEnabled true //实现代码混淆
signingConfig signingConfigs.release //使用的签名信息
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
applicationVariants.all { variant ->
variant.outputs.each { output ->
//开始输出,自定义输出路径
output.outputFile =
new File(appReleaseDir + getPackageTime() + //获取当前日期
"_v" + appVersionName +//每一个渠道的名称
variant.productFlavors[0].name +
appSuffixName)//appSuffixName 是我们声明的文件后缀
}
}
}
}
// 到这里 就实现了 任务 5 根据不同渠道生成apk文件名称及自定义文件输出路径
//productFlavors 就是实现不同渠道打包了
productFlavors {
//对每个渠道 设定特定的包名 也就是applicationId
rainbow{
// 都使用默认设置
}
xiaomi {
//设置特定渠道的包名
applicationId "com.rainbow.xiaomi"
}
m360 {
applicationId "com.rainbow.qihu"
}
productFlavors.all { flavor ->
//动态设置不同渠道的app name
// AndroidManifest文件中 android:label="${APP_NAME}"
//使用渠道名称替换 APP_NAME,使每个渠道都有自己的 app名称
flavor.manifestPlaceholders = [APP_NAME: name]
}
//这样 我们就完成了任务 1 和4 ;多渠道打包及根据不同渠道动态修改程序名称和包名
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
}
下面是 signature.properties
// 设置 签名文件的信息,用键值对的格式存放
//注意 为了安全,不要放到版本管理里面
//STORE_FILE 签名文件相对地址,这个地址是相对我们使用的所在位置,不是相对当前文件位置
STORE_FILE=../debug.keystore
STORE_PASSWORD=android
KEY_ALIAS=androiddebugkey
KEY_PASSWORD=android
===========================
下面是local.properties
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=/Applications/android_tools/android-sdk-macosx
#=====以下是自己定义的内容=====
# 打包的输出路径
appReleaseDir=./apks/
# APP版本号,用来升级使用
appVersionCode=2
# APP版本名称,最终打包使用
appVersionName=1.0.0.2
# app正式版包名后缀
appSuffixName=_release.apk
===========================// 设置 签名文件的信息,用键值对的格式存放 //注意 为了安全,不要放到版本管理里面 //STORE_FILE 签名文件相对地址,这个地址是相对我们使用的所在位置,不是相对当前文件位置 STORE_FILE=../debug.keystore STORE_PASSWORD=android KEY_ALIAS=androiddebugkey KEY_PASSWORD=android
## This file is automatically generated by Android Studio. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file should *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. sdk.dir=/Applications/android_tools/android-sdk-macosx #=====以下是自己定义的内容===== # 打包的输出路径 appReleaseDir=./apks/ # APP版本号,用来升级使用 appVersionCode=2 # APP版本名称,最终打包使用 appVersionName=1.0.0.2 # app正式版包名后缀 appSuffixName=_release.apk
最后 实现 任务6 根据不同渠道定制专属页面
只要在我们的 src文件夹下 创建和渠道相同的文件夹 可以了 ,里面放入我们要修改的布局文件或values中的文件。
其实默认 我们用的都是 src下 main中的文件 ,如果我们创建了和渠道名称相同的文件夹 ,gradle 打包的时候 就会从对应到文件夹中取数据了。
比如我替换了 首页的布局 ,最后就生成了三个不同的页面
以上就是所有了,总之Gradle 是非常强大的,只要你想 ,可以实现你各种需求,当然对于android 开发终归只是辅助工具,不必理解的过于深入,但是熟练掌握基本的使用是必须的,这可以大大的提高我们到开发效率。