SlideShare ist ein Scribd-Unternehmen logo
1 von 20
2016年5月6日
刘俊
IPD创新产品部
Android Gradle
从入门到GG
第3课: Plugin
Development
• Gradle 插件开发
第3课: Plugin development
Hello Gradle
• 第1课讲过 buildSrc/ 模块会被加载到 gradle classpath 中
import org.gradle.api.Plugin
import org.gradle.api.Project
class HelloGradle implements Plugin<Project> {
void apply(Project project) {
project.task('hello') << {
println "Hello from the HelloPlugin"
}
}
}
• Gradle 插件只需 实现 Plugin<Project> 接口
• apply(Project project) 方法是插件的入口
• 插件创建一个 hello 任务
Hello Gradle
• app/ 模块 apply 刚才写的 HelloGradle 插件
import com.meizu.samples.HelloGradle
apply plugin: 'com.android.application'
apply plugin: HelloGradle
与插件通讯?
• Hello 招呼已经打过, 那么如何与插件通讯呢?
• Gradle extensions 与 Gradle container 是常用的两种
gradle DSL 方式
• 例如, 我们修改一下 HelloPlugin, 让插件引用者告诉
插件自己叫什么, 插件根据引用者的名字来 Hello
• Gradle extensions
Gradle extensions
project.extensions.create(extensionName, extensionClass):
创建一个 Gradle extension
class GreetingExtension {
String message = 'Hello'
String greeter = 'Gradle'
}
class HelloGradle implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("greeting", GreetingExtension)
project.task('hello') << {
println "${project.greeting.message} from ${project.greeting.greeter}"
}
}
}
Gradle extensions
引用插件后, 就可以通过插件的 extensions DSL 来传入配置参数
给插件
import com.meizu.samples.HelloGradle
apply plugin: 'com.android.application'
apply plugin: HelloGradle
// 使用 greeting extension
greeting {
message = 'Hallelujah'
greeter = 'Gradle'
}
与插件通讯?
• Hello 招呼已经打过, 那么如何与插件通讯呢?
• Gradle extensions 与 Gradle container 是常用的两种
gradle DSL 方式
• 假如, 我们有好多个人, 要插件对这些人一一 Say
hello 呢?
• Gradle container
Gradle container
project.container.(containerClass): 创建一个 Gradle container
class GreetingContainer {
final String name
List<String> msgList = []
GreetingContainer(String name) { this.name = name }
void message(String...args) { msgList += Arrays.asList(args) }
}
class HelloGradle implements Plugin<Project> {
void apply(Project project) {
def greetings = project.container(GreetingContainer)
project.extensions.greetings = greetings
project.task(‘hellos’) << {
greetings.all { // 遍历 greetings
println "${it.msgList*.toString()} from ${it.name}"
}
}
}
}
Gradle container
app/ 模块 DSL 使用方法, 类似 android productFlavors DSL
apply plugin: HelloGradle
greetings {
Jack {
message "Hallelujah"
}
Jill {
message "Hallelujah ", "again"
}
}
独立的插件项目
• 目前为止, 我们的插件都在 buildSrc 中直接写的代
码, 只能用于当前的 工程 模块
• 想被其他模块引用, 需要独立成 jar 包, 被引用者
classpath
模块结构
• resources/META-INF/gradle-plugins/${plugin-name}.properties
插件 Manifest 入口, properties文件名为 插件名
类似 Android App 中的 AndroidManifest.xml
• implementation-class=${全路径类名} 定位到 groovy 类
类似 Android App 中的 Application 入口
独立的插件项目
• 需要 groovy 插件
• 依赖 gradleApi(): 使插件项目能够调用到 gradle api
• 依赖 localGroovy(): 调用到 groovy sdk
• 不要忘记了 android gradle plugin 依赖
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
compile 'com.android.tools.build:gradle:2.1.0'
}
独立的插件项目
• 将 buildSrc/ 中的插件代码 整理
过来
• 为什么, buildSrc/ 中类都写在一
个文件中呢? 因为 buildSrc/ 与
JDK的兼容性很有问题, 类分开会
报错
• 至此, 独立插件已经完成, 运行 assemble 或者 jar, 可以打包出插件
jar 包
独立的插件项目
• Maven 呢?
• 使用 maven 插件, 将 jar 包打包到 父目录(根目录)的 .repo 仓库
• 发布到远程 Maven仓库, 以及 jcenter, 以及artifactory在后续的CI集
成课程再详讲
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../.repo'))
pom.version = '1.0'
pom.artifactId = 'standalone'
}
}
}
apply plugin: 'maven'
// for local maven publish
group = 'com.meizu.samples'
version = '1.0'
status = 'RELEASE‘
// artifact to be uploaded
artifacts {
archives jar
}
独立的插件项目
• Local Maven !
独立的插件项目
• 引用插件 - classpath
buildscript {
repositories {
jcenter()
maven {
url uri('.repo') // 相对本gradle文件的路径
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath group: 'com.meizu.samples', name: 'standalone',
version: '1.0'
}
}
独立的插件项目
• 引用插件 – 使用
apply plugin: 'standalone-plugin'
greetings {
Jack {
message "Hallelujah"
}
Jill {
message "Hallelujah ", "again"
}
}
• 至此, 独立插件全部流程, 你已经掌握了
android-soexcluder 插件
实际应用…
2016年5月6日
刘俊
这将是一个系列课程,
每周一节课
IPD创新产品部
来看一下简单的 android so 过滤插件 android soexcluder
此插件开源在 https://github.com/Jween/android-soexcluder
课后任务
samples内有BasicPlugin 工程, 以及 StandAlone
Plugin 工程 为本次课程的讲义工程
请实现一个简单的插件, 使用 gradle container
来收集 插件使用者的 书籍 信息, 并输出这些
书籍的信息
http://git.ipd.meizu.com/AnR/android-gradle-samples
记得使用自己的邮箱名作为分支名PR给我
[Github用户移步] https://github.com/Jween/android-gradle-samples

Weitere ähnliche Inhalte

Was ist angesagt?

20170905 dev ops in hiiir
20170905 dev ops in hiiir20170905 dev ops in hiiir
20170905 dev ops in hiiirIsaac Tseng
 
Clojure cnclojure-meetup
Clojure cnclojure-meetupClojure cnclojure-meetup
Clojure cnclojure-meetupsunng87
 
ModernWeb 2017 angular component
ModernWeb 2017 angular componentModernWeb 2017 angular component
ModernWeb 2017 angular componentChieh Kai Yang
 
開發人員不可不知的 Windows Container 容器技術預覽
開發人員不可不知的 Windows Container 容器技術預覽開發人員不可不知的 Windows Container 容器技術預覽
開發人員不可不知的 Windows Container 容器技術預覽Will Huang
 
VSCode Remote Development 介紹
VSCode Remote Development 介紹VSCode Remote Development 介紹
VSCode Remote Development 介紹Philip Zheng
 
用 Go 語言 打造微服務架構
用 Go 語言打造微服務架構用 Go 語言打造微服務架構
用 Go 語言 打造微服務架構Bo-Yi Wu
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作Bo-Yi Wu
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
Go 語言基礎簡介
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介Bo-Yi Wu
 
用 Drone 打造 輕量級容器持續交付平台
用 Drone 打造輕量級容器持續交付平台用 Drone 打造輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台Bo-Yi Wu
 
20170217 julia小程式到專案發布之旅
20170217 julia小程式到專案發布之旅20170217 julia小程式到專案發布之旅
20170217 julia小程式到專案發布之旅岳華 杜
 
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)Will Huang
 
