偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Android 開發(fā)必備知識(shí):我和 Gradle 有個(gè)約會(huì)

移動(dòng)開發(fā)
真正開始近距離接觸編程其實(shí)是在2012年,年底的時(shí)候帶我的大哥說,咱們這個(gè) app 發(fā)布的時(shí)候手動(dòng)構(gòu)建耗時(shí)太久,研究一下 ant 腳本吧。那個(gè)時(shí)候連 HashMap 都不知道是啥,可想開發(fā)經(jīng)驗(yàn)幾乎為零,一個(gè)小小的 ant 腳本看得我真是深深地感受到了這個(gè)世界充滿的惡意。好在后來硬著頭皮搞明白了什么 target 之類的鬼東西,不然就沒有然后了。

0、講個(gè)故事

0.1 Ant,我還真以為你是只螞蟻

真正開始近距離接觸編程其實(shí)是在2012年,年底的時(shí)候帶我的大哥說,咱們這個(gè) app 發(fā)布的時(shí)候手動(dòng)構(gòu)建耗時(shí)太久,研究一下 ant 腳本吧。

那個(gè)時(shí)候連 HashMap 都不知道是啥,可想開發(fā)經(jīng)驗(yàn)幾乎為零,一個(gè)小小的 ant 腳本看得我真是深深地感受到了這個(gè)世界充滿的惡意。好在后來硬著頭皮搞明白了什么 target 之類的鬼東西,不然就沒有然后了。

0.2 Maven,你們真的會(huì)讀這個(gè)單詞么

