Android Gradle 自定义入门

今天我们来讲解下自定义 gradle 插件的方式和如何上传到 Jcenter 仓库。

img

自定义

插件开发可以用很多种方式,今天我们来讲讲。

  • 在 build.gradle 中直接定义
  • 在Android 项目中 ,创建 buildSrc 目录
  • 通过 module 方式创建
  • 使用 idea 创建单独的项目

重要:自定义 plugin 里面没有语法检测,所以出现语法问题的话,就会报错

* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin [id 'myCustomPlugin']
   > No such property: traget for class: com.ruoyun.TwoPlugin

那么我们开始

img

1.在 build.gradle 中直接定义

这样定义只能作用在定义的子项目中。

定义在 app 目录下的 build.gradle 文件中。

我们定义一个叫 TestPlugin 的插件,然后继承 Plugin<Project>

创建属性e1e2,用来从外部获取参数,然后在插件中就可以直接使用。

/**
 * 分别定义Extension1 和 Extension2 类,申明参数传递变量
 */
class Extension1 {
    String testVariable1 = null
}

class Extension2 {
    String testVariable2 = null
}
/**
 * 插件入口类
 */
class TestPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        //利用Extension创建e1 e2 闭包,用于接受外部传递的参数值
        project.extensions.create('e1', Extension1)
        project.extensions.create('e2', Extension2)

        //创建readExtension task 执行该task 进行参数值的读取以及自定义逻辑...
        project.task('readExtension') {
            //gradle 5.0 优化了 << 替换成 doLast
            doLast {
                println 'e1 = ' + project['e1'].testVariable1
                println 'e2 = ' + project['e2'].testVariable2
            }
        }
    }
}

在 app 目录下的 build.gradle 文件中,使用此插件,代码如下:

apply plugin: 'com.android.application'
apply plugin: TestPlugin

e1 {
    testVariable1 = 'testVariable1'
}

e2 {
    testVariable2 = 'testVariable2'
}

2.在Android 项目中 ,创建 buildSrc 目录

目录结构如下,项目名称一定要定义成 buildSrc,不然会编译不过。

img

创建完成后,直接在想要使用这个插件的项目的 build.gradle 中添加

apply plugin: 'myCustomPlugin'

插件名称为 .properties 的名称。

3.通过 module 方式创建

在 settings.gradle 文件中添加 module 名字。步骤和 2 相同

  • 需要手动依赖
  • 需要上传到maven仓库中
  • 这样会产生鸡生蛋的问题,在生成 pom 的过程中,如果之前的 plugin 有问题,那么需要把项目中相关的配置注释掉,才能正常的执行。把apply plugin: 'ThreePlugin' 注释掉。
  • 建议使用 idea 创建独立的 项目。有提示,有错误检查。
img

但是这样不能自己使用编译的插件,需要上传到本地 或者 maven 服务器

build.gradle 文件的配置如下:

apply plugin: 'groovy'
apply plugin: 'maven'

repositories {
    mavenCentral()
    mavenLocal()
    google()
    jcenter()
}

dependencies {
    implementation gradleApi()
    implementation localGroovy()
    implementation 'com.android.tools.build:gradle:3.1.4'

}

group 'com.ruoyun'
version '1.0.0'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}

执行 uploadArchives 就会在本地生成 pom

img

使用

在主的 build.gradle 中进行配置。

