Android Gradle学习1--android studio中的相关配置

Android Gradle学习1--android studio中的相关配置

参考:

http://www.cnblogs.com/davenkin/p/gradle-learning-1.html

http://teachcourse.cn/2385.html

 

Gradle能够干什么

Gradle只是提供了构建项目的一个框架,真正起作用的是Plugin。Gradle本身的领域对象主要有ProjectTask。Project为Task提供了执行上下文,所有的Plugin要么向Project中添加用于配置的Property,要么向Project中添加不同的Task。一个Task表示一个逻辑上较为独立的执行过程,比如编译Java源代码,拷贝文件,打包Jar文件,甚至可以是执行一个系统命令或者调用Ant。

Gradle知识点

Hello word

Task的基础知识点

让我们来看一个最简单的Task,创建一个build.gradle文件,内容如下:

task helloWorld << {

   println "Hello World!"

}

执行gradle helloWorld

命令行输出如下:

:helloWorld

Hello World!

 

BUILD SUCCESSFUL

 

Total time: 2.544 secs

 

gradle操纵目录:

Gradle将当前目下的build.gradle文件作为项目的构建文件。

task copyFile(type: Copy) {

   from 'xml'

   into 'destination'

}

以上copyFilexml文件中的所有内容拷destination文件中。里的两个文件都是相于当前Project而言的,即build.gradle文件所在的目

Task间的依赖关系


task taskA(dependsOn: taskB) {

   //do something

}

这里taskA依赖了taskB。他的执行顺序是从依赖开始执行的。


task hello6 << {

   println 'hello6'

}

 

hello6.dependsOn hello5

 

task和project的关系

GradleProject从本只是含有多个Task的容器,一个Task表示一个逻辑上的元。

GradleProject的依关系是基于Task的,而不是整个Project的。

 

Task中的执行顺序关键字

doFirst:

doLast:

 

task的创建与申明

1、      普通的创建方式

task hello1 << {

  println 'hello1'

}

 “<<”表示向helloWorld中加入行代——就是groovy

 

2、常用方式:


task hello2 {

   doLast {

      println 'hello2'}

}

 

task的build执行步骤:

在执行时,Gradle并不会一开始便顺序执行build.gradle文件中的内容,而是分为两个阶段,第一个阶段是配置阶段,然后才是实际的执行阶段。在配置阶段,Gradle将读取所有build.gradle文件的所有内容来配置Project和Task等

task的属性和其定义

1、普通定义


task showDescription1<< {

   description = 'this is task showDescription'

   println description

}

 

2、在外部定义

task showDescription2<< {

   println description

}

showDescription2.description= 'this is task showDescription'

 

3、在外部设置定义区间

task showDescription3<< {

   println description

}

 

showDescription3 {

   description = 'this is task showDescription'

}

task的增量机制

如果我们修改了gradle目录结构中的任何一个文件或删除掉了任何文件,当调用相关任务时,Gradle又会重新执行,因为此时的Task已经不再是最新的了。但是若果没有文件变化,任务会被标记为UP-TO-DATE,表示该Task是最新的,Gradle将不予执行。对于outputs,我们还可以使用upToDateWhen()方法来决定一个Task的outputs是否为最新的,该方法接受一个闭包作为检查条件。

 

 

 

2、通过TaskContainer的create()方法创建Task


tasks.create(name: 'hello4') << {

   println 'hello4'

}

 

进阶知识点

task中自定义属性

gradle的默认属性:

·      projectProject本身

·      nameProject的名字

·      pathProject绝对路径

·      descriptionProject的描述信息

·      buildDirProject构建果存放目

·      versionProject的版本号

我们自己定义属性:

我们并不能直接定义,而是应该通过ext来定义。如果要添加一个名为property1的Property:


ext.property1 = "this is property1"

 

java plugin的使用

