編輯:關於Android編程
android的gradle插件用了不少了,比如說官方的應用構建插件(com.android.application),lib構建插件(com.android.library),還有第三方的比如輔助multidex的DexKnifePlugin。但是怎麼自己創建一個gradle插件一直不明白,今天就試一試自己撸一個android gradle插件,畢竟實踐出真知。
首先得知道一個gradle插件有需要哪些元素。
我們以android的application插件為例,往往有如下代碼,這些代碼到底是什麼?
//root build.gradle dependencies { classpath 'com.android.tools.build:gradle:2.2.3' } //app build.gradle apply plugin: 'com.android.application'
以上是一個gradle插件必須的屬性。然後既然是gradle 插件必須實現Plugin
首先選擇科學工具IntelliJ,之前在groovy入門指南1裡面已經配置好了groovy和IntelliJ的環境,所以可以直接搞起來。
1、打開IJ(IntelliJ),new->gradle->選上java和groovy->Next,如下圖所示 2、選擇groupId和artifactId以及版本。這3個是就是我們說的gradle插件四屬性的3個,他們可以確定classpath這裡我們配置如下,注意版本號寫1.0
3、勾上use auto-import和 create directories for empty..,這樣會幫我們自動導包並創建好groovy和java根目錄4、just next
5、第一次創建gradle工程,他會去下載2個jar,junit:4.11和org.codehaus.groovy:groovy-all:2.3.11,這個下載過程非常慢(好吧,其實是公司網絡比較坑),耐心等待。
6、jar包下載好之後,會自動創建main和test文件夾(其實gradle默認工程的創建也是在執行gradle任務),此時文件結構如下,注意groovy和java文件夾為藍色的 7、在build.gradle的dependencies裡面加入compile gradleApi() compile localGroovy()8、在groovy文件夾下創建一個package,包名隨便起,就叫com.fish好了,然後在裡面new一個groovy類就叫FirstPlugin好了,並且讓FirstPlugin實現Plugin接口,這個Plugin是org.gradle.api.Plugin。然後實現apply接口,加點代碼,最後代碼如下,我們創建了一個task叫做showTipTask,task在funny這個group內(我們可以對task進行分組,待會會明白),showTipTask只是打印出一行文字。description是對這個task的描述,當用戶執行./gradlew tasks會顯示出來。
package com.fish import org.gradle.api.Plugin import org.gradle.api.Project /** * Created by fish on 17/1/24. */ class FirstPlugin implements Plugin9、此時plugin已經有了,就是FirstPlugin,我們需要把他傳到Maven Central或者jcenter上,這樣大家都可以用了,這裡只是個demo,我就不上傳了,我把他放在本地。如何配置:{ void apply(Project project) { def showTipTask = project.tasks.create("showTips") << { println('hello I am the first custom plguin') } showTipTask.group = "funny" showTipTask.description = "Hello baby" } }
apply plugin: 'maven' uploadArchives { repositories { mavenDeployer { repository(url: uri('repo')) } } }10、此時可以嘗試生成插件,執行uploadArchives這個任務就行,有2種方法。方法1是點擊view-tool windows-gradle,在右邊找到uploadArchives,找不到的話可以點擊藍色刷新按鈕刷新一下,如下所示
方法2是還可以在IJ的terminal窗口執行./gradlew uploadArchives,推薦使用這種方法,可以看到清楚的日志,特別是失敗時日志信息很關鍵
10、不幸的是,失敗了,日志如下
Starting a Gradle Daemon (subsequent builds will be faster) :compileJava UP-TO-DATE :compileGroovy FAILED FAILURE: Build failed with an exception.
可以用./gradlew uploadArchives --stacktrace看更詳細的信息,得到信息如下所示
Caused by: groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-all is loaded in version 2.4.7 and you are trying to load version 2.3.11 ... 10 more
看來是有2個groovy-all,原來IJ依賴了我默認的groovy是2.4.7版本的,然後這裡工程又依賴了2.3.11版本的,所以當然會出錯了,解決方法是在build.gradle裡注釋掉compile 'org.codehaus.groovy:groovy-all:2.3.11'這行代碼。
11、我們再執行./gradlew uploadArchives --stacktrace又會發現如下問題,miss了一個file,想想漏了什麼,我們沒有指明pluginId
補上它,在main/resources下創建META-INF/gradle-plugins文件夾,在裡面建一個properties文件,文件名隨便起(包名格式),比如就叫com.apple.propeties,文件裡配置類名
implementation-class=com.fish.FirstPlugin
好了run it,此時插件就生成了,生成的插件是主要是jar包和配置文件,結構如下
現在插件已經寫好了,怎麼使用他呢?
new一個AS工程,叫UseShip好了。然後在根目錄的build.gradle加依賴 classpath 'com.netease:ship:1.0'
,在app的build.gradle加apply plugin: 'com.apple'
。現在插件就導進來了,我們在執行apply plugin: 'com.apple'
的時候會調用FirstPlugin的apply方法,在apply方法內我們定義了一個showTipTask,這個task在funny這個group下,來,我們驗證下,如下所示 ,果然找到了這個task
此時可以在terminal下執行./gradlew showTips,得到了正確結果,顯示 “hello I am the first custom plguin”
192:UseShip fish$ ./gradlew showTips To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html. Incremental java compilation is an incubating feature. :app:showTips hello I am the first custom plguin BUILD SUCCESSFUL Total time: 9.344 secs
我們這裡pluginId故意起的跟GroupId、ArtifictId沒什麼關系,是為了區分清楚,但實際上他們往往是關聯的。
把Android SDK升級到了最新版本,但是Eclipse的ADT插件需要Eclipse3.6版本以上才可以安裝,無奈下載了Eclipse3.7版本的。一
少量數據保存之SharedPreferences接口實例SharedPreferences數據保存主要是通過鍵值的方式存儲在xml文件中xml文件在data/此程序的包名
引言在應用程序開發過程經常需要對文本進行處理,比如說對一段描述文字的其中一段加入點擊事件,或者對其設置不一樣的前景色,有什麼方法可以實現要求的功能吶?需求樣例比如我們需要
寫的一個Android對話框,點擊按鈕獲取EditText裡面的值,這裡一直報空指針異常,研究了很長時間終於解決了。 異常如下: 我原來的代碼://更新對