gradle深入理解以及在android studio中的使用
MerlinMZLO
8年前
<p><strong>1.1 Gradle概念</strong></p> <p><strong> </strong> Gradle是一个基于Apache ant和Apache maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的xml,当前其支持的语言限于java、groovy和scala[3],计划未来将支持更多的语言。</p> <p><strong>1.2 Gradle的优势</strong></p> <p>1:自动处理包相依关系;</p> <p>2:自动处理布署问题;</p> <p>3:条件判断写法直觉;</p> <p>过去 Java 开发者常用 Maven 和 Ant 等工具进行封装布署的自动化,或是两者兼用,不过这两个包彼此有优缺点,如果频繁改变相依包版本,使用 Ant 相当麻烦,如果琐碎工作很多,Maven 功能不足,而且两者都使用 XML 描述,相当不利于设计 if、switch 等判段式,即使写了可读性也不佳,而 Gradle 改良了过去 Maven、Ant 带给开发者的问题,至今也成为 Android Studio 内置的封装布署工具。</p> <p><strong>1.3 Gradle基础</strong></p> <p>在gradle中最重要的两个概念是 <strong>项目</strong> 和 <strong>任务</strong> ,每一次构建都包括至少一个项目,每个项目又包括一个或者多个任务。每一个build.gradle文件就代表着一个项目,任务定义在项目的构建脚本里,当初始化构建过程时,gradle会基于build文件自动组装项目和任务对象。一个任务对象包含一系列的动作对象,这些动作对象之后会按照顺序执行。一个单独的动作对象就是一个待执行的代码块。</p> <p>1.3.1 构建生命周期</p> <p>一个gradle的构建通常有如下三个阶段</p> <p>a:初始化-项目实例会在该阶段被创建。</p> <p>如果一个项目有多个模块,并且每一个模块都有其对应得build.gradle文件,那么就会创建多个项目实例;</p> <p>b:配置-在该阶段,构建脚本会被执行,并为每个项目实例创建和配置任务;</p> <p>c:执行-在该阶段,gradle将决定哪个任务会被执行,哪些任务会被执行取决于开始该次构建的参数配置和该gradle文件的当前目录;</p> <p>1.3.2 构建配置文件</p> <p>每一个基于gradle构建的项目,都会有一个build.gradle文件,android的构建文件中有一些是必需的:</p> <p>aaply plugin: 'com.android.application'</p> <p>buildscript{</p> <p>repositories{</p> <p>jcenter()</p> <p>}</p> <p>dependencies{</p> <p>classpath 'com.android.tools.build:gradle:1.2.3'</p> <p>}</p> <p>}</p> <p>1.3.3 项目结构</p> <p>/src/main/java -- 应用的源代码</p> <p>/src/main/res -- 应用相关的资源文件</p> <p>/libs --外部库</p> <p>/build -- 构建过程的输出</p> <p><strong>1.4 Gradle wrapper入门</strong></p> <p>gradle是一个不断发展的工具,新版本可能会打破向后兼容性,而使用gradle wrapper可以避免这个问题,并能确保构建是可复用的;</p> <p>我们打开android studio可以看见有一个gradle文件夹,如图1所示</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/83374039666fc1d30ce034182a7eed09.png"></p> <p style="text-align: center;">(图1)</p> <p>这里的gradle-wrapper.properties文件就是用来指定当前项目构建使用的gradle地址;</p> <p>当项目中使用的不是最新的Gradle版本时,android studio就会显示一个提醒,提示并建议你自动更新gradle版本,原理是android studio修改了gradle-wrapper.properties的配置并触发了一次构建,这样最新的Gradle就会被下载;</p> <p><strong>1.5 基本自定义构建</strong></p> <p>1.5.1 理解gradle文件</p> <p>当使用studio创建一个新项目时,会默认生成三个gradle文件。其中的两个文件--setting.gradle和build.gradle文件位于项目的根目录,另外一个build.gradle文件则在android app模块内,下边我们分别介绍这几个gradle文件的用途;</p> <p>a:setting.gradle -setting文件在gradle初始化阶段被执行,并且定义了哪些模块应该被包含在构建中,新建android项目时默认只有 app一个模块,对于多模块项目必须要有setting.gradle文件,否则,gradle不知道哪个模块应该被包含在构建内;</p> <p>b:根项目的build.gradle文件,默认情况下其包含如下两个代码块</p> <p>buildscript{</p> <p>repositories{</p> <p>jcenter()</p> <p>}</p> <p>dependencies{</p> <p>classpath 'com.android.tools.build:gradle:1.2.3'</p> <p>}</p> <p>}</p> <p>allprojects{</p> <p>repositories{</p> <p>jcenter()</p> <p>}</p> <p>}</p> <p>其中jcenter是一个很有名的maven库,denpendenies代码块用于配置构建过程中的依赖包;</p> <p>c:模块的构建文件,包含以下文件</p> <p>1:插件</p> <p>apply plugin : 'com.android.application',</p> <p>2: android脚本</p> <p>android{</p> <p>compileSdkVersion 22</p> <p>buildToolsVersion "22.0.1"</p> <p>defaultConfig{</p> <p>applicationid "com.baidu.cn"</p> <p>versionName "1.0"</p> <p>versionCode 1</p> <p>}</p> <p>buildTypes {</p> <p>release{</p> <p>minifyEnabled true</p> <p>proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'</p> <p>}</p> <p>}</p> <p>}</p> <p>3: 依赖包</p> <p>依赖包是标准gradle配置的一部分,其定义了一个应用或依赖项目的所有依赖包,默认情况下,一个新的android应用,在libs文件夹下对所有jar文件构成依赖。</p> <p>1.5.2 任务讲解</p> <p>任务包括基础任务(java基础插件提供基础服务支持)和android任务(android插件扩展了java基础插件提供android任务支持);</p> <p><strong>基础任务包括 :</strong></p> <p>assemble:集合项目的输出;</p> <p>clean :清理项目的输出;</p> <p>check:运行所有检查,通常是单元测试和集成测试;</p> <p>build:同时运行assemble和check;</p> <p><strong>android任务包括:</strong></p> <p>build:同时运行assemble和check任务,可以生成若干apk文件;</p> <p>help:</p> <p>install:安装apk文件到移动设备或者模拟器;</p> <p>other:</p> <p>verification:</p> <p>1.5.3 自定义构建</p> <p>1.5.3.1 操控manifest文件</p> <p>我们可以在项目的build.gradle文件下边配置applicationid,minSdkVersion,targetSdkVersion,versionCode,versionName,signingConfig,proguardFile等任务。</p> <p>在该文件下配置的选项默认会被构建进系统中,当没有被配置时才会去manifest文件查找;</p> <p>1.5.3.2 BuildConfig和资源文件</p> <p>自android sdk升级到17以后,构建工具会自动生成一个BuildConfig的类,该类包含一个按照构建类型设置值的DEBUG常量,如果有些功能只需要在debugging时期运行,那么我们就可以根据此常量来区分,示例代码如下:</p> <p>android{</p> <p>buildTypes{</p> <p>debug{</p> <p>buildConfigField "String", "api_uirl","\"http://com.example.com\api/""</p> <p>buildConfigField "boolean", "LOG_HTTP_CALLS","true"</p> <p>resValue "string","app_name","example debug" // (修改应用在桌面的现实名称)</p> <p>}</p> <p>release{</p> <p>buildConfigField "String", "api_uirl","\"http://com.example.com\api/""</p> <p>buildConfigField "boolean", "LOG_HTTP_CALLS","true"</p> <p>resValue "string","app_name","example" //(修改应用在桌面的现实名称)</p> <p>}</p> <p>}}</p> <p>1.5.3.3 项目属性,ext代码块</p> <p>ext {</p> <p>supportVersion ='25.0.1'</p> <p>frescoVersion ='0.14.1'</p> <p>}</p> <p>下边我们就可以直接应用定义的属性</p> <p>dependencies {</p> <p>compile"com.android.support:percent:${supportVersion}"</p> <p>compile"com.android.support:recyclerview-v7:${supportVersion}"</p> <p>compile"com.android.support:appcompat-v7:${supportVersion}"</p> <p>compile"com.android.support:support-v4:${supportVersion}"</p> <p>compile"com.android.support:design:${supportVersion}"</p> <p>}</p> <p>1.5.3.4 默认的任务</p> <p>如果没有指定任何任务而运行gradle的话,其会运行help任务,我们在顶层build.gradle文件中加入一行,可用来指定默认任务:</p> <p>defaultTasks 'clean' ,'assembleDebug'</p> <p>当你运行没有任何参数的gradle wrapper时,他会运行clean和assembledebug任务;</p> <p>1.6 创建构建Variant</p> <p>构建variant是用来提供多渠道多版本apk的一种实现方式,影响它的因数有两个:</p> <p>1:Product Flavor (定制产品);</p> <p>productFlavors {</p> <p>memebox_pc_download {</p> <p>buildConfigField"String","UMENG_CHANNEL_ID","\"com_flexable_cn\""</p> <p>buildConfigField"String","TALK_CHANNEL_ID","\"com_flexable_cn\""</p> <p>buildConfigField"String","CHANNEL_NAME","\"com_flexable_cn\""</p> <p>applicationid "com.example.flavor1"</p> <p>versionCode 20</p> <p>versionName "3.40.7"</p> <p>}</p> <p>}</p> <p>2:Build Types(构建类型);</p> <p>buildTypes {</p> <p>debug {</p> <p>minifyEnabled false</p> <p>debuggable true</p> <p>signingConfig signingConfigs.release</p> <p>}</p> <p>release {</p> <p>buildConfigField"boolean","LOG_DEBUG","false"</p> <p>debuggable false</p> <p>shrinkResources false</p> <p>minifyEnabled true</p> <p>zipAlignEnabled true</p> <p>signingConfig signingConfigs.release</p> <p>proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'</p> <p>}</p> <p>staging{</p> <p>applicationIdSuffix ".staging"</p> <p>versionName</p> <p>}</p> <p>}</p> <p>每一个渠道都会生成debug和release版本的包,当然也可以自定义你想要的任何构建类型;</p> <p> </p> <p>来自:http://www.jianshu.com/p/1680700a974f</p> <p> </p>