容器與 Gitlab CI 應用
容器與 Gitlab CI 應用容器與 Gitlab CI 應用
容器與 Gitlab CI 應用Philip Zheng
 
用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps BotBo-Yi Wu
 
CICD Workshop 20180922
CICD Workshop 20180922CICD Workshop 20180922
CICD Workshop 20180922Earou Huang
 
VSCode Remote Development
VSCode Remote DevelopmentVSCode Remote Development
VSCode Remote DevelopmentPhilip Zheng
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027Wei Sun
 
Gradle 和 Android Studio --- Jason Ko
Gradle 和 Android Studio --- Jason KoGradle 和 Android Studio --- Jason Ko
Gradle 和 Android Studio --- Jason Ko力中 柯
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發Weizhong Yang
 

Was ist angesagt? (20)

20170905 dev ops in hiiir
20170905 dev ops in hiiir20170905 dev ops in hiiir
20170905 dev ops in hiiir
 
Clojure cnclojure-meetup
Clojure cnclojure-meetupClojure cnclojure-meetup
Clojure cnclojure-meetup
 
ModernWeb 2017 angular component
ModernWeb 2017 angular componentModernWeb 2017 angular component
ModernWeb 2017 angular component
 
開發人員不可不知的 Windows Container 容器技術預覽
開發人員不可不知的 Windows Container 容器技術預覽開發人員不可不知的 Windows Container 容器技術預覽
開發人員不可不知的 Windows Container 容器技術預覽
 
