使用gradle的目的

  • 更容易重用资源和代码;
  • 可以更容易创建不同的版本的程序,多个类型的apk包;
  • 更容易配置,扩展;
  • 更好的IDE集成;

Gradle基本结构

使用ide创建的gradle构建的项目,会自动创建一个build.gradle,如下:

buildscript {
repositories {
mavenCentral()
} dependencies {
classpath 'com.android.tools.build:gradle:0.9.0'
}
} apply plugin: 'android' android {
compileSdkVersion
buildToolsVersion "19.0.0"
}

可以看到,构建文件主要有三个区域:

buildscript{…}

//Configures the build script classpath for this project. 设置脚本的运行环境

apply plugin: 'android'

//设置使用android插件构建项目

android{…}

//设置编译android项目的参数

任务task的执行

  • assemble The task to assemble the output(s) of the project(输出一个项目文件,android就是打包apk)
  • check The task to run all the checks.(运行检查,检查程序的错误,语法,等等)
  • build This task does both assemble and check (执行assemble和check)
  • clean This task cleans the output of the project(清理项目输出文件)

上面的任务assemble,check,build实际上什么都不做,他们其实都是其他任务的集合。

执行一个任务的方式为gradle 任务名, 如gradle assemble,在android项目中还有connectedCheck(检查连接的设备或模拟器),deviceCheck(检查设备使用的api版本)。通常我们的项目会有至少生成两个版本,debug和release,我们可以用两个任务assembleDebug和assembleRelease去分别生成两个版本,也可以使用assemble一下子生成两个版本。gradle支持任务名缩写,在我们执行gradle assembleRelease的时候,可以用gradle aR代替。

基本的构建定制

我们可以在build.gradle文件中配置我们的程序版本等信息,从而可以生成多个版本的程序。
支持的配置有:

  • minSdkVersion 最小支持sdk版本
  • targetSdkVersion 编译时的目标sdk版本
  • versionCode 程序版本号
  • versionName 程序版本名称
  • packageName 程序包名
  • Package Name for the test application 测试用的程序包名
  • Instrumentation test runner 测试用的instrumentation实例
android {
compileSdkVersion
buildToolsVersion "19.0.0" defaultConfig {
versionCode
versionName "2.0"
minSdkVersion
targetSdkVersion
}
}

目录配置

默认情况下项目目录是这样的
有两个组件source sets,一个main,一个test,对应下面两个文件夹。

src/main/
src/androidTest/

然后对于每个组件目录都有两个目录,分别存储java代码和资源文件

java/
resources/

对于android项目中呢,对应的目录和文件是
AndroidManifest.xml //该文件src/androidTest/目录下不需要,程序执行时会自动构建

res/
assets/
aidl/
rs/
jni/

如果需要上面这些文件,但是不是在上面所说的目录,则需要设置。

sourceSets {
main {
java {
srcDir 'src/java'
}
resources {
srcDir 'src/resources'
}
}
}

可以给main或者test设置根目录,如

sourceSets {
androidTest.setRoot('tests')
}

可以指定每种文件的存储路径

sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}

特别是我们的ndk生成的.so文件,通常我们不是放到jni目录中的,我们需要设置一下

sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}

签名配置

可以给不同类型进行不同的配置:

android {
signingConfigs {
debug {
storeFile file("debug.keystore")
} myConfig {
storeFile file("other.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
} buildTypes {
foo {
debuggable true
jniDebugBuild true
signingConfig signingConfigs.myConfig
}
}
}

上面的配置文件配置两个类型,一个时debug类型,一个时自己的自定义类型。两个分别使用了不同的签名,同时对于生成密钥,要填写设置的密码。代码混淆设置代码混淆设置代码混淆设置

代码混淆设置

android {
buildTypes {
release {
runProguard true
proguardFile getDefaultProguardFile('proguard-android.txt')
}
}
}

以上是使用默认的proguard文件去进行混淆,也可以使用自己编写的规则进行混淆,proguardFile 'some-other-rules.txt'

依赖配置

程序中会依赖别的包,或者程序,需要引入别的类库。前面也说到了,支持maven。
对于本地的类库,可以这样引入:

dependencies {
compile files('libs/foo.jar') //单个文件
compile fileTree(dir: 'libs', include: ['*.jar']) //多个文件
} android {
...
}

对于maven仓库文件:

repositories {
mavenCentral()
} dependencies {
compile 'com.google.guava:guava:11.0.2'
} android {
...
}

输出不同配置的应用

android {
... defaultConfig {
minSdkVersion
versionCode
} productFlavors {
flavor1 {
packageName "com.example.flavor1"
versionCode
} flavor2 {
packageName "com.example.flavor2"
minSdkVersion
}
}
}

通过以上设置,我们可以输出不同的保命不同的版本号,以及最小sdk的程序包。当然我们可以根据自己的需求去做其他的不同。

生成多个渠道包

buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.9.+'
}
}
apply plugin: 'android' repositories {
mavenCentral()
} android {
compileSdkVersion
buildToolsVersion "19.0.3" defaultConfig {
minSdkVersion
targetSdkVersion
versionCode
versionName "1.0"
} sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
} lintOptions {
abortOnError false
} //签名
signingConfigs {
//你自己的keystore信息
release {
storeFile file("×.keystore")
storePassword "×××"
keyAlias "××××"
keyPassword "×××"
}
} buildTypes { debug {
signingConfig signingConfigs.release
} release {
signingConfig signingConfigs.release
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
} //渠道Flavors,我这里写了一些常用的,你们自己改
productFlavors {
//GooglePlay{}
//Store360{}
//QQ{}
//Taobao{}
//WanDouJia{}
//AnZhuo{}
//AnZhi{}
//BaiDu{}
//Store163{}
//GFeng{}
//AppChina{}
//EoeMarket{}
//Store91{}
//NDuo{}
xiaomi{}
umeng{}
} } //替换AndroidManifest.xml的UMENG_CHANNEL_VALUE字符串为渠道名称
android.applicationVariants.all{ variant ->
variant.processManifest.doLast{ //之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁
//${buildDir}是指./build文件夹
//${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成
//下面的路径是类似这样:./build/manifests/GooglePlay/release/AndroidManifest.xml
def manifestFile = "${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml" //将字符串UMENG_CHANNEL_VALUE替换成flavor的名字
def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
new File(manifestFile).write(updatedContent, 'UTF-8') //将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件
variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml")
}
}

