zoukankan      html  css  js  c++  java
  • gradle

    org.gradle.parallel=true # 并行构建
    org.gradle.daemon=true # 开启Gradle守护进程
    org.gradle.jvmargs=-Xms256m -Xmx1024m # 配置JVM<参照下图>
     

    0、讲个故事

    0.1 Ant,我还真以为你是只蚂蚁

    真正开始近距离接触编程其实是在2012年,年底的时候带我的大哥说,咱们这个 app 发布的时候手动构建耗时太久,研究一下 ant 脚本吧。

    那个时候连 HashMap 都不知道是啥,可想开发经验几乎为零,一个小小的 ant 脚本看得我真是深深地感受到了这个世界充满的恶意。好在后来硬着头皮搞明白了什么 target 之类的鬼东西,不然就没有然后了。

    0.2 Maven,你们真的会读这个单词么

    Maven /`meivn/

    接触 Maven,完全是因为读陈雄华的《Spring 实战》,他的源码居然是用 Maven 构建的,结果 Spring 学得一塌糊涂,Maven我倒是用顺手了。。

    跟 Ant 一 样,Maven 可以用来构建 Java 工程;跟 Ant 一样,Maven 的配置用 xml 来描述;但,Maven 可以管理依赖,它可以让你做 到“想要什么,就是一句话的事儿”。比如我想要个 gson,Maven 说可以,你记下来我带会儿构建的时候给你去取。

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

    真 是让你当大爷呢。不过,Maven 这家伙学起来有点儿费劲,很多初学的时候在搭建环境的时候就被搞死了——你以为是因为 Maven 的学习曲线陡峭 吗?当然不是,是因为当初 Maven 的中央仓库被 x 了,所以你就天天看着 cannot resovle dependencies 玩就好了。

    后 来 OSChina 傍上了阿里这个爸爸,就有了 maven.oschina.net。我去年找工作落定之后,想着做点儿什么的时候,发 现 maven.oschina.net 估计被阿里爸爸关禁闭,死了几天,现在又活过来了。那又怎样呢,反正中央仓库被 x 的事情也已经成为过去。

    0.3 Gradle,你爹是不是 Google!!

    13年的时候,我兴奋地跟前面提到的大哥说 Maven 是个好同志的时候,大哥说,Google 推荐用 Gradle。。所以,我想 Gradle,你爹是不是 Google。。或者至少是个干爹吧。

    其 实这都不重要了,毕竟 Gradle 实在是好用。比起前面两位的 xml 配置的手段,直接用代码的方式上阵必然是灵活得多。不仅如 此,Gradle 居然可以使用 Maven 仓库来管理依赖,就像是一个简易版的 Maven 一样,如果不是看不到 pom 文件,你都还以为你仍然 在使用 Maven(当然,由于你在用 Maven 的仓库,所以你自然也是离不开 Maven 的)。哦,你是 Ant 用户啊,那也没关系啊,不信你 看:

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

    1、用 Gradle 构建

    1.1 工程结构

    Android 开发必备知识:我和 Gradle 有个约会

    如图所示,这是一个不能更普通的 android 的 gradle 工程了。

    · 根目录下面的 settings.gradle 当中主要是用来 include 子模块的,比如我们这个工程有一个叫做 app 的子模块,那么 settings.gradle 的内容如下:

    1. include  ':app'  

    ·

    根目录下面的 build.gradle 包含一些通用的配置,这些配置可以在各个子模块当中使用。

    ·

    gradle.properties 文件包含的属性,会成为 project 的 properties 的成员,例如我们添加了属性 hello,

    ·

    hello=Hello Tas!

    · 然后我们在 build.gradle 当中创建 task:

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

    输出地结果是一样的:

    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 这 个文件在 android 工程当中会遇到,我们通常在其中设置 android 的 sdk 和 ndk 路径。当然,这 个 android studio 会帮我们设置好的。为了更清楚地了解这一点,我把 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,通过这两个方法,我们可以在 gradle 脚本当中获取 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 结构,还有 flat 结构,如下图1为 flat 结构,2为 hierarchy 结构。有兴趣的话可以 Google 一下。

    Android 开发必备知识:我和 Gradle 有个约会

    1.2 几个重要的概念

    这一小节的出场顺序基本上跟 build.gradle 的顺序一致。

    1.2.1 Repository和Dependency

    如果你只是写 Android 程序,那么依赖问题可能还不是那么的烦人——如果你用 Java 写服务端程序,那可就是一把辛酸一把泪了。

    仓库的出现,完美的解决了这个问题,我们在开发时只需要知道依赖的 id 和版本,至于它存放在哪里,我不关心;它又依赖了哪些,构建工具都可以在仓库中帮我们找到并搞定。这一切都是那么自然,要不要来一杯拿铁,让代码构建一会儿?

    据 说在 Java 发展史上,涌现出非常多的仓库,不过最著名的当然是 Maven 了。Maven 通过 groupId 和 artifactId 来 锁定构件,再配置好版本,那么 Maven 仓库就可以最终锁定一个确定版本的构件供你使用了。比如我们开头那个例子,

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

    Maven 就凭这么几句配置就可以帮你搞定 gson-2.4.jar,不仅如此,它还会按照你的设置帮你把 javadoc 和 source 搞定。妈妈再也不用担心我看不到构件的源码了。

    那么这个神奇的 Maven 仓库在哪儿呢? Maven Central,中央仓库,是 Maven 仓库的鼻祖,其他的大多数仓库都会对它进行代理,同时根据需求添加自己的特色库房。简单说几个概念:

    ·

    代理仓库:要租房,去搜房网啊。你要去驾校报名,我是驾校代理,你找我,我去找驾校。具体到这里,还有点儿不一样,一旦有人从代理仓库下载过一次特定得构件,那么这个构件会被代理仓库缓存起来,以后就不需要找被代理的仓库下载了。

    ·

    私有仓库:中国特色社会主义。走自己的路,你管我啊?公司内部的仓库里面有几个 hosted 的仓库,这些仓库就是我们公司内部特有的,里面的构件也是我们自己内部的同事上传以后供团队开发使用的。

    ·

    本地仓库:大隐隐于市。跟代理仓库的道理很像,只不过,这个仓库是存放在你自己的硬盘上的。

    ·

    说起来,Andoid sdk 下面有个 extra 目录,里面的很多依赖也是以Maven 仓库的形式组织的。不过这是 Google 特色嘛,人家牛到不往 Maven 的中央仓库上传,真是没辙。

    1.2.2 SourceSets

    源码集,这里面主要包含你的各种类型的代码的路径,比如 'src/main/java' 等等。

    1.2.3 Properties

    前面我们其实也稍稍有提到,这个 properties 其实是 gradle 的属性,在 gradle 源码当中,我们找到 Project.java 这个接口,可以看到:

    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 其实就是一个 map,我们可以在 gradle.properties 当中定义属性,也可以通过 gradle 脚本来定义:

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

    使用方法我们前面已经提到,这里就不多说了。

    1.2.4 Project和Task

    如果你用过 ant,那么 project 基本上类似于 ant 的 project 标签,task 则类似于 ant 的 target 标签。我们在 build.gradle 当中编写的

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

    实际上,是调用

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

    创建了一个 task,并通过 << 来定义这个 task 的行为。我们看到 task 还有如下的重载:

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

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

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

    简单说,project 就是整个构建项目的一个逻辑实体,而 task 就是这个项目的具体任务点。更多地介绍可以参见官网的文档,和 gradle 的源码。

    2、发布构件

    发布构件,还是依赖仓库,我们仍然以 Maven 仓库为例,私有仓库多数采用 sonatype。

    2.1 UI 发布

    如果管理员给你开了这个权限,你会在 ui 上面看到 upload artifact 的 tab,选择你要上传的构件,配置好对应的参数,点击上传即可。

    Android 开发必备知识:我和 Gradle 有个约会

    2.2 使用 Maven 插件

    这里的意思是使用 Maven 的 gradle 插件,在构建的过程中直接上传。构建好的构件需要签名,请下载 GPG4WIN (windows),或者 GPGTOOLS(mac),生成自己的 key。

    直接上代码:

    gradle.properties

    1. sonatypeUsername =你的用户名 
    2. sonatypePassword =你的密码 
    3. signing.keyId =你的keyid 
    4. signing.password =你的keypass 
    5. #注意,通常来讲是这个路径。 
    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 =你的构件名称 
    18. group =你的构件groupid 
    19. artifactId =你的构件artifactid 
    20. # 版本号,采用三位数字的形式,如果是非稳定版本,请务必添加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.     } 

    然后运行 gradle uploadArchives 就可以将打包的 aar 发布到公司的 Maven 仓库当中了。jar包的方式类似,这里就不在列出了。

    2.3 使用 Maven 命令

    这个可以通过 mvn 在 cmdline 直接发布构件,命令使用说明:

    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 ] 

    当然这里仍然有个认证的问题,我们需要首先在 maven 的 settings 配置当中加入:

    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 什么是插件

    插件其实就是用来让我们偷懒的。如果没有插件,我们想要构建一个 Java 工程,就要自己定义 sourceSets,自己定义 classpath,自己定义构建步骤等等。

    简单地说,插件其实就是一组配置和任务的合集。

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

    · gradle 文件中直接编写,你可以在你的 build.gradle 当中写一个插件来直接引入:

    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工程,这个就是在你的工程根目录下面有一个标准的 Groovy 插件工程,目录是 buildSrc,你可以直接引用其中编写的插件。

    ·

    独立的工程,从结构上跟 buildSrc 工程是一样的,只不过这种需要通过发布到仓库的形式引用。通常我们接触的插件都是这种形式。

    ·

    详细可以参考:Chapter 61. Writing Custom Plugins

    3.2 常见的插件

    目前接触到的插件,有下面这么几种:

    · java,构建 java 工程

    · war,发布 war 包用,构建 web 工程会用到

    · groovy,构建 groovy 工程

    · com.android.application,构建 Android app 工程

    · com.android.library,构建 Android library,通常输出 aar

    · sign,签名

    · maven,发布到 maven 仓库

    · org.jetbrains.intellij,构建 intellij 插件工程

    3.3 自己动手写一个插件

    创建一个普通的 groovy 工程(java 工程也没有关系),创建 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 创建 META-INF/gradle-plugins 目录,创建 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.     } 

    运行 uploadArchives 发布到本地仓库,那么就可以找到我们自己的插件了,由于当中没有指定 artifactId,那么我们的插件的 artifactId 就是我们的工程名称,比如这里是 deployplugin。

    那么我们要怎么引入这个插件呢?

    首先要再 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 运行慢?

    用过 Gradle 的朋友多少会感觉到这货有时候会比较慢。我们可以通过下面的三个手段加速你的 Gradle。

    · 不用中央仓库。如果你的 repository 配置的是 mavenCentral,放开它吧,全世界的人都在琢磨着怎么虐它,你就不要瞎掺和了。试试 jCenter。

    · 升级最新的 Gradle 版本。目前最新的版本是2.4,Android Studio 从1.3开始默认使用 Gradle2.4

    · 开启Gradle的电动小马达。在 gradle.properties(眼熟?没错,就是它!!)

    里面添加下面的配置:

    如果你的任务没有时序要求,那么打开这个选项可以并发处理多个任务,充分利用硬件资源。。嗯,如果你的是单核 CPU。。当我没 说。。 org.gradle.parallel=true 这个也可以在命令行通过参数的形式启动,3个小时有效。守护进程可以使编译时间大大缩 短 org.gradle.daemon=true 这个看需求吧,Gradle 是运行在 Java 虚拟机上的,这个指定了这个虚拟机的堆内存初始化 为256M,最大为1G。如果你内存只有2G,那当我没说。。 org.gradle.jvmargs=-Xms256m -Xmx1024m

    当然,建议的方式是在你的用户目录下面的 .gradle/ 下面创建一个 gradle.properties,免得坑你的队友。。。

    想了解更多干货,请搜索关注公众号:腾讯Bulgy,或搜索微信号:weixinBugly,关注我们 

    腾讯Bugly

    Bugly是腾讯内部产品质量监控平台的外发版本,支持iOS和Android两大主流平台,其主要功能是App发布以后,对用户侧发生的 crash以及卡顿现象进行监控并上报,让开发同学可以第一时间了解到app的质量情况,及时修改。目前腾讯内部所有的产品,均在使用其进行线上产品的崩 溃监控。

    腾讯内部团队4年打磨,目前腾讯内部所有的产品都在使用,基本覆盖了中国市场的移动设备以及网络环境,可靠性有保证。使用Bugly,你就使用了和手机QQ、QQ空间、手机管家相同的质量保障手段

    http://www.open-open.com/lib/view/open1449881219285.html

  • 相关阅读:
    Python 数据处理 正则匹配,清洗脏数据
    Pycharm自用激活码
    编程杂谈 集群与分布式
    win10 向右键添加管理员级CMD
    win10 笔记本键盘永久屏蔽Numlk键
    Golong 环境搭建
    python 各种锁机制归纳整理
    MySQL数据库操作
    Web框架本质
    Django框架
  • 原文地址:https://www.cnblogs.com/softidea/p/5549596.html
Copyright © 2011-2022 走看看