VSCode Remote Development 介紹
VSCode Remote Development 介紹VSCode Remote Development 介紹
VSCode Remote Development 介紹
 
用 Go 語言 打造微服務架構
用 Go 語言打造微服務架構用 Go 語言打造微服務架構
用 Go 語言 打造微服務架構
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
Go 語言基礎簡介
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介
 
用 Drone 打造 輕量級容器持續交付平台
用 Drone 打造輕量級容器持續交付平台用 Drone 打造輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台
 
Swagger
SwaggerSwagger
Swagger
 
20170217 julia小程式到專案發布之旅
20170217 julia小程式到專案發布之旅20170217 julia小程式到專案發布之旅
20170217 julia小程式到專案發布之旅
 
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
 
容器與 Gitlab CI 應用
容器與 Gitlab CI 應用容器與 Gitlab CI 應用
容器與 Gitlab CI 應用
 
用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot
 
CICD Workshop 20180922
CICD Workshop 20180922CICD Workshop 20180922
CICD Workshop 20180922
 
VSCode Remote Development
VSCode Remote DevelopmentVSCode Remote Development
VSCode Remote Development
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027
 
Gradle 和 Android Studio --- Jason Ko
Gradle 和 Android Studio --- Jason KoGradle 和 Android Studio --- Jason Ko
Gradle 和 Android Studio --- Jason Ko
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
 

Andere mochten auch

Reactive X 响应式编程
Reactive X 响应式编程Reactive X 响应式编程
Reactive X 响应式编程Jun Liu
 
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式信宏 陳
 
手機自動化測試和持續整合
手機自動化測試和持續整合手機自動化測試和持續整合
手機自動化測試和持續整合Carl Su
 
大型App面臨的挑戰
大型App面臨的挑戰大型App面臨的挑戰
大型App面臨的挑戰Chih-Chung Lee
 
Android layout 工程師在想什麼?給視覺設計師
Android layout   工程師在想什麼?給視覺設計師Android layout   工程師在想什麼?給視覺設計師
Android layout 工程師在想什麼?給視覺設計師Kane Shih
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaKros Huang
 
持續整合與單元測試
持續整合與單元測試持續整合與單元測試
持續整合與單元測試昱劭 劉
 
Android進階UI控制元件
Android進階UI控制元件Android進階UI控制元件
Android進階UI控制元件艾鍗科技
 
Android 介面設計
Android 介面設計Android 介面設計
Android 介面設計PingLun Liao
 
窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconf窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconfjack51706
 
Hockey Kit for Android
Hockey Kit for AndroidHockey Kit for Android
Hockey Kit for Android旭辰 羅
 
Android動態ui介面設計
Android動態ui介面設計Android動態ui介面設計
Android動態ui介面設計艾鍗科技
 
淺談 Geb 網站自動化測試(JCConf 2014)
淺談 Geb 網站自動化測試(JCConf 2014)淺談 Geb 網站自動化測試(JCConf 2014)
淺談 Geb 網站自動化測試(JCConf 2014)Kyle Lin
 