以上的功能就是替换我的Manifest中的渠道标示,同时去生成不同的apk包。

最后说明

程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。

lintOptions {         abortOnError false     }

我是天王盖地虎的分割线

参考:http://www.open-open.com/lib/view/open1401084786792.html

Android -- Gradle的更多相关文章

  1. React Native Android gradle下载慢问题解决

    很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...

  2. 利用 Android Gradle 瘦身 apk

    http://devyang.me/blog/2014/11/11/li-yong-android-gradleshou-shen-apk/ apk瘦身一般有两条线, 去除无用的代码,例如引用一个比较 ...

  3. Android Gradle 技巧之一: Build Variant 相关

    Build Variant android gradle 插件,允许对最终的包以多个维度进行组合. BuildVariant = ProductFlavor x BuildType 两个维度 最常见的 ...

  4. The Android Gradle Plugin and Gradle version-compatibility

    http://tools.android.com/tech-docs/new-build-system/version-compatibility Version Compatibility Post ...

  5. Android Gradle实用技巧——多渠道打包

    友盟有很多不错的功能,例如渠道统计等. 想要做渠道统计,有一个要求就是要在manifest文件中添加各个渠道的配置.只有一两个渠道还好说,但是渠道多了的话,手动修改然后打包简直是噩梦. 幸好现在And ...

  6. Android Gradle Plugin指南(六)——高级构建定制

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Advanced-Build-Customization ...

  7. [Android]Gradle 插件 DiscardFilePlugin(class注入&清空类和方法)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6732128.html Android Gradle 插件 Di ...

  8. Android Gradle 指定 Module 打包

    Android Gradle 指定 Module 打包 项目中有许多的可以直接独立运行的 Module ,如何在 Gradle 中将签名文件配置好了,那么就不需要普通的手动点击 Generate Si ...

  9. Android Gradle manifestPlaceholders 占位符详解

    Android Gradle manifestPlaceholders 占位符详解 在实际项目中,AndroidManifest里十几个地方的值是需要动态的改变(生成apk文件的时候).如果每次去改也 ...

  10. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 一:Gradle 是什么 Gradle是一 ...

随机推荐

  1. [leetcode sort]148. Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 以时间复杂度O(n log n)排序一个链表. 归并排序, ...

  2. 项目Alpha冲刺——代码规范、本次冲刺任务与计划

    作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队) 团队名称: 那周余嘉熊掌将得队 作业目标:代码规范.本次冲刺任务与计划 团队信息: 队员学号 队员姓名 博客 ...

  3. POI2018

    [BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...

  4. [NOI2018]你的名字(SAM+线段树合并)

    考虑l=1,r=n的68分,对S和T建SAM,对T的SAM上的每个节点,计算它能给答案带来多少贡献. T上节点x代表的本质不同的子串数为mx[x]-mx[fa[x]],然后需要去掉所代表子串与S的最长 ...

  5. [Agc002E]Candy Piles

    [Agc002E]Candy Piles 题目大意 有\(n\)个数,两人轮流操作,可以做以下操作之一: 删掉一个最大的数 将所有数-1 最后取没的人输,问先手是否必胜? 试题分析 直接决策不知道选哪 ...

  6. bzoj 3926

    后缀自动机扩展到树形结构上. 先建出大的Trie,然后我们得到了一棵Trie树,对于树上的每个节点,保存一个后缀自动机从根走它代表的字符串后到达的节点,每次其儿子就从父亲的这个节点开始扩展. /*** ...

  7. hdoj 5120 Intersection 圆环面积求交

    Intersection Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Tota ...

  8. 向USB设备发送SCSI命令

    http://bbs3.driverdevelop.com/simple/?t84347.html { BOOL status = ; DWORD accessMode = , shareMode = ...

  9. Bootstrap 3之美03-独立行,文字环绕,图片自适应,隐藏元素

    本篇主要包括: ■  添加独立的一行■  文字环绕■  图片自适应■  隐藏元素 添加独立的一行 在id为body的section和id为main的section之间,添加2张图片. 我们发现,新加的 ...

  10. Unity3d操作的一些技巧知识点和BUG解决方案

    自己记录一些东西,转载请良心注明出处.     1.如何同时打开两个UNITY3D项目. 有时候需要对比,或者需要添加另一个项目的某资源到目前项目,同时打开两个项目看起来会比较明了.如果直接打开的话, ...