java Plugin并没有什么特别的地方,只是向Project中引入了多个Task和Property。当然,javaPlugin也有比较与众不同的地方,其中之一便是它在项目中引入了构建生命周期的概念,而Gradle的项目构建生命周期并不是Gradle的内建机制,而是由Plugin自己引入的。

自定义task
普通使用:

Gradle其实就是groovy代码,所以在build.gradle文件中,我们便可以定义Task类。

class HelloWorldTaskextends DefaultTask {

    @Optional

    String message = 'I am davenkin'

 

    @TaskAction

    def hello(){

        println "hello world$message"

    }

}

 

taskhello(type:HelloWorldTask)

 

 

task hello1(type:HelloWorldTask){

   message ="I am a programmer"

}

@TaskAction表示该Task要执行的动作,即在调用该Task时,hello()方法将被执行。另外,message被标记为@Optional,表示在配置该Task时,message是可选的。在定义好HelloWorldTask后,我们创建了两个Task实例,第一个hello使用了默认的message值,而第二个hello1在创建时重新设置了message的值。

引用其他文件自定义的task

我们将HelloWorldTask定义在了davenkin包下,因此在build.gradle文件中引用该Task时,我们需要它的全名称:

taskhello(type:davenkin.HelloWorldTask)

 

 

taskhello1(type:davenkin.HelloWorldTask){

    message ="I am a programmer"

}


在task中引入其他task生成的结果

该项目的输出需要被其他项目所使用,我们还需要将其上传到repository中,下面我们将该项目生成的包含了Task定义的jar文件上传到了本地的文件系统中。


apply plugin: 'groovy'

apply plugin: 'maven'

version = '1.0'

group = 'davenkin'

archivesBaseName ='hellotask'

 

repositories.mavenCentral()

 

dependencies {

    compile gradleApi()

    groovy localGroovy()

}

uploadArchives {

    repositories.mavenDeployer {

        repository(url: 'file:../lib')

    }

}

执行“gradle uploadArchives”,所生成的jar文件将被上传到上级目录的lib(../lib)文件夹中。

  在使用该HelloWorldTask时,客户端的build.gradle文件可以做以下配置:


buildscript {

    repositories {

        maven {

            url 'file:../lib'

        }

 

    }

 

    dependencies {

        classpath group: 'davenkin', name:'hellotask', version: '1.0'

    }

}

 

 

task hello(type:davenkin.HelloWorldTask)

首先,我们需要告诉Gradle到何处去取得依赖,即配置repository。另外,我们需要声明对HelloWorldTask的依赖,该依赖用于当前build文件。

 

自定义plugin

和在build.gradle文件中定义Task类型一样,我们可以将对Plugin的定义直接写在build.gradle中:

package davenkin

apply plugin: DateAndTimePlugin

 

dateAndTime {

    timeFormat = 'HH:mm:ss.SSS'

    dateFormat = 'MM/dd/yyyy'

}

 

class DateAndTimePluginimplements Plugin<Project> {

    void apply(Project project) {

 

       project.extensions.create("dateAndTime",DateAndTimePluginExtension)

 

        project.task('showTime') << {

            println "Current time is" +new Date().format(project.dateAndTime.timeFormat)

        }

 

        project.tasks.create('showDate')<< {

            println "Current date is" +new Date().format(project.dateAndTime.dateFormat)

        }

    }

}

 

class DateAndTimePluginExtension {

    String timeFormat ="MM/dd/yyyyHH:mm:ss.SSS"

    String dateFormat = "yyyy-MM-dd"

}

 

 

android项目中gradle配置

参考http://teachcourse.cn/2385.html

apply plugin: 'com.android.application'

 

