Android Gradle插件开发初次交手

目录

一、 Android Gradle插件

二、Android Gradle插件分类

三、自定义Gradle插件

1.创建Gradle Module

2.配置Gradle开发环境

3.添加自定义Gradle的相关代码

4.插件发布

5.使用插件

四、总结


一、 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

猜你喜欢

转载自blog.csdn.net/nihaomabmt/article/details/112308851
今日推荐