Gradle学习之七其他重要模块

系列文章目

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']
        }
    }
}

AndroidSourceSet

三、自定义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)
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值