欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

AndroidGradle自定义插件

时间:2023-08-12

一、Gradle插件介绍

        Android Gradle插件中,包含了一些task可以帮我们做一些编译、引入依赖、打包等工作,比如assembleBuild,clean等等。

二、Gradle编写

        1、新建一个Android Library,命名为demo-plugin,然后删掉之前的java文件夹,并创建一个Groovy文件夹,因为,我们是使用Groovy来编写Gradle 插件的。

        2、将子项目的build.gralde文件,修改为如下。因为我们需要使用Gradle提供的API,来编写Gradle 插件。

apply plugin: 'groovy'apply plugin: 'java-gradle-plugin'buildscript { ext.gradle_version = '3.4.0' repositories { google() jcenter() } dependencies {// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.android.tools.build:gradle:$gradle_version" }}dependencies { implementation gradleApi() implementation localGroovy()}

        3、创建Gradle Task类

        我们需要创建一个Task类,然后在此类中定义我们需要的操作。如下,可以定义一个DemoTask,并执行网络下载操作。

package com.example.demopluginimport groovy.json.JsonSlurperimport org.gradle.api.DefaultTaskimport org.gradle.api.provider.Propertyimport org.gradle.api.tasks.Inputimport org.gradle.api.tasks.TaskActionimport org.json.JSonObjectabstract class DemoTask extends DefaultTask { @Input abstract public Property getUrl(); @Input abstract public Property getRawDir(); @TaskAction def downLoad() { // 网络下载 def data = downLoadFromNetwork(getUrl().get()) // 保存到raw下的content.txt def filePath = "${project.projectDir.absolutePath}/${getRawDir().get()}/content.txt" saveDataToFile(data, filePath) } def downLoadFromNetwork(String uri) { def json = new JsonSlurper().parse(url.toURL(), "utf-8") return json } def saveDataToFile(Object data, String filePath) { def file = new File(filePath) if (!file.exists()) { file.createNewFile() } def fileWriter = new FileWriter(new File(file)) // 写入文件 fileWriter.write(data.toString()) fileWriter.flush() fileWriter.close() }}

        使用@TaskAction注解,表明此Task执行时,需要执行的方法。@Input表示了此Task的输入。

        4、创建Gradle Plugin类和Extension类

        我们需要创建一个Plugin类,并将之前的Task类放到此Plugin类中,这样在插件执行时,就会执行之前定义的任务。同时,为了提供任务执行需要的输入,我们需要定义一个Extension类,来指出Plugin/Task执行需要的输入。

        1)、extension类

package com.example.demopluginimport org.gradle.api.provider.Propertyabstract class DemoExtension { abstract Property getUri() abstract Property getRawDir() DownLoadPluginExtension() { // 默认配置 uri.convention("https://www.baidu.com") }}

        2)、Plugin类

package com.example.demopluginimport org.gradle.api.Pluginimport org.gradle.api.Projectclass DemoPlugin implements Plugin { void apply(Project project) { DemoExtension extension = project.extensions.create("demoConfig", DemoExtension) project.getTasks().register("demoTask", DemoTask, { task -> task.rawDir.set(extension.getRawDir()) task.url.set(extension.getUri()) }) }}

        5、定义Plugin的名称

        为了方便对Plugin进行使用,我们需要定义Plugin的名称,如下所示,在resources文件夹下创建meta-INF.gradle-plugins文件夹,并创建“demoplugin.properties”文件,此文件表明Plugin的名称为demoplugin,并在此文件中使用implement-class指出来plugin的实现类。

三、Gradle使用

        1、将gradle plugin上传到maven仓库,在子项目demo-plugin的build.gradle里,添加如下代码:

apply plugin: 'maven'uploadArchives { repositories { mavenDeployer { // url表示maven仓库的地址,需要输入用户名和密码 repository(url: "https://xxxx/xxx"){ authentication(userName: "name", password: "password") } pom.version = '1.0.0' pom.artifactId = 'demo-plugin' pom.groupId = 'com.example.demo' } }}

        2、使用自定义gradle插件

buildscript { repositories { maven { url 'https://xxx/xxx' } } dependencies { classpath "com.example.demo:demo-plugin:1.0.0" }}plugins { id 'com.android.application' id 'kotlin-android'}apply plugin: 'demoplugin'android { ......}demoConfig { // 配置插件的输入 url = "https://www.baidu.com" rawDir = "src/main/res/raw"}project.afterevaluate { // 将自定义的task添加在preBuild之前 执行 tasks.getByName("preBuild") dependsOn('downloadMultiLanguage')}

参考:

Gradle手册:Gradle User Manual

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。