[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the androidJun Liu
 
MOPCON 2015 - 軟體、測試、程式設計家
MOPCON 2015 - 軟體、測試、程式設計家MOPCON 2015 - 軟體、測試、程式設計家
MOPCON 2015 - 軟體、測試、程式設計家家弘 周
 
Gradle,the new build system for android
Gradle,the new build system for androidGradle,the new build system for android
Gradle,the new build system for androidzhang ghui
 
超酷炫科幻 UI:QML 入門
超酷炫科幻 UI:QML 入門超酷炫科幻 UI:QML 入門
超酷炫科幻 UI:QML 入門Fred Chien
 
關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......hugo lu
 
用十分鐘將你的網站送上雲端
用十分鐘將你的網站送上雲端用十分鐘將你的網站送上雲端
用十分鐘將你的網站送上雲端鍾誠 陳鍾誠
 

Andere mochten auch (20)

Reactive X 响应式编程
Reactive X 响应式编程Reactive X 响应式编程
Reactive X 响应式编程
 
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
 
手機自動化測試和持續整合
手機自動化測試和持續整合手機自動化測試和持續整合
手機自動化測試和持續整合
 
大型App面臨的挑戰
大型App面臨的挑戰大型App面臨的挑戰
大型App面臨的挑戰
 
Android layout 工程師在想什麼?給視覺設計師
Android layout   工程師在想什麼?給視覺設計師Android layout   工程師在想什麼?給視覺設計師
Android layout 工程師在想什麼?給視覺設計師
 
作業系統
作業系統作業系統
作業系統
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJava
 
持續整合與單元測試
持續整合與單元測試持續整合與單元測試
持續整合與單元測試
 
Android進階UI控制元件
Android進階UI控制元件Android進階UI控制元件
Android進階UI控制元件
 
Android 介面設計
Android 介面設計Android 介面設計
Android 介面設計
 
窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconf窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconf
 
Hockey Kit for Android
Hockey Kit for AndroidHockey Kit for Android
Hockey Kit for Android
 
Android動態ui介面設計
Android動態ui介面設計Android動態ui介面設計
Android動態ui介面設計
 
淺談 Geb 網站自動化測試(JCConf 2014)
淺談 Geb 網站自動化測試(JCConf 2014)淺談 Geb 網站自動化測試(JCConf 2014)
淺談 Geb 網站自動化測試(JCConf 2014)
 
[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android
 
MOPCON 2015 - 軟體、測試、程式設計家
MOPCON 2015 - 軟體、測試、程式設計家MOPCON 2015 - 軟體、測試、程式設計家
MOPCON 2015 - 軟體、測試、程式設計家
 
Gradle,the new build system for android
Gradle,the new build system for androidGradle,the new build system for android
Gradle,the new build system for android
 
超酷炫科幻 UI:QML 入門
超酷炫科幻 UI:QML 入門超酷炫科幻 UI:QML 入門
超酷炫科幻 UI:QML 入門
 
關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......
 
用十分鐘將你的網站送上雲端
用十分鐘將你的網站送上雲端用十分鐘將你的網站送上雲端
用十分鐘將你的網站送上雲端
 

Ähnlich wie Android gradle 从入门到gg 3

淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle淺談 Groovy 與 Gradle
淺談 Groovy 與 GradleJustin Lin
 
第十一堂 學習編譯與上架
第十一堂 學習編譯與上架第十一堂 學習編譯與上架
第十一堂 學習編譯與上架力中 柯
 
Android 2.2 手機應用程式設計:第四章 第一個程式
Android 2.2 手機應用程式設計:第四章 第一個程式Android 2.2 手機應用程式設計:第四章 第一個程式
Android 2.2 手機應用程式設計:第四章 第一個程式Robert Chi
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011Ching Yi Chan
 
GDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfGDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfDuran Hsieh
 
4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdfssuserd6c7621
 
Angular 4 新手入門攻略完全制霸
Angular 4 新手入門攻略完全制霸Angular 4 新手入門攻略完全制霸
Angular 4 新手入門攻略完全制霸Will Huang
 
基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析CC
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Static Code Analysis 靜態程式碼分析
Static Code Analysis 靜態程式碼分析Static Code Analysis 靜態程式碼分析
Static Code Analysis 靜態程式碼分析Bill Lin
 
Ch12 Spring起步走
Ch12  Spring起步走Ch12  Spring起步走
Ch12 Spring起步走Justin Lin
 
Google Map Android API V2 setup guide
Google Map Android API V2 setup guideGoogle Map Android API V2 setup guide
Google Map Android API V2 setup guideCAVEDU Education
 

Ähnlich wie Android gradle 从入门到gg 3 (20)

淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle
 
第十一堂 學習編譯與上架
第十一堂 學習編譯與上架第十一堂 學習編譯與上架
第十一堂 學習編譯與上架
 
Android 2.2 手機應用程式設計:第四章 第一個程式
Android 2.2 手機應用程式設計:第四章 第一個程式Android 2.2 手機應用程式設計:第四章 第一個程式
Android 2.2 手機應用程式設計:第四章 第一個程式
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011
 
Flutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCUFlutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCU
 
GDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfGDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdf
 
Flutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCUFlutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCU
 
4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf
 
Angular 4 新手入門攻略完全制霸
Angular 4 新手入門攻略完全制霸Angular 4 新手入門攻略完全制霸
Angular 4 新手入門攻略完全制霸
 
基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Static Code Analysis 靜態程式碼分析
Static Code Analysis 靜態程式碼分析Static Code Analysis 靜態程式碼分析
Static Code Analysis 靜態程式碼分析
 
111
111111
111
 
111
111111
111
 
111
111111
111
 
111
111111
111
 
111
111111
111
 
Docker基礎
Docker基礎Docker基礎
Docker基礎
 
Ch12 Spring起步走
Ch12  Spring起步走Ch12  Spring起步走
Ch12 Spring起步走
 
Google Map Android API V2 setup guide
Google Map Android API V2 setup guideGoogle Map Android API V2 setup guide
Google Map Android API V2 setup guide
 

Android gradle 从入门到gg 3

  • 2. • Gradle 插件开发 第3课: Plugin development
  • 3. Hello Gradle • 第1课讲过 buildSrc/ 模块会被加载到 gradle classpath 中 import org.gradle.api.Plugin import org.gradle.api.Project class HelloGradle implements Plugin<Project> { void apply(Project project) { project.task('hello') << { println "Hello from the HelloPlugin" } } } • Gradle 插件只需 实现 Plugin<Project> 接口 • apply(Project project) 方法是插件的入口 • 插件创建一个 hello 任务
  • 4. Hello Gradle • app/ 模块 apply 刚才写的 HelloGradle 插件 import com.meizu.samples.HelloGradle apply plugin: 'com.android.application' apply plugin: HelloGradle
  • 5. 与插件通讯? • Hello 招呼已经打过, 那么如何与插件通讯呢? • Gradle extensions 与 Gradle container 是常用的两种 gradle DSL 方式 • 例如, 我们修改一下 HelloPlugin, 让插件引用者告诉 插件自己叫什么, 插件根据引用者的名字来 Hello • Gradle extensions
  • 6. Gradle extensions project.extensions.create(extensionName, extensionClass): 创建一个 Gradle extension class GreetingExtension { String message = 'Hello' String greeter = 'Gradle' } class HelloGradle implements Plugin<Project> { void apply(Project project) { project.extensions.create("greeting", GreetingExtension) project.task('hello') << { println "${project.greeting.message} from ${project.greeting.greeter}" } } }
  • 7. Gradle extensions 引用插件后, 就可以通过插件的 extensions DSL 来传入配置参数 给插件 import com.meizu.samples.HelloGradle apply plugin: 'com.android.application' apply plugin: HelloGradle // 使用 greeting extension greeting { message = 'Hallelujah' greeter = 'Gradle' }
  • 8. 与插件通讯? • Hello 招呼已经打过, 那么如何与插件通讯呢? • Gradle extensions 与 Gradle container 是常用的两种 gradle DSL 方式 • 假如, 我们有好多个人, 要插件对这些人一一 Say hello 呢? • Gradle container
  • 9. Gradle container project.container.(containerClass): 创建一个 Gradle container class GreetingContainer { final String name List<String> msgList = [] GreetingContainer(String name) { this.name = name } void message(String...args) { msgList += Arrays.asList(args) } } class HelloGradle implements Plugin<Project> { void apply(Project project) { def greetings = project.container(GreetingContainer) project.extensions.greetings = greetings project.task(‘hellos’) << { greetings.all { // 遍历 greetings println "${it.msgList*.toString()} from ${it.name}" } } } }
  • 10. Gradle container app/ 模块 DSL 使用方法, 类似 android productFlavors DSL apply plugin: HelloGradle greetings { Jack { message "Hallelujah" } Jill { message "Hallelujah ", "again" } }
  • 11. 独立的插件项目 • 目前为止, 我们的插件都在 buildSrc 中直接写的代 码, 只能用于当前的 工程 模块 • 想被其他模块引用, 需要独立成 jar 包, 被引用者 classpath
  • 12. 模块结构 • resources/META-INF/gradle-plugins/${plugin-name}.properties 插件 Manifest 入口, properties文件名为 插件名 类似 Android App 中的 AndroidManifest.xml • implementation-class=${全路径类名} 定位到 groovy 类 类似 Android App 中的 Application 入口
  • 13. 独立的插件项目 • 需要 groovy 插件 • 依赖 gradleApi(): 使插件项目能够调用到 gradle api • 依赖 localGroovy(): 调用到 groovy sdk • 不要忘记了 android gradle plugin 依赖 apply plugin: 'groovy' dependencies { compile gradleApi() compile localGroovy() compile 'com.android.tools.build:gradle:2.1.0' }
  • 14. 独立的插件项目 • 将 buildSrc/ 中的插件代码 整理 过来 • 为什么, buildSrc/ 中类都写在一 个文件中呢? 因为 buildSrc/ 与 JDK的兼容性很有问题, 类分开会 报错 • 至此, 独立插件已经完成, 运行 assemble 或者 jar, 可以打包出插件 jar 包
  • 15. 独立的插件项目 • Maven 呢? • 使用 maven 插件, 将 jar 包打包到 父目录(根目录)的 .repo 仓库 • 发布到远程 Maven仓库, 以及 jcenter, 以及artifactory在后续的CI集 成课程再详讲 uploadArchives { repositories { mavenDeployer { repository(url: uri('../.repo')) pom.version = '1.0' pom.artifactId = 'standalone' } } } apply plugin: 'maven' // for local maven publish group = 'com.meizu.samples' version = '1.0' status = 'RELEASE‘ // artifact to be uploaded artifacts { archives jar }
  • 17. 独立的插件项目 • 引用插件 - classpath buildscript { repositories { jcenter() maven { url uri('.repo') // 相对本gradle文件的路径 } } dependencies { classpath 'com.android.tools.build:gradle:2.1.0' classpath group: 'com.meizu.samples', name: 'standalone', version: '1.0' } }
  • 18. 独立的插件项目 • 引用插件 – 使用 apply plugin: 'standalone-plugin' greetings { Jack { message "Hallelujah" } Jill { message "Hallelujah ", "again" } } • 至此, 独立插件全部流程, 你已经掌握了
  • 20. 课后任务 samples内有BasicPlugin 工程, 以及 StandAlone Plugin 工程 为本次课程的讲义工程 请实现一个简单的插件, 使用 gradle container 来收集 插件使用者的 书籍 信息, 并输出这些 书籍的信息 http://git.ipd.meizu.com/AnR/android-gradle-samples 记得使用自己的邮箱名作为分支名PR给我 [Github用户移步] https://github.com/Jween/android-gradle-samples