編輯:關於Android編程
在Gradle中創建自定義插件,Gradle提供了三種方式:
在build.gradle腳本中直接使用 在buildSrc中使用 在獨立Module中使用開發Gradle插件可以在IDEA中進行開發,也可以在Android Studio中進行開發,它們唯一的不同,就是IDEA提供了Gradle開發的插件,比較方便創建文件和目錄,而Android Studio中,開發者需要手動創建(但實際上,這些目錄並不多,也不復雜,完全可以手動創建)。
在Android Studio中創建一個標准的Android項目,整個目錄結構如下所示:
├── app
│ ├── build.gradle
│ ├── libs
│ └── src
│ ├── androidTest
│ │ └── java
│ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── res
│ └── test
├── build.gradle
├── buildSrc
│ ├── build.gradle ---1
│ └── src
│ └── main
│ ├── groovy ---2
│ └── resources ---3
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
其中,除了buildSrc目錄以外,都是標准的Android目錄,而buildSrc就是Gradle提供的在項目中配置自定義插件的默認目錄,開發Gradle要創建的目錄,也就是RootProject/src/main/groovy和RootProject/src/main/resources兩個目錄。
在配置完成後,如果配置正確,對應的文件夾將被IDE所識別,成為對應類別的文件夾。
首先,先來配置buildSrc目錄下的build.gradle文件,這個配置比較固定,腳本如下所示:
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
}
接下來,在groovy目錄下,創建一個Groovy類(與Java類似,可以帶包名,但Groovy類以.grovvy結尾),如圖所示:
vcWxvsjnz8LL+cq+o7o8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;">
package com.xys
import org.gradle.api.Plugin
import org.gradle.api.Project
public class MainPluginForBuildSrc implements Plugin
在如上所示的腳本的apply方法中,筆者簡單的實現了一個task,命名為testPlugin,執行該Task,會輸出一行日志。
所謂Groovy腳本的Extension,實際上就是類似於Gradle的配置信息,在主項目使用自定義的Gradle插件時,可以在主項目的build.gradle腳本中通過Extension來傳遞一些配置、參數。
創建一個Extension,只需要創建一個Groovy類即可,如圖所示:
如上所示,筆者命名了一個叫MyExtension的groovy類,其腳本如下所示:
package com.xys;
class MyExtension {
String message
}
MyExtension代碼非常簡單,就是定義了要配置的參數變量,後面筆者將具體演示如何使用。
在創建了Extension之後,需要修改下之前創建的Groovy類來加載Extension,修改後的腳本如下所示:
package com.xys
import org.gradle.api.Plugin
import org.gradle.api.Project
public class MainPluginForBuildSrc implements Plugin {
@Override
void apply(Project project) {
project.extensions.create('pluginsrc', MyExtension)
project.task('testPlugin') << {
println project.pluginsrc.message
}
}
}
通過project.extensions.create方法,來將一個Extension配置給Gradle即可。
resources目錄是標識整個插件的目錄,其目錄下的結構如下所示:
└── resources
└── META-INF
└── gradle-plugins
該目錄結構與buildSrc一樣,是Gradle插件的默認目錄,不能有任何修改。創建好這些目錄後,在gradle-plugins目錄下創建——插件名.properties文件,如圖所示:
如上所示,這裡筆者命名為pluginsrc.properties,在該文件中,代碼如下所示:
implementation-class=com.xys.MainPluginForBuildSrc
通過上面的代碼指定最開始創建的Groovy類即可。
在主項目的build.gradle文件中,通過apply指令來加載自定義的插件,腳本如下所示:
apply plugin: 'pluginsrc'
其中plugin的名字,就是前面創建pluginsrc.properties中的名字——pluginsrc,通過這種方式,就加載了自定義的插件。
在主項目的build.gradle文件中,通過如下所示的代碼來加載Extension:
pluginsrc{
message = 'hello gradle plugin'
}
同樣,領域名為插件名,配置的參數就是在Extension中定義的參數名。
配置完畢後,就可以在主項目中使用自定義的插件了,在終端執行gradle testPlugin指令,結果如下所示:
:app:testPlugin
hello gradle plugin
在buildSrc中創建自定義Gradle插件只能在當前項目中使用,因此,對於具有普遍性的插件來說,通常是建立一個獨立的Module來創建自定義Gradle插件。
首先,在主項目的工程中,創建一個普通的Android Library Module,並刪除其默認創建的目錄,修改為Gradle插件所需要的目錄,即在buildSrc目錄中的所有目錄,如圖所示:
如上圖所示,創建的文件與在buildSrc目錄中創建的文件都是一模一樣的,只是這裡在一個自定義的Module中創建插件而不是在默認的buildSrc目錄中創建。
因為是通過自定義Module來創建插件的,因此,不能讓Gradle來自動完成插件的加載,需要手動進行部署,所以,需要在插件的build.gradle腳本中增加Maven的配置,腳本如下所示:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
group='com.xys.plugin'
version='2.0.0'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
}
相比buildSrc中的build.gradle腳本,這裡增加了Maven的支持和uploadArchives這樣一個Task,這個Task的作用就是將該Module部署到本地的repo目錄下。在終端中執行gradle uploadArchives指令,將插件部署到repo目錄下,如圖所示:
當插件部署到本地後,就可以在主項目中引用插件了。
當插件正式發布後,可以把插件像其它module一樣發布到中央庫,這樣就可以像使用中央庫的庫項目一樣來使用插件了。
在buildSrc中,系統自動幫開發者自定義的插件提供了引用支持,但自定義Module的插件中,開發者就需要自己來添加自定義插件的引用支持。在主項目的build.gradle文件中,添加如下所示的腳本:
apply plugin: 'com.xys.plugin'
buildscript {
repositories {
maven {
url uri('../repo')
}
}
dependencies {
classpath 'com.xys.plugin:plugin:2.0.0'
}
}
其中,classpath指定的路徑,就是類似compile引用的方式,即——插件名:group:version
配置完畢後,就可以在主項目中使用自定義的插件了,在終端執行gradle testPlugin指令,結果如下所示:
:app:testPlugin
Hello gradle plugin
如果不使用本地Maven Repo來部署,也可以拿到生成的插件jar文件,復制到libs目錄下,通過如下所示的代碼來引用:
classpath fileTree(dir: 'libs', include: '\*.jar') // 使用jar
什麼是內存洩露?Android虛擬機的垃圾回收采用的是根搜索算法。GC會從根節點(GC Roots)開始對heap進行遍歷。到最後,部分沒有直接或者間接引用到GC Roo
一、效果:我們看到很多軟件的通訊錄在右側都有一個字母索引功能,像微信,小米通訊錄,QQ,還有美團選擇地區等等。這裡我截了一張美團選擇城市的圖片來看看;我們今天就來實現圖片
Android studio詳解我們古人又雲:工欲善其事,必先利其器。1、android studio的背景Android Studio 是一個Android開發環境,基
這裡我要講述下android熱補丁前世今生Under the Hood: Rebuilding Facebook for AndroidOver the last yea