android {

   compileSdkVersion 24

   buildToulsVersion "25.0.2"

   /**

    * 一、默认产品偏好配置

    */

   defaultConfig {

       ...

   }

   /**

    * 二、自定义签名配置

    */

   signingConfigs {

       config {

         ...

       }

   }

   /**

    * 三、构建类型,分为releasedebug两种

    */

   buildTypes {

       release {

         ...

       }

       debug {

         ...

       }

   }

   /**

    * 四、自定义产品偏好配置,可以定义多个偏好产品

    */

   productFlavors {

       demo {

           applicationId "cn.teahcourse.demo"

           versionName "1.0-demo"

           signingConfig signingConfigs.config

       }

       personal{

         ...

       }

       enterprise{

         ...

       }

   }

   /**

    *五、DEX文件构建属性配置(加快构建速度)

    */

   dexOptions {

       ...

   }

   /**

    * 六、将一个apk拆分成多个相关配置(拆分依据:屏幕密度、系统架构)

    */

   splits {

       density {

          ...

       }

       abi {

          ...

       }

   }

}

/**

 * 七、引入依赖包的秘密

 */

dependencies {

  ...

}

自定义签名signingConfigs:

signingConfigs {
     config {
         keyAlias System.getenv("KEYALIAS")
         keyPassword System.getenv("KEYPWD")
         storeFile file('release.jks')
         storePassword System.getenv("KSTOREPWD")
     }
 }

 

构建类型buildTypes:

每一个APP至少包含debug和release两种构建类型,debug定义APP的调试版本。

debug模式的几个特点:

1.     支持断点调试和log信息打印,debuggable属性值为true

2.     使用系统默认的密钥库签署apk文件

3.     没有对apk文件进行代码和资源文件的优化(包括文件压缩、冗余文件删除)

4.     没有对代码进行混淆

release模式需要注意的几个特点:

1.     不支持断点调试,debuggable默认为false

2.     没有压缩类文件代码,minifyEnabled,默认为false

3.     没有压缩资源文件,shrinkResources,默认为false

4.     没有指定自定义签名文件,默认使用系统的密钥库签署apk

release {
    shrinkResources true
    minifyEnabled true
    useProguard true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    signingConfig signingConfigs.config
}

 

最后我们还可以在这里对buildType进行相关配置。

产品偏好productFlavors:

eg:开发一个应用程序,包含个人版本personal和企业版本enterprise,这两个版本之间在功能上有所区别,企业版自然比个人版功能要多一些,很明显就是要就一个Android项目打包成两个产品发布,它们之间的要求如下所示:

personal:版本号为1,最低SDK版本定义为11,最高SDK定义为24,版本名称后缀定义为-personal,applicationId后缀定义为-per,签名文件为自定义密钥库,代码如下:

personal {
    versionCode 1
    minSdkVersion 11
    targetSdkVersion 24
    versionNameSuffix '-personal'
    applicationIdSuffix '-per'
    signingConfig signingConfigs.config
}

enterprise版本号为1000,最低SDK版本定义为11,最高SDK定义为24,版本名称后缀定义为-profession,applicationId后缀定义为-pro,签名文件为自定义密钥库代码如下:

 

 

enterprise {
    versionCode 1000
    minSdkVersion 11
    targetSdkVersion 24
    versionNameSuffix '-profession'
    applicationIdSuffix 'full'
    signingConfig signingConfigs.config
}

同时,TeachCourse定义第三个产品偏好配置为demo,用于上传GitHub,提供下载,代码如下:

demo {
    applicationId "cn.teahcourse.demo"
    versionName "1.0-demo"
    signingConfig signingConfigs.config
}


注意:
  defaultConfig也属于其中一种偏好产品,在我们没有定义自己的偏好产品时,我们构建和编译的就是默认的defaultConfig这个产品,也就只包含debug和release两个变体。

DEX文件构建dexOptions

Android Studio提供dexOption区块以便于我们配置DEX构建属性,加快DEX文件的生成速度。

  dexOptions {
    preDexLibraries true
    maxProcessCount 8
    javaMaxHeapSize "2048m"
  }

