概述

android项目构建主要由com.android.application及com.android.library两个插件完成,要了解android构建及插

件化,gradle插件学习是必由之路。

Gradle相关语法

在这里不再重复Gradle相关的语法,如果要学习gradle相关的东西,请查看上篇
http://www.jianshu.com/p/57d99c983a7a。官方文档上也有自定义插件的介绍。

插件类型

Gradle的插件一般有这么几种:
一种是直接在项目中的gradle文件里编写,这种方式的缺点是无法复用插件代码,在其他项目中还得复制一遍代码(或者说说复制一遍文件)
另一种是在独立的项目里编写插件,然后发布到中央仓库,之后直接引用就可以了,优点就是可复用(重点学习这种)。

Gradle插件开发

Gradle插件是使用Groovy进行开发的,而Groovy其实是可以兼容Java的。AndroidStudio其实除了开发androidApp外,完全可以胜任开发Gradle插件这一工作,下面来讲讲具体如何开发。

1:首先,新建一个Android项目。

2:之后,新建一个Android Module项目,类型选择Android Library。(AndroidStudio中是没有新建类似Gradle Plugin这样的选项的,那我们如何在AndroidStudio中编写Gradle插件)

3:将新建的Module中除了build.gradle文件外的其余文件全都删除,然后删除build.gradle文件中的所有内容后改为如下。

apply plugin: 'groovy'apply plugin: 'maven'dependencies {//gradle sdk    compile gradleApi()//groovy sdk    compile localGroovy()}repositories {    url ***}

4:在新建的module中新建文件夹src,接着在src文件目录下新建main文件夹,在main目录下新建groovy目录,这时候groovy文件夹会被Android识别为groovy源码目录(由于gradle是基于groovy,因此,我们开发的gradle插件相当于一个groovy项目)。

package  com.peyton.testimport org.gradle.api.Pluginimport org.gradle.api.Projectpublic class PluginImpl implements Plugin {    void apply(Project project) {        System.out.println("========================");        System.out.println("hello gradle plugin!");        System.out.println("========================");    }}

5:除了在main目录下新建groovy目录外,你还要在main目录下新建resources目录,同理resources目录会被自动识别为资源文件夹。在groovy
目录下新建项目包名,就像Java包名那样。resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹。然后在
resources/META-INF/gradle-plugins目录下新建一个properties文件,注意该文件的命名就是你只有使用插件的名字,这里命名为com.peyton.testplugin.properties,在里面输入

implementation-class=com.peyton.test.PluginImpl(指向项目groovy目录下Plugin子实现类)

目前,项目的结构是这样的。


QQ图片20170825155855.png

6:上传maven,将项目写好的上传gradle脚本(主要配置了uploadArchives中需要用到的groupId,artifactId及version),复制到项目下然后执行uploadArchives task,即上传到maven。
也可以先上传到本地的maven,方法如下:
6.1:在插件module的build.gradle中

//group和version在后面使用自定义插件的时候会用到group='com.tc.plugin'version='1.0.0'uploadArchives {    repositories {        mavenDeployer {            //提交到远程服务器:           // repository(url: "http://****/repos") {            //    authentication(userName: "***", password: "***")           // }           //本地的Maven地址设置为D:/repos            repository(url: uri('../repo'))        }    }}

6.2 在使用的module的build.gradle中

buildscript {    repositories {        maven {//本地Maven仓库地址            url uri('../repo')        }    }    dependencies {        //格式为-->group:module:version        classpath 'com.tc.plugin:myplugin:1.0.0'    }}//com.hc.gradle为resources/META-INF/gradle-plugins//下的properties文件名称apply plugin: 'com.peyton.testplugin'

7:项目中使用:在项目中需要用到插件的地方引入插件,如app目录下build.gradle

buildscript {    repositories {        maven {//本地Maven仓库地址            url ***********        }    }    dependencies {        //格式为-->groupId:artifactId:version        classpath 'com.plugin.test:myplugin:1.0.0'    }}//com.peyton.testplugin为resources/META-INF/gradle-plugins//下的properties文件名称apply plugin: 'com.peyton.testplugin'

以上就完成了最简单的插件

简单自定义配置并读取build.gradle值

根据Gradle官网的介绍,Project是你与Gradle交互的主接口,故将Project作为自定义Plugin的泛型传入

implements Plugin

通过Project访问的使用场景:Extension。先看一个熟悉的内容:

android {    compileSdkVersion 24    buildToolsVersion "24.0.0"    defaultConfig {        applicationId "com.peyton.test"        minSdkVersion 15        targetSdkVersion 24        versionCode 1        versionName "1.0"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}

上面的android{}、compileSdkVersion、defaultConfig {}等等这些设置就是通过Extension。下面我们自定义一个Extension。首先,定义两个Groovy类:Address和TestExtension.

class Address{    String province=null    String city=null}class TestExtension{    String myName = null;}

再自定义Plugin:

class PluginImpl implements Plugin {    @Override    void apply(Project project) {        project.extensions.create('tc',TestExtension);        project.extensions.create('address', Address);        project.task('readExtension') << {            def address=project['address']            println project['tc'].myName            println address.province+" "+address.city        }    }}

接下来就是使用插件(即build.gradle 中):

apply plugin 'com.peyton.testplugin'tc {    address{       province "Fujian"        city "Xiamen"    }    myName "Peyton"}

com.peyton.testplugin这一行会导致直接执行PluginImpl 类的apply方法。所以,tc{}这个块必须放在com.peyton.testplugin之后,因为在没有执行project.extensions.create('tc',TestExtension);之前,使用tc{}会报错!address{}也是同理。另外,补充一下:project.extensions相当于project.getExtensions()即返回的是ExtensionContainer对象(上一篇groovy语法特性中有讲到)而ExtensionContainer对象的create方法就是把tc{}TestExtension对应起来。其他通过project.的方式也是同样的道理。再看看project.task('readExtension'),这是创建一个task。相当于在build.gradle文件中的task xxx <<{}只不过这里是通过代码的方式动态创建.接下来只需要在命令行中运行readExtension 任务即可看下如下信息

:testmodule:readExtensionPeytonFujian Xiamen

更多相关文章

  1. android支付之银联支付
  2. Android(安卓)项目如何获取MD5和SHA1
  3. android 执行sql的长度限制
  4. cocos2dx 2.2.2 的Android交叉编译问题汇总
  5. 2018最新精选的Android优秀开源库和项目
  6. 新建Android项目
  7. (1)Android开源项目介绍
  8. android studio导入类库
  9. 环境搭建好后的第一个Android(安卓)项目

随机推荐

  1. Internal error. Please report to https
  2. Android多点触摸缩放图片-android学习之
  3. 对View DrawingCache的理解
  4. Android ListView+image的使用
  5. [Android] 代码实现按钮/图片自旋转(中心
  6. Andorid在布局文件中中文加粗
  7. (20120808)(01)android菜单与对话框--之日期
  8. android 获得屏幕宽度 高度
  9. 在AndroidManifest.xml文件中的android:w
  10. Widget动态换背景图片 android