Maven /`meivn/

接觸 Maven,完全是因?yàn)樽x陳雄華的《Spring 實(shí)戰(zhàn)》,他的源碼居然是用 Maven 構(gòu)建的,結(jié)果 Spring 學(xué)得一塌糊涂,Maven我倒是用順手了。。

跟 Ant 一 樣,Maven 可以用來構(gòu)建 Java 工程;跟 Ant 一樣,Maven 的配置用 xml 來描述;但,Maven 可以管理依賴,它可以讓你做 到“想要什么,就是一句話的事兒”。比如我想要個(gè) gson,Maven 說可以,你記下來我?guī)?huì)兒構(gòu)建的時(shí)候給你去取。

  1. <dependency>   
  2. <groupId>com.google.code.gson</groupId>  <artifactId>gson</artifactId>  
  3. <version>2.4</version> 
  4. </dependency> 

真 是讓你當(dāng)大爺呢。不過,Maven 這家伙學(xué)起來有點(diǎn)兒費(fèi)勁,很多初學(xué)的時(shí)候在搭建環(huán)境的時(shí)候就被搞死了——你以為是因?yàn)?nbsp;Maven 的學(xué)習(xí)曲線陡峭 嗎?當(dāng)然不是,是因?yàn)楫?dāng)初 Maven 的中央倉(cāng)庫(kù)被 x 了,所以你就天天看著 cannot resovle dependencies 玩就好了。

后 來 OSChina 傍上了阿里這個(gè)爸爸,就有了 maven.oschina.net。我去年找工作落定之后,想著做點(diǎn)兒什么的時(shí)候,發(fā) 現(xiàn) maven.oschina.net 估計(jì)被阿里爸爸關(guān)禁閉,死了幾天,現(xiàn)在又活過來了。那又怎樣呢,反正中央倉(cāng)庫(kù)被 x 的事情也已經(jīng)成為過去。

0.3 Gradle,你爹是不是 Google!!

13年的時(shí)候,我興奮地跟前面提到的大哥說 Maven 是個(gè)好同志的時(shí)候,大哥說,Google 推薦用 Gradle。。所以,我想 Gradle,你爹是不是 Google。?;蛘咧辽偈莻€(gè)干爹吧。

其 實(shí)這都不重要了,畢竟 Gradle 實(shí)在是好用。比起前面兩位的 xml 配置的手段,直接用代碼的方式上陣必然是靈活得多。不僅如 此,Gradle 居然可以使用 Maven 倉(cāng)庫(kù)來管理依賴,就像是一個(gè)簡(jiǎn)易版的 Maven 一樣,如果不是看不到 pom 文件,你都還以為你仍然 在使用 Maven(當(dāng)然,由于你在用 Maven 的倉(cāng)庫(kù),所以你自然也是離不開 Maven 的)。哦,你是 Ant 用戶啊,那也沒關(guān)系啊,不信你 看:

  1. task helloTAS << {      
  2. ant.echo(message: 'Hello TAS.') 

1、用 Gradle 構(gòu)建

1.1 工程結(jié)構(gòu)

如圖所示,這是一個(gè)不能更普通的 android 的 gradle 工程了。

· 根目錄下面的 settings.gradle 當(dāng)中主要是用來 include 子模塊的,比如我們這個(gè)工程有一個(gè)叫做 app 的子模塊,那么 settings.gradle 的內(nèi)容如下:

  1. include ':app' 

· 

根目錄下面的 build.gradle 包含一些通用的配置,這些配置可以在各個(gè)子模塊當(dāng)中使用。

· 

gradle.properties 文件包含的屬性,會(huì)成為 project 的 properties 的成員,例如我們添加了屬性 hello,

· 

hello=Hello Tas!

· 然后我們?cè)?nbsp;build.gradle 當(dāng)中創(chuàng)建 task:

  1. task hello << {       
  2. println hello       
  3.  println project.getProperties().get("hello")  

輸出地結(jié)果是一樣的:

  1. 14:28:11: Executing external task 'hello'... 
  2. Configuration on demand is an incubating feature. 
  3. :app:hello 
  4. Hello Tas! 
  5. Hello Tas! 
  6.  
  7. BUILD SUCCESSFUL 
  8.  
  9. Total time: 0.54 secs 
  10. 14:28:12: External task execution finished 'hello'. 

· local.properties 這 個(gè)文件在 android 工程當(dāng)中會(huì)遇到,我們通常在其中設(shè)置 android 的 sdk 和 ndk 路徑。當(dāng)然,這 個(gè) android studio 會(huì)幫我們?cè)O(shè)置好的。為了更清楚地了解這一點(diǎn),我把 android 的 gradle 插件的部分源碼摘錄出來:

SDK.groovy,下面的代碼主要包含了加載 sdk、ndk 路徑的操作。

  1. private void findLocation() {  
  2. if (TEST_SDK_DIR != null) {  
  3.    androidSdkDir = TEST_SDK_DIR     
  4. return 
  5. }  
  6.  
  7. def rootDir = project.rootDir  
  8. def localProperties = new File(rootDir, FN_LOCAL_PROPERTIES)  
  9. if (localProperties.exists()) {  
  10.    Properties properties = new Properties() 
  11.    localProperties.withInputStream { instr ->  
  12.    properties.load(instr)    
  13.  }  
  14.    def sdkDirProp = properties.getProperty('sdk.dir')    
  15.  
  16.    if (sdkDirProp != null) {  
  17.        androidSdkDir = new File(sdkDirProp) 
  18. } else { 
  19.         sdkDirProp = properties.getProperty('android.dir') 
  20.         if (sdkDirProp != null) { 
  21.            androidSdkDir = new File(rootDir, sdkDirProp) 
  22.            isPlatformSdk = true 
  23.         } else { 
  24.            throw new RuntimeException( 
  25. "No sdk.dir property defined in local.properties file.") 
  26.        } 
  27.     }     
  28.  
  29. def ndkDirProp = properties.getProperty('ndk.dir') 
  30.     if (ndkDirProp != null) { 
  31.         androidNdkDir = new File(ndkDirProp)      
  32. } else { 
  33.    String envVar = System.getenv("ANDROID_HOME") 
  34.    if (envVar != null) {  
  35.       androidSdkDir = new File(envVar) 
  36.    } else { 
  37.       String property = System.getProperty("android.home") 
  38.       if (property != null) { 
  39.          androidSdkDir = new File(property) 
  40.       } 
  41.   }   
  42.  
  43. envVar = System.getenv("ANDROID_NDK_HOME") 
  44.   if (envVar != null) {  
  45.      androidNdkDir = new File(envVar) 
  46.       } 
  47.    } 
  48. }  

BasePlugin.groovy,通過這兩個(gè)方法,我們可以在 gradle 腳本當(dāng)中獲取 sdk 和 ndk 的路徑

  1. File getSdkDirectory() { 
  2.     return sdk.sdkDirectory 
  3. File getNdkDirectory() {  
  4.    return sdk.ndkDirectory 

例如:

  1. task hello << { 
  2.    println android.getSdkDirectory() 
  3. 14:37:33: Executing external task 'hello'... 
  4. Configuration on demand is an incubating feature 
  5. .:app:hello 
  6. /Users/benny/Library/Android/sdk 
  7.  
  8. BUILD SUCCESSFUL 
  9. Total time: 0.782 secs 
  10. 14:37:35: External task execution finished 'hello'. 

上面給出的只是最常見的 hierarchy 結(jié)構(gòu),還有 flat 結(jié)構(gòu),如下圖1為 flat 結(jié)構(gòu),2為 hierarchy 結(jié)構(gòu)。有興趣的話可以 Google 一下。

1.2 幾個(gè)重要的概念

這一小節(jié)的出場(chǎng)順序基本上跟 build.gradle 的順序一致。

1.2.1 Repository和Dependency

如果你只是寫 Android 程序,那么依賴問題可能還不是那么的煩人——如果你用 Java 寫服務(wù)端程序,那可就是一把辛酸一把淚了。

倉(cāng)庫(kù)的出現(xiàn),***的解決了這個(gè)問題,我們?cè)陂_發(fā)時(shí)只需要知道依賴的 id 和版本,至于它存放在哪里,我不關(guān)心;它又依賴了哪些,構(gòu)建工具都可以在倉(cāng)庫(kù)中幫我們找到并搞定。這一切都是那么自然,要不要來一杯拿鐵,讓代碼構(gòu)建一會(huì)兒?

據(jù) 說在 Java 發(fā)展史上,涌現(xiàn)出非常多的倉(cāng)庫(kù),不過***的當(dāng)然是 Maven 了。Maven 通過 groupId 和 artifactId 來 鎖定構(gòu)件,再配置好版本,那么 Maven 倉(cāng)庫(kù)就可以最終鎖定一個(gè)確定版本的構(gòu)件供你使用了。比如我們開頭那個(gè)例子,

  1. <dependency> 
  2.   <groupId>com.google.code.gson</groupId>  <artifactId>gson</artifactId> 
  3.   <version>2.4</version> 
  4. </dependency> 

Maven 就憑這么幾句配置就可以幫你搞定 gson-2.4.jar,不僅如此,它還會(huì)按照你的設(shè)置幫你把 javadoc 和 source 搞定。媽媽再也不用擔(dān)心我看不到構(gòu)件的源碼了。

那么這個(gè)神奇的 Maven 倉(cāng)庫(kù)在哪兒呢? Maven Central,中央倉(cāng)庫(kù),是 Maven 倉(cāng)庫(kù)的鼻祖,其他的大多數(shù)倉(cāng)庫(kù)都會(huì)對(duì)它進(jìn)行代理,同時(shí)根據(jù)需求添加自己的特色庫(kù)房。簡(jiǎn)單說幾個(gè)概念:

· 

代理倉(cāng)庫(kù):要租房,去搜房網(wǎng)啊。你要去駕校報(bào)名,我是駕校代理,你找我,我去找駕校。具體到這里,還有點(diǎn)兒不一樣,一旦有人從代理倉(cāng)庫(kù)下載過一次特定得構(gòu)件,那么這個(gè)構(gòu)件會(huì)被代理倉(cāng)庫(kù)緩存起來,以后就不需要找被代理的倉(cāng)庫(kù)下載了。

· 

私有倉(cāng)庫(kù):中國(guó)特色社會(huì)主義。走自己的路,你管我???公司內(nèi)部的倉(cāng)庫(kù)里面有幾個(gè) hosted 的倉(cāng)庫(kù),這些倉(cāng)庫(kù)就是我們公司內(nèi)部特有的,里面的構(gòu)件也是我們自己內(nèi)部的同事上傳以后供團(tuán)隊(duì)開發(fā)使用的。

· 

本地倉(cāng)庫(kù):大隱隱于市。跟代理倉(cāng)庫(kù)的道理很像,只不過,這個(gè)倉(cāng)庫(kù)是存放在你自己的硬盤上的。

· 

說起來,Andoid sdk 下面有個(gè) extra 目錄,里面的很多依賴也是以Maven 倉(cāng)庫(kù)的形式組織的。不過這是 Google 特色嘛,人家牛到不往 Maven 的中央倉(cāng)庫(kù)上傳,真是沒轍。

1.2.2 SourceSets

源碼集,這里面主要包含你的各種類型的代碼的路徑,比如 'src/main/java' 等等。

1.2.3 Properties

前面我們其實(shí)也稍稍有提到,這個(gè) properties 其實(shí)是 gradle 的屬性,在 gradle 源碼當(dāng)中,我們找到 Project.java 這個(gè)接口,可以看到:

  1.    /**  
  2. <p>Determines if this project has the given property. See <a 
  3.  href="#properties">here</a> for details of the 
  4. * properties which are available for a project.</p> 
  5. *  
  6. * @param propertyName The name of the property to locate.  
  7. * @return True if this project has the given property, false otherwise.  
  8. */ 
  9. boolean hasProperty(String propertyName); 
  10.  
  11. /**  
  12. <p>Returns the properties of this project. See <a href="#properties">here</a> for details of the properties which  
  13. * are available for a project.</p>  
  14. *  
  15. * @return A map from property name to value.  
  16. */ 
  17. Map<String?> getProperties(); 
  18.  
  19. /**  
  20. <p>Returns the value of the given property.  This method locates a property as follows:</p>  
  21. <ol>  
  22. *  
  23. <li>If this project object has a property with the given name, return the value of the property.</li> 
  24. *  
  25. <li>If this project has an extension with the given name, return the extension.</li> 
  26. *  
  27. <li>If this project's convention object has a property with the given name, return the value of the  
  28. * property.</li>  
  29. *  
  30. <li>If this project has an extra property with the given name, return the value of the property.</li> 
  31. *  
  32. <li>If this project has a task with the given name, return the task.</li>  
  33. *  
  34. <li>Search up through this project's ancestor projects for a convention property or extra property with the  
  35. * given name.</li>  
  36. *  
  37. <li>If not found, a {@link MissingPropertyException} is thrown.</li>  
  38. *  
  39. </ol>  
  40. *  
  41. * @param propertyName The name of the property.  
  42. * @return The value of the property, possibly null.  
  43. * @throws MissingPropertyException When the given property is unknown.  
  44. */Object property(String propertyName) throws MissingPropertyException; 
  45.  
  46. /**  
  47. <p>Sets a property of this project.  This method searches for a property with the given name in the following  
  48. * locations, and sets the property on the first location where it finds the property.</p>  
  49. *  
  50. <ol>  
  51. *  
  52. <li>The project object itself.  For example, the <code>rootDir</code> project property.</li>  
  53. *  
  54. <li>The project's {@link Convention} object.  For example, the <code>srcRootName</code> java plugin  
  55. * property.</li>  
  56. *  
  57. <li>The project's extra properties.</li>  
  58. *  
  59. </ol>  
  60. *  
  61. * If the property is not found, a {@link groovy.lang.MissingPropertyException} is thrown.  
  62. *  
  63. *@param name The name of the property  
  64. * @param value The value of the property  
  65. */     
  66. void setProperty(String name, Object value) throws MissingPropertyException; 

不難知道,properties 其實(shí)就是一個(gè) map,我們可以在 gradle.properties 當(dāng)中定義屬性,也可以通過 gradle 腳本來定義:

  1. setProperty('hello''Hello Tas again!'

使用方法我們前面已經(jīng)提到,這里就不多說了。

1.2.4 Project和Task

如果你用過 ant,那么 project 基本上類似于 ant 的 project 標(biāo)簽,task 則類似于 ant 的 target 標(biāo)簽。我們?cè)?nbsp;build.gradle 當(dāng)中編寫的

  1. task hello << {
  2. ......

實(shí)際上,是調(diào)用

  1. Task Project.task(String name) throws InvalidUserDataException; 

創(chuàng)建了一個(gè) task,并通過 << 來定義這個(gè) task 的行為。我們看到 task 還有如下的重載:

  1. Task task(String name, Closure configureClosure); 

所以下面的定義也是合法的:

  1. task('hello2',{ 
  2.     println hello 
  3. }) 

簡(jiǎn)單說,project 就是整個(gè)構(gòu)建項(xiàng)目的一個(gè)邏輯實(shí)體,而 task 就是這個(gè)項(xiàng)目的具體任務(wù)點(diǎn)。更多地介紹可以參見官網(wǎng)的文檔,和 gradle 的源碼。

2、發(fā)布構(gòu)件

發(fā)布構(gòu)件,還是依賴倉(cāng)庫(kù),我們?nèi)匀灰?nbsp;Maven 倉(cāng)庫(kù)為例,私有倉(cāng)庫(kù)多數(shù)采用 sonatype。

2.1 UI 發(fā)布

如果管理員給你開了這個(gè)權(quán)限,你會(huì)在 ui 上面看到 upload artifact 的 tab,選擇你要上傳的構(gòu)件,配置好對(duì)應(yīng)的參數(shù),點(diǎn)擊上傳即可。

2.2 使用 Maven 插件

這里的意思是使用 Maven 的 gradle 插件,在構(gòu)建的過程中直接上傳。構(gòu)建好的構(gòu)件需要簽名,請(qǐng)下載 GPG4WIN (windows),或者 GPGTOOLS(mac),生成自己的 key。

直接上代碼:

gradle.properties

  1. sonatypeUsername=你的用戶名 
  2. sonatypePassword=你的密碼 
  3. signing.keyId=你的keyid 
  4. signing.password=你的keypass 
  5. #注意,通常來講是這個(gè)路徑。 
  6. # mac/linux 
  7. signing.secretKeyRingFile=/Users/你的用戶名/.gnupg/secring.gpg 
  8.  
  9. # Window XP and earlier (XP/2000/NT) 
  10. signing.secretKeyRingFile=C:\\Documents and Settings\\<username>\\Application Data\\GnuPG\\secring.gpg 
  11.  
  12. # Windows Vista and Windows 7 
  13. #  
  14. signing.secretKeyRingFile=C:\\Users\\<username>\\AppData\\Roaming\\gnupg\\secring. 
  15.  
  16.  
  17. gpgprojectName=你的構(gòu)件名稱 
  18. group=你的構(gòu)件groupid 
  19. artifactId=你的構(gòu)件artifactid 
  20. # 版本號(hào),采用三位數(shù)字的形式,如果是非穩(wěn)定版本,請(qǐng)務(wù)必添加SNAPSHOT 
  21. version=0.0.1-SNAPSHOT 

build.gradle

  1. apply plugin: 'com.android.library' 
  2. apply plugin: 'maven' 
  3. apply plugin: 'signing' 
  4.  
  5. android { 
  6.    compileSdkVersion 21 
  7.    buildToolsVersion "21.1.2" 
  8.  
  9.    defaultConfig { 
  10.        minSdkVersion 17 
  11.        targetSdkVersion 21 
  12.        versionCode 1 
  13.        versionName "0.2" 
  14.     } 
  15.     buildTypes { 
  16.         release { 
  17.             minifyEnabled false 
  18.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
  19.          } 
  20.      } 
  21.  
  22. dependencies { 
  23.     compile fileTree(include: ['*.jar'], dir: 'libs') 
  24.  ...... 
  25.  
  26. def isSnapshot = version.endsWith('-SNAPSHOT') 
  27. def sonatypeRepositoryUrl 
  28. if(isSnapshot) { 
  29.     sonatypeRepositoryUrl =  
  30. "http://maven.oa.com/nexus/content/repositories/thirdparty-snapshots/" 
  31. } else { 
  32.      sonatypeRepositoryUrl = "http://maven.oa.com/nexus/content/repositories/thirdparty/" 
  33.  
  34. sourceSets { 
  35.     main { 
  36.         java { 
  37.             srcDir 'src/main/java' 
  38.         } 
  39.     } 
  40. task sourcesJar(type: Jar) {  
  41.    from sourceSets.main.allSource 
  42.     classifier = 'sources' 
  43.  
  44. artifacts { 
  45.     //archives javadocJar 
  46.     archives sourcesJar} 
  47.  
  48. signing { 
  49.     if(project.hasProperty('signing.keyId') && project.hasProperty('signing.password') && 
  50.         project.hasProperty('signing.secretKeyRingFile')) { 
  51.     sign configurations.archives 
  52.     } else { 
  53.         println "Signing information missing/incomplete for ${project.name}" 
  54.     } 
  55.  
  56. uploadArchives { 
  57.     repositories { 
  58.         mavenDeployer { 
  59.            if(project.hasProperty('preferedRepo') && project.hasProperty('preferedUsername') 
  60.            && project.hasProperty('preferedPassword')) { 
  61.  
  62.               configuration = configurations.archives 
  63.               repository(url: preferedRepo) { 
  64.                   authentication(userName: preferedUsername, password: preferedPassword) 
  65.                   } 
  66.              } else if(project.hasProperty('sonatypeUsername') && project.hasProperty('sonatypePassword')) { 
  67.  
  68.                  beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } 
  69.  
  70.                  repository(url: sonatypeRepositoryUrl) {                    authentication(userName: sonatypeUsername, password: sonatypePassword) 
  71.  
  72.                   } 
  73.                } else { 
  74.                println "Settings sonatypeUsername/sonatypePassword missing/incomplete for ${project.name}" 
  75.                 } 
  76.  
  77.                pom.artifactId = artifactId 
  78.                pom.project { 
  79.                    name projectName 
  80.                    packaging 'aar' 
  81.  
  82.                    developers { 
  83.                        developer { 
  84.                            id 'wecar' 
  85.                            name 'wecar' 
  86.                         } 
  87.                     } 
  88.                 } 
  89.             } 
  90.         } 
  91.     } 

然后運(yùn)行 gradle uploadArchives 就可以將打包的 aar 發(fā)布到公司的 Maven 倉(cāng)庫(kù)當(dāng)中了。jar包的方式類似,這里就不在列出了。

2.3 使用 Maven 命令

這個(gè)可以通過 mvn 在 cmdline 直接發(fā)布構(gòu)件,命令使用說明:

  1. mvn deploy:deploy-file -Durl=file://C:\m2-repo \   -DrepositoryId=some.id \ 
  2. -Dfile=your-artifact-1.0.jar \    
  3. [-DpomFile=your-pom.xml] \    
  4. [-DgroupId=org.some.group] \    
  5. [-DartifactId=your-artifact] \    
  6. [-Dversion=1.0] \    
  7. [-Dpackaging=jar] \    
  8. [-Dclassifier=test] \    
  9. [-DgeneratePom=true] \    
  10. [-DgeneratePom.description="My Project Description"] \   [-DrepositoryLayout=legacy] \    
  11. [-DuniqueVersion=false

當(dāng)然這里仍然有個(gè)認(rèn)證的問題,我們需要首先在 maven 的 settings 配置當(dāng)中加入:

  1. <servers> 
  2.         <server> 
  3.             <id>Maven.oa.com</id> 
  4.             <username>rdm</username> 
  5.             <password>rdm</password> 
  6.          </server> 
  7. </servers> 

然后我們就可以使用命令上傳了:

  1. mvn deploy:deploy-file -DgroupId=com.tencent.test -DartifactId=test  
  2. -Dversion=1.0.0 -Dpackaging=aar -Dfile=test.aar  
  3. -Durl=http://maven.oa.com/nexus/content/repositories/thirdparty  
  4. -DrepositoryId=Maven.oa.com

3、插件

3.1 什么是插件

插件其實(shí)就是用來讓我們偷懶的。如果沒有插件,我們想要構(gòu)建一個(gè) Java 工程,就要自己定義 sourceSets,自己定義 classpath,自己定義構(gòu)建步驟等等。

簡(jiǎn)單地說,插件其實(shí)就是一組配置和任務(wù)的合集。

gradle 插件的存在形式主要由三種,

· gradle 文件中直接編寫,你可以在你的 build.gradle 當(dāng)中寫一個(gè)插件來直接引入:

  1. apply plugin: GreetingPlugin 
  2.  
  3. class GreetingPlugin implements Plugin<Project
  4.    void apply(Project project) { 
  5.       project.task('hello') << { 
  6.           println "Hello from the GreetingPlugin" 
  7.       } 
  8.    } 

· 

buildSrc工程,這個(gè)就是在你的工程根目錄下面有一個(gè)標(biāo)準(zhǔn)的 Groovy 插件工程,目錄是 buildSrc,你可以直接引用其中編寫的插件。

· 

獨(dú)立的工程,從結(jié)構(gòu)上跟 buildSrc 工程是一樣的,只不過這種需要通過發(fā)布到倉(cāng)庫(kù)的形式引用。通常我們接觸的插件都是這種形式。

· 

詳細(xì)可以參考:Chapter 61. Writing Custom Plugins

3.2 常見的插件

目前接觸到的插件,有下面這么幾種:

· java,構(gòu)建 java 工程

· war,發(fā)布 war 包用,構(gòu)建 web 工程會(huì)用到

· groovy,構(gòu)建 groovy 工程

· com.android.application,構(gòu)建 Android app 工程

· com.android.library,構(gòu)建 Android library,通常輸出 aar

· sign,簽名

· maven,發(fā)布到 maven 倉(cāng)庫(kù)

· org.jetbrains.intellij,構(gòu)建 intellij 插件工程

3.3 自己動(dòng)手寫一個(gè)插件

創(chuàng)建一個(gè)普通的 groovy 工程(java 工程也沒有關(guān)系),創(chuàng)建 src/main/groovy 目錄,編寫下面的代碼:

  1. package com.tencent.wecar.plugin 
  2.  
  3. import org.gradle.api.Plugin 
  4. import org.gradle.api.internal.project.ProjectInternal 
  5.  
  6. class GreetingPlugin implements Plugin<ProjectInternal> { 
  7.     void apply(ProjectInternal project) { 
  8.        project.task('hello') << { 
  9.            println 'hello' 
  10.        } 
  11.     } 

在 src/main/resources 創(chuàng)建 META-INF/gradle-plugins 目錄,創(chuàng)建 greetings.properties 文件:

  1. implementation-class=com.tencent.wecar.plugin.GreetingPlugin 

其中 greettings 就是你的插件 id。

build.gradle

  1. group 'com.tencent.wecar.plugin' 
  2. version '1.1-SNAPSHOT' 
  3. buildscript { 
  4.     repositories { 
  5.         mavenLocal() 
  6.     } 
  7.  
  8. apply plugin: 'groovy' 
  9. apply plugin: 'java' 
  10.  
  11. repositories { 
  12.     mavenCentral() 
  13.  
  14. sourceSets { 
  15.     main { 
  16.         groovy { 
  17.             srcDirs = [ 
  18.                 'src/main/groovy', 
  19.                 'src/main/java' 
  20.             ] 
  21.          }  // compile everything in src/ with groovy          
  22. java { srcDirs = []}// no source dirs for the java compiler 
  23.       } 
  24.  
  25. dependencies { 
  26.     //tasks.withType(Compile) { options.encoding = "UTF-8" } 
  27.     compile gradleApi() 
  28.  
  29. // custom tasks for creating source jars 
  30. task sourcesJar(type: Jar, dependsOn:classes) { 
  31.     classifier = 'sources' 
  32.     from sourceSets.main.allSource 
  33.  
  34. // add source jar tasks as artifacts 
  35. artifacts { archives sourcesJar } 
  36.  
  37. // upload to local 
  38. uploadArchives { 
  39.     repositories{ 
  40.         mavenLocal() 
  41.     } 

運(yùn)行 uploadArchives 發(fā)布到本地倉(cāng)庫(kù),那么就可以找到我們自己的插件了,由于當(dāng)中沒有指定 artifactId,那么我們的插件的 artifactId 就是我們的工程名稱,比如這里是 deployplugin。

那么我們要怎么引入這個(gè)插件呢?

首先要再 buildScript 增加依賴:

  1. buildscript { 
  2.     repositories { 
  3.         mavenLocal() 
  4.     } 
  5.     dependencies { 
  6.         classpath 'com.tencent.wecar.plugin:deployplugin:1.1-SNAPSHOT' 
  7.     } 

然后:

  1. apply plugin: 'greetings' 

這樣我們的 task “hello” 就被引入了。

4、Gradle 運(yùn)行慢?

用過 Gradle 的朋友多少會(huì)感覺到這貨有時(shí)候會(huì)比較慢。我們可以通過下面的三個(gè)手段加速你的 Gradle。

· 不用中央倉(cāng)庫(kù)。如果你的 repository 配置的是 mavenCentral,放開它吧,全世界的人都在琢磨著怎么虐它,你就不要瞎摻和了。試試 jCenter。

· 升級(jí)***的 Gradle 版本。目前***的版本是2.4,Android Studio 從1.3開始默認(rèn)使用 Gradle2.4

· 開啟Gradle的電動(dòng)小馬達(dá)。在 gradle.properties(眼熟?沒錯(cuò),就是它?。。?/p>

里面添加下面的配置:

如果你的任務(wù)沒有時(shí)序要求,那么打開這個(gè)選項(xiàng)可以并發(fā)處理多個(gè)任務(wù),充分利用硬件資源。。嗯,如果你的是單核 CPU。。當(dāng)我沒說。。 org.gradle.parallel=true 這個(gè)也可以在命令行通過參數(shù)的形式啟動(dòng),3個(gè)小時(shí)有效。守護(hù)進(jìn)程可以使編譯時(shí)間大大縮短 org.gradle.daemon=true 這個(gè)看需求吧,Gradle 是運(yùn)行在 Java 虛擬機(jī)上的,這個(gè)指定了這個(gè)虛擬機(jī)的堆內(nèi)存初始化為256M,***為1G。如果你內(nèi)存只有2G,那當(dāng)我沒說。。 org.gradle.jvmargs=-Xms256m -Xmx1024m

當(dāng)然,建議的方式是在你的用戶目錄下面的 .gradle/ 下面創(chuàng)建一個(gè) gradle.properties,免得坑你的隊(duì)友。。。

想了解更多干貨,請(qǐng)搜索關(guān)注公眾號(hào):騰訊Bulgy,或搜索微信號(hào):weixinBugly,關(guān)注我們

騰訊Bugly

Bugly是騰訊內(nèi)部產(chǎn)品質(zhì)量監(jiān)控平臺(tái)的外發(fā)版本,支持iOS和Android兩大主流平臺(tái),其主要功能是App發(fā)布以后,對(duì)用戶側(cè)發(fā)生的crash以及卡頓現(xiàn)象進(jìn)行監(jiān)控并上報(bào),讓開發(fā)同學(xué)可以***時(shí)間了解到app的質(zhì)量情況,及時(shí)修改。目前騰訊內(nèi)部所有的產(chǎn)品,均在使用其進(jìn)行線上產(chǎn)品的崩潰監(jiān)控。

騰訊內(nèi)部團(tuán)隊(duì)4年打磨,目前騰訊內(nèi)部所有的產(chǎn)品都在使用,基本覆蓋了中國(guó)市場(chǎng)的移動(dòng)設(shè)備以及網(wǎng)絡(luò)環(huán)境,可靠性有保證。使用Bugly,你就使用了和手機(jī)QQ、QQ空間、手機(jī)管家相同的質(zhì)量保障手段

 

 

責(zé)任編輯:倪明 來源: 騰訊Bugly
相關(guān)推薦

2011-09-02 17:59:01

2013-04-25 15:30:52

Windows PhoWindows Pho

2014-06-13 10:55:15

移動(dòng)WebApp開發(fā)

2015-07-16 17:14:21

終端開發(fā)

2010-08-26 05:55:13

2023-10-07 14:25:14

2013-09-04 09:35:54

移動(dòng)端Web App開發(fā)

2015-01-09 11:29:53

Android開發(fā)工具類

2013-12-30 13:46:27

Android開發(fā)者

2019-03-12 10:38:18

前端開發(fā)Nginx

2022-07-20 09:05:06

Python編程語(yǔ)言

2020-12-09 18:16:48

容器云開發(fā)CaaS

2009-10-09 13:44:00

ccna考試必備知識(shí)ccna考試

2016-11-18 17:40:35

2023-06-27 08:34:32

2015-10-14 09:36:03

2020-06-19 16:25:19

MySQL日志文件數(shù)據(jù)庫(kù)

2017-04-10 13:43:34

AndroidGradleAS

2010-06-07 18:51:15

UML入門

2017-11-27 13:09:00

AndroidGradle代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)