buildscript {
    repositories {
        google()
        jcenter()
        maven {
            url uri('./repo')
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0-alpha13'
        classpath 'com.ruoyun:screen-plugin:1.0.0'
    }
}

然后在子项目中的 build.gradle 中使用

apply plugin: 'ThreePlugin'

4.使用 idea 创建单独的项目

打开 idea ,创建项目,选择 Gradle。

img

会自动创建文件目录,目录如下:

img

build.gradle 配置

plugins {
    id 'java'
    id 'groovy'
    id 'maven'
}

group 'vip.ruoyun'
version '1.0.0'
//artifactId 'TestPlugin'

buildscript {
    repositories {
        jcenter()
        google()
        mavenCentral()
        mavenLocal()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50"
        classpath 'com.android.tools.build:gradle:3.5.0'
    }
}

repositories {
    mavenCentral()
    mavenLocal()
    google()
    jcenter()
}

dependencies {
    //使用最新版本
    implementation 'org.codehaus.groovy:groovy-all:2.5.8'
    implementation 'com.android.tools.build:gradle:3.5.0'
    //transform依赖,一定要加,不然你一会怎么报错你也不知道
    implementation 'com.android.tools.build:gradle-api:3.5.0'
    implementation gradleApi()
    implementation localGroovy()
}

uploadArchives {
    repositories {
        mavenDeployer {
            //本地的Maven地址设置为D:/repos
//            repository(url: uri("$rootDir/maven"))
            repository(url: uri("/Users/ruoyun/Downloads/coreCode/ModelTest/maven"))
        }
    }
}

如果想要查看 gradle 的源码,修改 gradle-wrapper.properties 。all 为可以查看源码(gradle-5.6.1-bin 是不可以查看源码的)。

distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

执行 uploadArchives 就会在本地生成 pom

<img src="http://pic.ruoyun.vip/blog/2019-09-30-044331.jpg-mark" alt="15571135379887" style="zoom:50%;" />

在主的 build.gradle 中进行配置。

buildscript {
    repositories {
        google()
        jcenter()
        maven {
            url uri('./repo')
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0-alpha13'
        classpath 'com.ruoyun:screen-plugin:1.0.0'
    }
}

然后在子项目中的 build.gradle 中使用

apply plugin: 'ThreePlugin'

上传 jcenter

img

1).配置

在根 build.gradle 中添加配置:

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
        classpath 'com.novoda:bintray-release:0.9.1'
    }
}

在需要上传的子项目中创建 jcenter.gradle 文件,拿我的一个开源项目来讲解一下:

路径如下,可以点击查看

https://github.com/bugyun/MissPermission/blob/master/MissPermissionPro/jcenter.gradle

//上传 jcenter 的插件
apply plugin: 'com.novoda.bintray-release'

/**
 * 参考
 * 'com.android.support.test.espresso:espresso-core:3.0.2'
 *  group: 'com.android.support.test.espresso', name: 'espresso-core', version: '3.0.2'
 */

// 新增
publish {
    userOrg = 'bugyun'        //bintray.com用户名
    groupId = 'vip.ruoyun.permission'    //项目的组,对应参考例子中的 group
    artifactId = 'miss-pro'   //项目名称 name,对应参考例子中的 name
    publishVersion = '1.0.1'//版本号 version,对应参考例子中的 version
    desc = 'Android 权限请求库 MissPermission pro版'//描述,必须
    website = 'https://github.com/bugyun/MissPermission' // github 网址,必填,不然jcenter审核不过
}

可以参考注释。

然后在 子的 build.gradle 中添加如下配置:

apply plugin: 'com.android.library'
apply from: 'jcenter.gradle'//上传 jcenter 的插件

2).上传到 bintray

添加完成之后,就可以上传自己的插件或者第三方库。执行下面的命令。(默认你有 jcenter 账号)

https://bintray.com/ 中找到如下界面,PbintrayUser 换成你的jcenter 账号的信息。

img

在命令行中执行:

./gradlew clean build bintrayUpload -PbintrayUser=bintray.user -PbintrayKey=bintray.apikey -PdryRun=false

执行完上面的命令之后,会在你的 https://bintray.com/ 仓库中显示,但是还没提交到 Jcenter,需要你手动提交请求。


3).发布到 JCenter

发布也很简单进入项目页,找到你上传的项目,然后点击进入,点击Add to JCenter,然后点击send就OK了。

新版入口在项目中的 actions 按钮里

img

旧版在右下角。

img

这样一次发布就完成了。

下次要发布其他项目直接配置好项目,直接推送就可以了。

4).注意

bintray服务器需要你自备梯子。如果没梯子可以访问,请忽略词条信息。

img

如果你喜欢我的文章,可以关注我的掘金、公众号、博客、简书或者Github!

简书: https://www.jianshu.com/u/a2591ab8eed2

GitHub: https://github.com/bugyun

Blog: https://ruoyun.vip

掘金: https://juejin.im/user/56cbef3b816dfa0059e330a8/posts

CSDN: https://blog.csdn.net/zxloveooo

欢迎关注微信公众号

image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容