系列文章目
Gradle学习之一入门介绍
Gradle学习之二Groovy核心语法
Gradle学习之三Groovy高级语法
Gradle学习之四Gradle生命周期
Gradle学习之五Project详解
Gradle学习之六Task详解
Gradle学习之七其他重要模块
文章目录
概述
- Settings类讲解
- SourceSet类讲解及实战
- Plugin讲解及自定义Plugin
- android插件对gradle的扩展
- 如何迁移到gradle
一、Settings类讲解
//file setting.gradle
rootProject.name='MavenSample'
include ':app'
include ':baselibrary'
setting.gradle初始化settings类实例。gradle的settings决定了初始化阶段要加载的模块。
public interface Settings extends PluginAware, ExtensionAware {
/**
* <p>The default name for the settings file.</p>
*/
String DEFAULT_SETTINGS_FILE = "settings.gradle";
void include(String... projectPaths);
...
...
}
二、SourceSet类讲解
约定大于配置。SourceSet管理代码资源路径。
android {
...
...
sourceSets {
main{
jniLibs.srcDirs = ['libs'] //修改so的存放位置
}
}
sourceSets{
main{
res.srcDirs=['src/.....1','src/.....2']
}
}
}
三、自定义plugin
3.1 创建一个插件项目
在AndroidStudio创建一个Library Module。然后将其目录结构修改为如下图的所示:
然后,我们修改build.gradle配置,让其支持gradle plugin
//引入groovy插件
apply plugin: 'groovy'
//执行源码、资源路径
sourceSets{
main{
groovy{srcDir 'src/main/groovy'}
resources{srcDir 'src/main/resources'}
}
}
3.2 开始gradle插件编写
//file: GradleStudyPlugin.groovy
//这里的包需要手动导入
import org.gradle.api.Plugin
import org.gradle.api.Project
/**
* 自定义插件
*/
class GradleStudyPlugin implements Plugin<Project>{
/**
* 插件被插入时,要执行的方法
* @param project 引入插件的Project
*/
@Override
void apply(Project project) {
println 'hello plugin ... ' + project.name
}
}
在资源中配置gradle plugin的引入路径
在resources文件下, 首先创建META-INF文件夹,再在其中创建gradle-plugins文件夹,最后再里面创建一个{包名}.properties的文件
implementation-class=GradleStudyPlugin
最后在项目中住module下引入该插件
apply plugin: 'com.zfc.pluginstudy'
3.3 完善插件编写
定义与项目通信的接口ReleaseInfoExtension.groovy
/**
* 与自定义Plugin进行通信
*/
class ReleaseInfoExtension{
String versionCode
String versionName
String versionInfo
String fileName
ReleaseInfoExtension(){}
@Override
public String toString() {
return "ReleaseInfoExtension{" +
"versionCode='" + versionCode + '\'' +
", versionName='" + versionName + '\'' +
", versionInfo='" + versionInfo + '\'' +
", fileName='" + fileName + '\'' +
'}';
}
}
然后定义插件的功能,继承与DefaultTask
//注意 手动写包名, 因为 AndroidStudio支持不太好
import org.gradle.api.DefaultTask
import groovy.xml.*
import org.gradle.api.tasks.TaskAction
class ZfcReleaseInfoTask extends DefaultTask {
ZfcReleaseInfoTask(){
group = 'zfc'
description = 'update the release info'
}
//在Gradle执行阶段执行
@TaskAction
void doAction(){
updateInfo()
}
//具体的插件的功能
private void updateInfo(){
String vcode = project.extensions.zfcReleaseInfo.versionCode
String vName = project.extensions.zfcReleaseInfo.versionName
String vVersion = project.extensions.zfcReleaseInfo.versionInfo
String fileName = project.extensions.zfcReleaseInfo.fileName
def file = project.file(fileName)
if(!file.exists()){
file.createNewFile()
}
//写入xml
def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw)
//如果有内容
if(file.text !=null && file.text.size()<=0){
println '-------------------'
xmlBuilder.releases{
release{
versionCode(vcode)
versionName(vName)
versionInfo(vVersion)
}
}
file.withWriter{ writer->
writer.append(sw.toString())
}
}else{
println '**************'
//将xml数据写入到根节点之下
xmlBuilder.release{
versionCode(vcode)
versionName(vName)
versionInfo(vVersion)
}
//获取当前的内容行
def lines = file.readLines()
def lengths = lines.size()-1
file.withWriter{ writer->
lines.eachWithIndex{ String line, int index ->
if(index != lengths){
writer.append(line + '\r\n')
}else if(index == lengths){
writer.append('\r\n' + sw.toString() + '\r\n')
writer.append(lines.get(lengths))
}
}
}
}
}
}
最后,在GradleStudyPlugin中将上述的ReleaseInfoExtension和ZfcReleaseInfoTask分别注册到Project的扩展属性和Task中。
/**
* 自定义插件
*/
class GradleStudyPlugin implements Plugin<Project>{
/**
* 插件被插入时,要执行的方法
* @param project 引入插件的Project
*/
@Override
void apply(Project project) {
//定义扩展属性
project.extensions.create('zfcReleaseInfo',ReleaseInfoExtension)
//创建Task
project.tasks.create('zfcTask',
ZfcReleaseInfoTask)
}
}
最最后,在引入插件的module中配置使用该自定义的Plugin
apply plugin: 'com.zfc.pluginstudy'
zfcReleaseInfo{
versionCode = '101'
versionName = "1.1.0"
versionInfo = "hahahaha"
fileName = "releases.xml"
}
编译通过之后,
四、Android插件属性
Android的task:
this.afterEvaluate{
//通过变体修改属性名
this.android.applicationVariants.all{ variant ->
def name = variant.name
def baseName = variant.baseName
def versionCode = variant.versionCode
apkName = "app-${variant.baseName}-${variant.versionName}.apk"
//apk输出路径
def out = variant.outputs.first()
out.outputFile = new File(out.ouputFile.parent,apkName)
}
}
通过变体获取task
this.afterEvaluate{
//通过变体修改属性名
this.android.applicationVariants.all{ variant ->
def task = variant.checkManifest
println task.name
task.doFirst{
def bt = variant.buidType.name
if(bt.equals('qa')||bt.equals('preview')||bt.equals('release')){
//做业务...
update_plugin(bt)
}
}
}
}