黑马程序员技术交流社区

标题: [深圳特色][问答网]关于Android Studio项目的Gradle构建 [打印本页]

作者: Jim-剣◆﹏    时间: 2016-2-28 20:44
标题: [深圳特色][问答网]关于Android Studio项目的Gradle构建
本帖最后由 Jim-剣◆﹏ 于 2016-2-28 20:51 编辑

[attach]100573[/attach]
Gradle构建脚本使用DSL(Domain Specific Language)来描述构建逻辑,使用的语言是Groovy。想了解Android Studio工程的Gradle构建系统,可以先从Project的settings.gradle、Project的build.gradle、Module的build.gradle、gradle/wrapper这些文件分析起。
1. Project的settings.gradle这个文件描述的是Project里包含哪些module。
  1. include ':app', ':lib'
复制代码


2. Project的build.gradle这个文件描述的是Gradle构建所引用的仓库和最基础的依赖。
  1. <p><font style="background-color: rgb(255, 255, 255);">buildscript {
  2.    repositories {  //支持的仓库包括jcenter, mavenCentral和Ivy
  3.        jcenter()
  4.    }
  5.    dependencies {  //基础依赖
  6.        classpath 'com.android.tools.build:gradle:1.0.1'</font></p><p><font style="background-color: rgb(255, 255, 255);">    // NOTE: Do not place your application dependencies here: they belong
  7.     // in the individual module build.gradle files
  8.    }
  9. }</font></p><p><font style="background-color: rgb(255, 255, 255);">allprojects {
  10.    repositories {
  11.        jcenter()
  12.    }
  13. }</font></p>
复制代码


3. Module的build.gradle这个文件描述的是主Module的一些配置。
  1. </blockquote></div><div class="blockcode"><blockquote>apply plugin: ‘com.android.application’ //添加用于Gradle构建过程的Android插件

  2. android {   //所有android相关的构建参数
  3.     compileSdkVersion 19  //编译版本号
  4.     buildToolsVersion “19.0.0”//构建工具版本号。需要大于或等于compileSdkVersion和targetSdkVersion

  5.     defaultConfig { //AndroidManifest.xml相关参数配置的入口,允许覆盖Manifest文件的配置
  6.         applicationId “com.example.my.app” //不同package的唯一识别码,仅存在于build.grade文件中
  7.         minSdkVersion 8
  8.         targetSdkVersion 19
  9.         versionCode 1
  10.         versionName "1.0"
  11.     }
  12.     buildTypes {//构建和打包方式,默认含debug和release2种,其中debug包使用debug key签名,release包默认无签名
  13.         release {
  14.             minifyEnabled true
  15.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro’//文件混淆。其中proguard-android.txt为默认的混淆配置,proguard-rules.pro为模块额外的混淆配置

  16.         }
  17.     }
  18. }

  19. dependencies {  //模块的依赖库
  20.     compile project(":lib”) //library module依赖
  21.     compile 'com.android.support:appcompat-v7:19.0.1’//远程库依赖,格式为group:name:version
  22.     compile fileTree(dir: 'libs', include: ['*.jar’]) //本地库依赖,包含app/libs目录下的所有jar文件。因此当module想引用某个jar时,只需将jar拷贝到<moduleName>/libs即可
  23. }
复制代码




applicationId也可以用于不同product flavour / build type使用不同applicationId的情况:

复制代码
  1. productFlavors {
  2.     pro {
  3.         applicationId = "com.example.my.pkg.pro"
  4.     }
  5.     free {
  6.         applicationId = "com.example.my.pkg.free"
  7.     }
  8. }</p><p>buildTypes {
  9.     debug {
  10.         applicationIdSuffix ".debug” //applicationId后缀
  11.     }
  12. }
  13. ....
复制代码



4. Gradle WrapperGradle Wrapper字面理解即Gradle包装,Android Studio使用Gradle Wrapper来完全嵌入Gradle的Android插件。我理解的是Android Studio不能直接使用Gradle的Android插件,需要再包一层引用。
gradle/wrapper属于Project级别文件(NOTICE:需要添加到版本控制系统)。包含如下几个文件:
Android Studio读取properties文件的配置,且运行当前目录下的wrapper文件。
gradle-wrapper.properties文件内容如下所示,若想使用指定的gradle,修改distributionUrl即可。
  1. distributionBase=GRADLE_USER_HOME
  2. distributionPath=wrapper/dists
  3. zipStoreBase=GRADLE_USER_HOME
  4. zipStorePath=wrapper/dists
  5. distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
复制代码

关于wrapper下的shell脚本,仅在命令行或非Android Studio环境下有效,Android Studio下不行。
5. 关于Build VariantsBuild Variants我理解的是,基于同一份代码所构建出的不同的APK。通常基于productFlavors和buildTypes两个维度构建,当然也存在其他的维度(如CPU/ABI,可根据需要定义)。
若productFlavors含baidu和wandoujia两种,buildTypes含release和debug两种,则可构建出4个不同的包,分别为 baiduRelease, baiduDebug, wandoujiaRelease, wandoujiaDebug。
不同的包,若存在差异化功能,可能会出现形如这种风格的目录src/main/,src/<buildType>/,src/<productFlavor>/。最终打包merge时优先级由高到低为src/<buildType>/ -> src/<productFlavor>/ -> src/main/ -> libraries/dependencies的src,并且高优先级会覆盖低优先级内容。
6. Build TasksAndroid Studio构建系统定义了一系列构建Task,顶级Task包含:assemble, check, build, clean。
关于Task更详细介绍可以研究下Gradle官方文档。
7. 满足不同构建包的差异化需求这部分内容也是基于Build Variants。
通常做法为:
假设baidu手机助手渠道包存在一些差异化功能:有2个页面,FirstActivity跳转到SecondActivity,其中FirstActivity相同,SecondActivity功能不同。
(1)首先在build.grade文件的productFlavors中添加baidu{},代表百度手机助手渠道包。
  1. ...
  2. android {
  3.     ...
  4.     defaultConfig { ... }
  5.     signingConfigs { ... }
  6.     buildTypes { ... }
  7.     productFlavors {
  8.         baidu {
  9.         }
  10.         full {
  11.         }
  12.     }
  13. }
  14. ...
复制代码

(2)在app/src目录下添加baidu包,baidu目录结构和main保持一致,根据实际情况只添加差异化部分。此处在baidu包下添加SecondActivity.java文件并自定义实现即可。
(3)由于baidu和main目录下的SecondActivity的package名称相同,因此在main的FirstActivity启动即可。








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2