目录
一、 Android Gradle插件
熟悉使用Android Studio构建Android项目的开发者都知道我们在创建一个Android项目的时候,都会在项目的根目录和每个Module的根目录下生成一个build.gradle文件,在Module目录下的build.gradle文件下都会有如下的描述:
plugins {
id 'com.android.application'
}
或
apply plugin: 'com.android.application'
那么这个com.android.application这个就是Android Gradle插件。
Android Gradle插件作用就是用来构建Android项目,该插件是有Google团队开发,通过这种方式将一些库提供给开发者调用。使用这种Gradle插件优势在于可以通过简单的配置实现代码和资源的重用,更方便的创建应用的衍生版本,例如多渠道打包。
二、Android Gradle插件分类
Android Studio构建的工程项目主要有三种:第一种是Application工程,该工程可以运行就可生成可运行的APK;第二种就是Library工程,这种工程可生成aar供其他Application工程使用;第三种工程就是Test工程,主要用于Application工程和Library工程测试使用。
那么这三种工程就对应着三种Android Gradle插件,也就是我们平时在项目中的Module、Library工程的build.gradle文件中最开始的相关内容:
- (1)在Module工程中的build.gradle中设置的是
apply plugin: 'com.android.application'
- (2)在Library工程中的build.gradle中设置的是
apply plugin: 'com.android.library'
- (3)在Test工程中的build.gradle中设置的是
apply plugin: 'com.android.test'
'com.android.application'、'com.android.library'、'com.android.test'就是这些Android Gradle插件的唯一id标识,在对应的工程增加相应的 Android Gradle插件,那么最后在编译整个项目的时候就会按照不同的作用打包到一起。
我们在项目中增加一个Android Gradle插件其实包括两部分内容:一个前面提到的应用Android Gradle插件,另外一个就是要在应用之前指定插件的执行环境。这些Google提供的Android Gradle插件是托管在jcenter上,所以通常还需要在项目的根目录的build.gradle中配置这些插件的执行环境,如下:
buildscript {
repositories {
//配置插件的仓库
google()
jcenter()
}
dependencies {
//配置插件的依赖
classpath "com.android.tools.build:gradle:4.1.1"
}
}
在第一部分中也提到了使用Gradle插件,可以通过简单的配置运行一些参数就可以复用代码和资源,那么像这些Google提供的Android Gradle插件,就是通过 android{}来提供配置的入口,也就是我们平常在Module的build.gradle文件中添加的一些Android项目的基本内容:
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.android.androidplugin"
minSdkVersion 23
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
三、自定义Gradle插件
通过上面分析的Google提供的Android Gradle插件,了解到一个Gradle插件包括:一个唯一的id标识、一个执行环境(包括maven仓库和依赖)、一个配置项、插件需要实现的功能。那么我们在自定义一个Gradle插件的时候也应该包括这四部分的内容。现在就从这四方面去说明下怎么创建一个简单的Gradle插件。
1.创建Gradle Module
Android Studio暂时还没有提供类似的Gradle Plugin快捷方式,那么我们就需要自己来创建这个Gradle插件。
- (1)新建一个Android Project
就是我们平时新建一个Android Project的方式来创建工程,命名为AndroidPlugin
- (2)新建一个Module
这里也是平常创建Module的方式来创建一个Module。这里可以的Module的类型任意,可以是Phone&Tablet Module 也可以是Android Library,因为创建该Module只是用来放插件的容器,里面的大部分内容都是要删除的。
命名该Module为FirstPlugin,然后将里面的文件除去build.gradle和src/main目录,其余的全部删除,src/main目录仅留目录,里面的文件全部删除。
- (3)添加相关的文件目录
1)由于Gradle基于groovy,因此开发一个Gradle插件相当于一个groovy项目,所以要在src/main下创建一个groovy的目录
2)groovy项目又是基于java,所以后面添加文件的方式和java项目类似,我们可以用包的方式管理java文件,这里我们创建一个包名为com.wj.plugin的目录
3)在src/main下创建存放库和名字的配置文件,即resources/META-INF/gradle-plugins下创建com.wj.firstplugin.properties文件,注意这个com.wj.firstplugin就为这个自定义插件的名字,也就是唯一id
2.配置Gradle开发环境
在FirstPlugin的根目录下的build.gradle文件添加以下内容:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
//gradle sdk
implementation gradleApi()
//groovy sdk
implementation localGroovy()
}
repositories {
mavenCentral()
}
//打包到本地或者远程maven库
uploadArchives {
repositories {
mavenDeployer {
//这个就是配置这个自定义插件的classpath
pom.groupId = 'com.wj.plugin'
pom.artifactId = 'FirstPlugin'
pom.version = '1.0.0'
//提交到远程服务器
// repository(url:"服务器地址"){
// authentication(userName:'admin',password:'admin')
// }
//本地maven地址
repository(url: uri('../plugins'))
}
}
}
简单备注下groupId 、artifactId、version:
(1)groupId:定义项目属于哪个组
(2)artifaceId:定义当前maven项目在组的唯一Id
(3)version:当前版本号
最终通过这三个值来指定该Gradle的classpath为'groupId:artifaceId:version',也就是我们在使用该插件时的依赖的classpath:com.wj.plugin:FirstPlugin:1.0.0。
3.添加自定义Gradle的相关代码
- (1)在src/main/groovy/com/wj/plugin下创建插件的入口文件FirstPlugin.java,并且该类要实现Plugin<Project>,代码如下:
public class FirstPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
System.out.println("================");
System.out.println("Hello FirstPlugin");
System.out.println("================");
}
}
- (2)在resources/META-INF/gradle-plugins/com.wj.firstplugin.properties文件下,配置插件的入口类,代码如下:
#配置插件的入口类
implementation-class=com.wj.plugin.FirstPlugin
- (3)点击Android Studio右侧的Gradle工具
点击Tasks里面的build,没有编译异常
Executing tasks: [build] in project /Users/j1/Documents/android/code/studio/AndroidPlugin/FirstPlugin
> Task :FirstPlugin:compileJava NO-SOURCE
> Task :FirstPlugin:compileGroovy UP-TO-DATE
> Task :FirstPlugin:processResources UP-TO-DATE
> Task :FirstPlugin:classes UP-TO-DATE
> Task :FirstPlugin:jar UP-TO-DATE
> Task :FirstPlugin:assemble UP-TO-DATE
> Task :FirstPlugin:compileTestJava NO-SOURCE
> Task :FirstPlugin:compileTestGroovy NO-SOURCE
> Task :FirstPlugin:processTestResources NO-SOURCE
> Task :FirstPlugin:testClasses UP-TO-DATE
> Task :FirstPlugin:test NO-SOURCE
> Task :FirstPlugin:check UP-TO-DATE
> Task :FirstPlugin:build UP-TO-DATE
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.5/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 208ms
3 actionable tasks: 3 up-to-date
16:14:46: Task execution finished 'build'.
点击Tasks里面的jar,就可以在build/libs下面生成FirstPlugin.jar。
4.插件发布
经过上面三步之后,一个简单的自定义Gradle插件就完成了。那么还要经过打包发布出去。这就是我们在第二步中提到的配置build.gradle中的uploadArchives{}内容。如果是上传到远程服务器就是配置以下内容:
//提交到远程服务器
repository(url:"服务器地址"){
authentication(userName:'admin',password:'admin')
}
如果仅仅是放在本地的化,可以直接采用下面的方式
//本地maven地址
repository(url: uri('../plugins'))
上面的两个url就是我们在后面使用这个自定义插件的仓库
配置好之后,还是点击右侧的gradle工具的Tasks下面的upload的uploadArchives,即可完成打包发布。
完成之后就会在项目的根目录下生成下面结构的文件
到目前为止,已经完成一个自定义Gradle插件的过程。该Gradle插件的唯一ID为com.wj.firstplugin也就是在resources/META-INF/gradle-plugins下创建com.wj.firstplugin.properties文件的文件名;配置环境需要用到的maven仓库为/plugins和依赖的classpath为com.wj.plugin:FirstPlugin:1.0.0
5.使用插件
只要在我们Android的app这个Module以及项目的根目录下的build.gradle进行配置就可以完成该插件的使用。
- (1)在项目的根目录的build.gradle配置maven仓库和依赖的classpath
buildscript {
repositories {
。。。。。。
//FirstPlugin的maven仓库
maven{
//maven仓库的地址
url uri('plugins')
}
}
dependencies {
。。。。。。。。。
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
//FirstPlugin的依赖
classpath "com.wj.plugin:FirstPlugin:1.0.0"
}
}
- (2)在app这个Module下的的build.gradle使用该插件
plugins {
//该插件的id
id 'com.wj.firstplugin'
}
- (3)编译项目,就会看到有之前的日志输出
四、总结
现在对Android的Gradle插件的开发有一点点感觉和认知了,在本文中主要介绍了一个自定义Gradle插件的“一个唯一的id标识”和“一个执行环境(包括maven仓库和依赖)”。至于“一个配置项”后面在单独总结或者后续在增加内容。
学习是快乐的,加油!!!!
相关的代码已经上传到github。github的地址:https://github.com/wenjing-bonnie/AndroidPlugin.git