Android Gradle(七)三种自定义插件方式

一、前言

        我们知道,在Android中每一次的编译和打包其实都是一个个task任务顺序执行或者并发执行最终生成一个Apk。也就是说所有的任务可以想象成一条线,上个任务的产出就是下一个任务的输入(流水线作业😄)。例如下图:一个简单的APK构建流程

例如下图:实际构建中的task任务

可以简单的理解为:

  • 前缀带有compile的task:一般是做编译转换的任务,例如:Java文件转换成Class
  • 前缀带有merge的task:一般是合并各种资源文件任务,例如:所有的Assets文件合成一个
  • 前缀带有package的task:一般是将资源文件进行打包压缩
  • 前缀带有assemble的task:将打包的文件组合一起形成一个Apk。(一般来说只会有一个)

具体Task分析可以查看源码,如下:

Android Gradle Plugin7.1.2源码下载

依赖进项目即可查看对应的Task,例如ProcessDebugJavaResTask:

 提示:ProcessDebugJavaResTask其实就是ProcessJavaResTask,中间的Debug根据你项目中配置的productFlavors(如果没有配置,默认debug/release)来决定,其他task也是如此。

二、我们可以做什么?

        知道每一个task的作用后,我们找到我们需要的task,在其执行前或者执行后插入我们自定义的插件(可以理解成一个也是task),例如:

  • 在class生成后,Dex文件生成前,插入我们自定义的代码(包括对第三方SDK)
  • 对AndroidManifest.xml进行插入代码
  • 对资源图片(PNG)压缩

而上面这些操作的基础,都是需要把自己的插件依赖进项目里,然后对相关的task进行hook。

例如下图(引入我们最常用的Kotlin插件):

apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

接下来, 我们将介绍如何创建自己的插件并通过apply plugin方式依赖进项目。

三、创建插件并依赖进项目

提示:以下配置都基于AGP版本:7.1.2 Gradle版本:7.2

首先,创建插件方式有三种,如下:

1.直接在build.gradle中创建

2.在buildSrc文件夹中创建

3.创建一个Module或者Library的方式创建

接下来,我们分别介绍下三种方式如何使用

3.1 build.gradle中自定义插件

这种方式比较简单,就不过多介绍,直接在App模块build.gradle中创建,代码如下:

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

class  CustomPlugin implements Plugin<Project>{
    @Override
    void apply(Project target) {
        printf "hello,this is CustomPlugin"
    }
}
apply plugin: CustomPlugin

  提示:自定义插件都需要实现Plugin接口。

运行,同步下,结果如下:

3.2 在buildSrc文件中自定义插件

这里需要分别介绍Java和Kotlin的创建,发现还是有一些不一样的。推荐用Kotlin开发,Google主推

3.3.1 使用Java语言

首先,在项目的根目录下创建一个buildSrc文件夹,然后在buildSrc文件夹里创建一个build.gradle文件build.gradle文件代码如下:

apply plugin: "java"
apply plugin: 'java-gradle-plugin'

 提示:如果需要支持Groovy,自行添加 apply plugin: 'groovy'

目录结构截图如下:

 然后,点击Sync同步项目,就会发现buildSrc文件夹下会多出一些gradle的相关文件,截图如下:

如果你的Gradle版本7.2可以发现,在settings.gradle多了一个buildSrc文件夹,这是因为buildSrc是系统默认的文件夹。

 接下来在buildSrc上右键新建文件夹,会发现多出一些文件夹选择,如下:


 选择Java文件夹,在其下面创建一个MyPlugin.java文件, 截图如下:

 代码如下:

class MyPlugin implements Plugin<Project> {
    @Override
    public void apply(Project target) {
            System.out.println("hello,this is CustomPlugin");
    }
}

还是一样在App模块build.gradle中加入如下代码:

apply plugin: MyPlugin

运行,同步下,结果如下:

 3.3.1 使用Kotlin语言

主要流程与上面Java的创建一样,不同的是build.gradle文件的创建和Kotlin文件夹,如下:

 需要注意点:

  1. build.gradle为build.gradle.ktx
  2. 文件夹为kotlin

build.gradle.ktx代码如下:

plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}

 如果你的Gradle版本为7.0以上,可能会遇到如下问题:Build was configured to prefer settings repositories over project repositories but repository 'Gradle Libs' was added by unknown code

只需要如下修改即可:

在setting.gradle中,将

repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)

修改为:

    repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)

 截图如下:

 问题的原因就是Gradle希望开发者将所有仓库配置都在这里设置,而不是根据每个项目自己去导入。

3.3 通过Module/Library自定义插件 

第一步:新建一个Module或者Library

因为无论选择哪个最后只保留src文件夹和build.gradle,文件其他全部删除。将上面的MyPlugin.java放到包里,截图如下:

 第二步:创建com.example.plugins.properties文件

路径如下:resources/META-INF/gradle-plugins/com.example.plugins.properties

注意:跟java文件夹是在同一层,resources/META-INF/gradle-plugins/必须是这个路径,后面的文件名可以自定义,后面会用到。

 文件内容如下:

#配置插件的入口类(必须保证文件路径正确)
implementation-class=com.example.customplugin.MyPlugin2

第三步:发布代码到本地 

修改build.gradle代码如下(代码中包含Gradle7.0以上和以下两种方案):

apply plugin: "java"
apply plugin: 'java-gradle-plugin'

repositories {
    google()
    mavenCentral()
}

//Gralde 7.0以上选择下面发布到本地
apply plugin: 'maven-publish'
publishing {
    publications{
        maven(MavenPublication) {
            groupId "com.example.custom"
            artifactId 'CustomPlugin'
            version "1.0.0"
            //如果是war包填写components.web,如果是jar包填写components.java
            from components.java
        }
    }

    repositories {
        maven {
            url = "../plugins"
        }
    }
}
//Gralde 7.0以下选择下面发布到本地
//打包到本地或者远程maven库
//apply plugin: 'maven'
//uploadArchives {
//    repositories {
//        mavenDeployer {
//            //这个就是配置这个自定义插件的classpath
//            //例如根项目依赖:classpath "com.example.custom:CustomPlugin:1.0.0"
//            pom.groupId = 'com.example.custom'
//            pom.artifactId = 'CustomPlugin'
//            pom.version = '1.0.0'
//            //提交到远程服务器
//            // repository(url:"服务器地址"){
//            //    authentication(userName:'admin',password:'123456')
//            // }
//            //提交本地maven地址:../plugins
//            repository(url: uri('../plugins'))
//        }
//    }
//}

第四步,点击task发布 

可以看到在项目中多了个plugins文件夹,如下:

 第五步:引入插件到工程

 在根build.gradle中加入下面代码

buildscript {
    dependencies {
        classpath "com.example.custom:CustomPlugin:1.0.0"
    }
}

第六步:添加依赖

com.example.plugins添加依赖,这里名字也就是我们上面创建com.example.plugins.properties文件

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'com.example.plugins'
}

 第七步:运行代码

四、总结

如果是为了快速测试可以选择在直接在build.gradle中创建

如果只有一个插件开发,选择在buildSrc文件夹中创建

如果有多个插件开发,选择以创建一个Module或者Library的方式创建

建议:如果是在项目中,使用第三种方式。在语言上,使用Kotlin进行插件开发。

项目地址

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值