随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

Android自定义Gradle插件

一、概述

  当前开发一个Android项目必定会用到gradle插件(不管你想不想其实都在用)。上一节我们说了app的打包流程,其实主要是为接下来要说的内容做铺垫。打包流程大致分为:aapt把资源文件生成R.java文件,JavaCompiler把java文件编译成class文件,dex工具又把class文件搞成.dex文件。apkbuilder会把上述的文件打包成一个未签名的apk包。然后使用jarsinger和zipalign对apk进行签名和对齐。其实我们使用AndroidStudio打包一个apk包的时候也是经历了以上几步,不同的是androidstudio借助gradle完成的,每一步都是一个task。所以我们学会了自定义插件以后就可以对app的打包流程进行动态的干涉。比如:自动化签名、多渠道打包。再如:编译时注解(ButterKnife,Digger)、无痕埋点等等的事情都可以干涉或者干。

  好了废话不多说,gradle自定义插件有三种形式可以是用:1.在build.gradle文件中直接写插件(比较局限)2.使用官方推荐的srcBuild目录下,也比较局限,因为只能在当前项目使用。3.把gradle发布到maven版本仓库让其他小伙伴也可以使用。今天要说的就是这种方案。

二、具体的自定义步骤

  1.首先新建一个项目,并且在项目中新建一个module,什么类型的module都无所谓

  2.把module下的所有文件都删掉

  3.在module文件夹下新建一个build.gradle文件备用

  4.在module文件夹下新建一个src文件夹,在src文件夹下新建一个main文件夹,在main文件夹下分别新建groovy和resources文件夹。然后在groovy文件夹下新建一个包名,并在新建的包中新建一个 .groovy结尾的类。然后在resources文件夹下新建一个META-INF文件夹,然后再META-INF文件夹下新建一个gradle-plugins文件夹,并在此文件夹下新建一个后缀名为.properties的文件。以上四步把准备工作都做完了。

  下面看下我们新建好的目录结构:module->src->main->grovvy->com.javassist.plugin->JavassitsPlugin.groovy。module->src-main-resources->META-INF->gradle-plugins->ywplugin.properties

 

 5.下面先给ywplugin.properties赋值

implementation-class=com.javassist.plugin.JavassistPlugin
“=”号前面是固定写死的,后面是包名+类名
6.给build.gradle配置信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apply plugin:'groovy'//加入groovy的能力
apply plugin:'maven'//导入maven插件
 
dependencies{<br>  //下面两个库必须导入
    implementation gradleApi()
    implementation localGroovy()
    //引入javassist库
    implementation 'org.javassist:javassist:3.20.0-GA'<br>  //因为transform-api为下一节无痕埋点做准备
    implementation 'com.android.tools.build:transform-api:1.5.0'
}
 
repositories{
    jcenter()
}
//发布代码到本地
uploadArchives {
 
    repositories.mavenDeployer {
        repository(url: uri('../repo'))//仓库路径,此处是项目目录下的repo文件夹
        pom.groupId = 'com.javassist.plugin'//groupid自行定义,一般是包名
        pom.artifactId = 'javassistplugin'//自行定义
        pom.version = '1.0.0'//版本名称
    }
 
 
 
}

 6.定义JavassistPlugin.groovy类

1
2
3
4
5
6
7
8
9
10
11
package com.javassist.plugin
 
import org.gradle.api.Plugin
import org.gradle.api.Project
 
public class JavassistPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        println("我是杨洛峋小宝宝")
    }
}

  此处我们仅仅输出一段文本,主要是观察我们的插件是否能够正常运行

7.所有的准备工作都准备好了,接下来我们clean一下插件的module然后会在Gradle窗口会出现一个插件module的task,如下图所示

 

 

 我们找到有箭头标注的uploadArchives,然后双击会在module的同级目录生成一个repo(这个是在build.gradle中配置的,名字可以随便起),目录如下:

 

 

 到目前为止我们的插件算是生成好了,接下来看看怎样用

8.用法:

  a.首先在project根目录下的build.gradle中配置参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
buildscript {
    repositories {
        google()
        jcenter()<br>    //maven仓库路径
        maven {
            url uri('repo')
        }
 
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'<br>    //加入classpath.<br>    //规则:groupId:artifactId:version<br>    classpath 'com.javassist.plugin:javassistplugin:1.0.0' <em id="__mceDel">} <br>}<br> allprojects { repositories { google() jcenter()<br>    //maven仓库路径
        maven {
            url uri('repo')
        }
         
    }
}
</em>

 b.在app module中使用apply plugin:"ywplugin"引用,这个名字是.properties的名字,大家不要弄错了,不然识别不到。

 这里有几个地方需要说明一下:

  1.module名称可以随意

  2.src->main->grovvy和src-main-resources->META-INF->gradle-plugins这个目录结构是固定写死的。路径上的其他内容都可以根据自己的喜好来定义。

  3.ywplugin.properties中的文件名即:ywplugin是我们在引用插件的时候使用的。例如:apply plugin:"ywplugin"

  4.在com.javassist.plugin中新建的类必须以.groovy结尾

  5.在JavassistPlugin.groovy中写类的时候必须加上包名,不然运行的时候不识别

 

总结:定义一个gradle插件时间非常简单的事情,可是就是这个简简单单的制作却能帮助我们解决大问题。

github传送门

 

posted on   飘杨......  阅读(2400)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示