l  preDexLibraries声明是否预先编译依赖库,从而加快构建速度,实质是通过延时清除已生成的依赖库的构建文件,从而提高构建速度,根据使用情况合理配置。

l  maxProcessCount设置进程运行过程中可以使用的最大线程数。默认值为4。

l  javaMaxHeapSize设置DEX编译器的最大堆大小,堆或者栈都是用于存放暂时不用的垃圾,当内存不足时,垃圾回收机制会清除过时的缓存,堆大小决定垃圾清除的频率,影响着构建的速度

apk拆分成多个相关配置splits

一个apk文件可以支持不同屏幕密度和不同ABIs的手机设备,是因为我们进行了屏幕适配,做法:将市场主流的屏幕密度和ABIs集成到一个apk,造成的影响,如果你的应用程序本身就比较大,集成了不同屏幕密度和支持不同ABIs的代码,打包出来的apk文件变得更大,考虑到流量成本和用户体验,减少apk文件的大小其中一种方式将一个apk文件拆分成多个。

splits区块内同时提供了按屏幕密度拆分的density区块和按abi拆分的abi区块

Density区块:
android {
  ...
  splits {
 
    density {
      enable true
      exclude "xxxhdpi"
      reset() 
      include "ldpi", "xxhdpi"
      compatibleScreens 'small', 'normal', 'large', 'xlarge'
    }
  }
}

l  enable,是否基于定义的屏幕密度拆分成多个apk文件,默认为false

l  exclude,指定忽略拆分的屏幕密度列表,想要拆分成更多类型的apk文件,该关键字包含的屏幕密度列表应就可能少

l  reset(),重置默认拆分的屏幕密度依据,然后使用include标签定义拆分的屏幕密度依据

l  include,结合reset一起使用,定义拆分的屏幕密度依据

l  compatibleScreens,指定兼容的屏幕尺寸列表,区别于屏幕密度,该标签将会在清单文件manifest中通过<compatible-screens>注入到每一个apk文件中,即apk文件只能安装到<compatible-screens>指定尺寸的手机上

abi区块
android {
  ...
  splits {
 
    abi {
 
      enable true
      reset()
      include "x86", "armeabi-v7a", "mips"
      universalApk false
    }
  }
}

引入依赖包dependencies

dependencies {
    compile project(":mylibrary")
    compile files('libs/zxing.jar')
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile group: 'com.android.support', name: 'appcompat-v7', version: '25.1.0'
}

按顺序依次称为:

1、模块依赖项,

2、本地二进制依赖项,

3、本地二进制依赖项,

4、远程二进制依赖项,

5、远程二进制依赖项。

l  compile project(':mylibrary') 行声明了一个名为mylibrary的本地 Android 库模块作为依赖项,并要求构建系统在构建应用时编译并包含该本地模块。

l  compile files('libs/zxing.jar')和compilefileTree(dir: 'libs', include: ['*.jar'])都称为本地依赖项,告诉构建系统在编译类路径和最终的应用软件包中包含 app/libs/ 目录内的指定或全部 JAR 文件。如果您有模块需要本地二进制依赖项,请将这些依赖项的 JAR 文件复制到项目内部的 /libs 中。

l  compile 'com.android.support:appcompat-v7:25.1.0'和compilegroup: 'com.android.support', name: 'appcompat-v7', version: '25.1.0'都称为远程二进制依赖项,通过指定其 JCenter 坐标,针对 Android 支持库的 25.1.0 版本声明了一个依赖项。默认情况下,Android Studio 会将项目配置为使用顶级构建文件中的 JCenter存储区。当您将项目与构建配置文件同步时,Gradle 会自动从 JCenter 中抽取依赖项。或者,您也可以通过使用 SDK 管理器下载和安装特定的依赖项。

l  第五种可以清楚看出每一节表示的含义,在Android Studio引入远程二进制依赖项,通常的做法是在Library Dependency窗口中搜索,搜索到最新版本的依赖项

 

 

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值