在项目的build.gradle文件中,我们可以看到默认的插件是这样的。
1 | apply plugin: 'com.android.application' |
注意,本项目使用了kotlin,所以多用了两个插件,分别是kotlin-android和kotlin-android-extensions两个插件,如果我们需要自定义自己的插件,那么需要按照如下步骤创建
创建自定义插件
创建自定义插件项目
需要创建自定义gradle插件,第一步创建新module,但是需要注意,我们需要在项目的setting.gradle中将它去掉。
这里特别注意的是自定义插件项目的module名字是约定好的,必须为buildSrc
创建完module后目录如下:
创建插件类
我这里是用Kotlin进行编写的,代码如下
1 | package com.example.multilingual |
其中的apply函数就是将插件引入到项目中的逻辑
自定义插件名字
我们的项目名是buildSrc无法自定义,但是插件的名字是我们自己定义的,定义的方法如下:
在项目的main目录下创建resources目录,再在resources目录下创建META-INF目录,META-INF目录下再创建gradle-plugins目录,再gradle-plugins目录下我们就能声明我们的自定义插件了,我们需要创建自定义插件名.properties
最后的目录结构如下
可以看到,我自定义插件名字为cn.wongzhenyu.multilingual,这里要取自己的名字。
再这个文件中,我们还需要指定插件的入口,我这里填的如下:
1 | implementation-class=com.example.multilingual.AutoMultilingualResourcePlugin |
这样,我们就指定了本插件的入口,我们可以在主项目中使用了,像这样
1 | apply plugin: 'cn.wongzhenyu.multilingual' |
配置自定义插件
我们可以看到,Android插件需要配置很多东西,想这样
1 | android { |
自定义插件也能够实现这样,在build.gradle中配置参数,然后我们在插件中可以读取到,实现方式如下
创建扩展类
1 | package com.example.multilingual |
可以看到,我们创建了一个类,只有一个布尔值变量值为true
在build.gradle中配置参数
1 | multilingual { |
在自定义插件中创建扩展类并读取参数
1 | package com.example.multilingual |
这里需要特别注意的是,我们读取在build.gradle中配置的参数必须是在gradle的evaluate声明周期之后,否则读取的参数还是默认的,而不是在build.gradle中配置的
另一种插件:Transform
transform是插件是另一种用法,它相当于在app打包的过程中再插入了一个task,这个task会在assembleDebug之前执行,具体的代码如下:
1 | package com.example.multilingual |
默认正确的transform函数如下,这是使用groovy实现的:
1 |
|
Transform插件实现过程中需要实现的几个函数作用如下:
- getName
返回task的名字
- getInputTypes()
处理的文件的类型
- getScopes()
处理的文件范围
- isIncremental()
在transform()函数中对文件列表是否有增删改
- transform()
具体的实现逻辑函数