Android与Gradle(一):Gradle插件开发

试试神奇的Gradle吧

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。

这是比较官方的说法,对于大多数Android开发者来说,也许根本不关心构建或者不了解构建过程,也就是在按下“运行”按钮后的“一瞬间”里自动完成的。事实上在Android Studio中,这些工作都是由Gradle来做的。

我们能够在appbuild.gradle里边看到大量的配置代码:

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.em.codegen"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    ...
}
复制代码

在Eclipse中开发的时候,大多数信息都是写在manifest.xml文件中的。

为什么要用Gradle

作为一个开发者,自动化项目就是日常开发的一部分。如果构建代码和其他代码一样,能够被扩展、测试和维护,那岂不爽哉? 没错,Gradle就是那种你要找的构建工具。

Gradle引人注目的特质

  1. 可表达的构建语言和底层的API
  2. Gradle就是Groovy
  3. 灵活的约定
  4. 可扩展的构建
  5. 轻松的可扩展性 ...

巴拉巴拉巴拉巴拉,我就不多说了,这些教科书式的定义如果你想看,那么请参看**《实战Gradle》(电子工业出版社)。对我们Androider来说,感觉最爽的是compile '...'**,我想你知道我在说什么(滑稽),程序猿都很懒的,别跟我讲你很勤快。

为什么从Gradle插件开发说起

笔者在项目过程中使用了GreenDAO这个数据库框架,发现它的大致结构是一个Gradle插件加上一个Java库。

这是我原先的猜测,但后来查看了源码才知道,它用的是freemarker模版生成框架。我起初误以为它是使用的类似于JCodeModel这样的框架,花了大量的时间去学习JCodeModel的用法才知道完全是白费功夫-.-

projectbuild.gradle文件中添加了如下引用:

classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
复制代码

appbuild.gradle文件中添加了如下引用:

apply plugin: 'org.greenrobot.greendao'
...
compile 'org.greenrobot:greendao:3.2.0'
复制代码

在开发者自定义好实体类,然后打上注解,然后点击build,GreenDAO插件会根据注解的实体类在app的build目录下生成相应的DAO类,然后开发者就可以在代码中调用这个生成的DAO类了。

我想到了实际项目中应该可以用得到这种思路,于是查阅了各种资料,然后实践,最后成功的实现了类似的功能。特此做一个笔记,以后肯定能用得到。

开发环境一览

以下内容因为开发环境的版本差异,可能会出现些许不同,因此仅作参考。

名称版本备注
JDK1.8.0_91
Android Studio2.3.3
gradle3.3Android Studio 2.3.3自带的gradle版本

扬帆起航

BuildSrc

首先,新建一个Android项目,名称随意,版本随意。

建好了之后将Android视图切换到Project视图,如下,无关紧要的都打上了码,当它们不存在就好了:

项目根目录下新建一个目录buildSrc,然后在buildSrc目录下新建如下图结构的文件夹:

基本结构就是src->main->groovy->com.em(你的插件项目包名),也许现在你看到的跟我的图不太一样,不要紧,接着往后面看。

buildSrc根目录下新建文件build.gradle,双击打开,添加以下代码:

apply plugin: 'groovy'
	
dependencies {
    compile gradleApi()
    compile localGroovy()
}
复制代码

然后打开项目根目录下打开settings.gradle,在**':app'**后边添加代码:

, ':buildSrc'
复制代码

注意有逗号哦,添加完成后,提示如下内容,意思就是gradle文件已经修改,请同步,点击Sync Now开始同步:

同步完成后,神奇的事情发生了,你会看到buildSrc目录下的文件发生了“翻天覆地”的变化:

groovy已经被Android Studio所接受,识别为groovy代码根目录了。

插件开发“环境”搭建

在前面的步骤中,插件开发的基本环境已经搭建完成了,插件所需要的代码都是建立在包com.em下的。

在刚才的包里新建文件MyPlugin.groovy,并添加如下代码:

package com.em

import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        //这里写插件的逻辑
    }
}
复制代码

这段代码就是Groovy,所谓的Java的“加强版”,如果你还不知道Groovy,那么你可以自行学习一下Groovy,这里就不展开说明了。Gradle开发所使用的语言一般是Groovy,或者混合了Java。(Groovy代码中可以直接调用Java代码)

简单插件开发

apply函数中添加代码:

project.tasks.create(name: 'hello') {
	println 'hello'
}
复制代码

直接打开app目录下的build.gradle,在上方添加:

import com.em.MyPlugin//按照包名.类名引用插件类
apply plugin: MyPlugin//启用插件
复制代码

添加完成之后点击弹出的提示中的Sync Now,打开Gradle Console窗口,往上翻,可以看到:

那么一个简单插件就做好了,前面说明的内容包括任务定义(task)、应用插件。你也许会问,为什么你看到的android插件是这样应用的:

apply plugin: 'com.android.application'
复制代码

因为它有一个名字,这里的引用方式是引用它的名字,这个名字是唯一的。

自定义插件名称

main目录下新建文件夹META-INF,然后在META-INF下新建文件夹gradle-plugins。接下来要给插件命名,建议的名称格式是包名.插件自定义名称,比如刚才定义的插件名称就应该是com.em.mp。名字定好了之后就在刚才建立的文件夹下新建文件com.em.mp.properties,完成后的目录结构应该与下图结构相似:

打开文件com.em.mp.properties,添加插件定义:

implementation-class=com.em.MyPlugin//等号右边就是前文定义的插件类的完整包名+类名
复制代码

这样名字就定义好了,那么在appbuild.gradle中就可以采用类似于android插件的方式引用了:

apply plugin: 'com.em.mp'
复制代码

自定义Gradle插件,插件命名已经实现了。在buildSrc中直接自定义是最简单的插件开发方式,可以直接进行插件代码测试。如果你开发的插件是要上传到Maven服务器,给别人用的,建议就不要使用这种方式了,当然你可以先使用这种方式做好插件并完成测试,保证不出错误的情况下,把开发完成的代码拷贝到预发布的项目目录下进行代码打包上传。


本篇文章仅代表个人观点,难免会有疏漏或者谬误之处,欢迎批评指正。

系列

  1. Gradle插件开发
  2. 插件打包上传到Maven服务器

转载于:https://juejin.im/post/5a3324d2f265da430d580ca9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值