使用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. 文件哈希审计工具md5deep/hashdeep

    文件哈希审计工具md5deep/hashdeep   在数据取证中,通常需要验证文件的哈希值,以判断文件是否已知好文件,或者文件是否被修改过.Kali Linux提供专用工具hashdeep.该工具的 ...

  2. 1003 Emergency (25)(25 point(s))

    problem 1003 Emergency (25)(25 point(s)) As an emergency rescue team leader of a city, you are given ...

  3. Revit二次开发示例:DeleteObject

    在本例中,通过命令可以删除选中的元素. 需要注意的是要在代码中加入Transaction,否则的话会出现Modifying  is forbidden because the document has ...

  4. 【BZOJ 3456】城市规划

    http://www.lydsy.com/JudgeOnline/problem.php?id=3456 设\(f(n)\)表示n个点有标号无向连通图的数目. dp:\(f(n)=2^{n\choos ...

  5. 【51Nod 1222】最小公倍数计数

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1222 求\([a,b]\)中的个数转化为求\([1,b]\)中的个数减去 ...

  6. Substring with Concatenation of All Words 题解

    题意 You are given a string, s, and a list of words, words, that are all of the same length. Find all ...

  7. SPOJ 10232. Distinct Primes

    Arithmancy is Draco Malfoy's favorite subject, but what spoils it for him is that Hermione Granger i ...

  8. BZOJ 1008 [HNOI2008]越狱 排列组合

    1008: [HNOI2008]越狱 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4788  Solved: 2060[Submit][Status] ...

  9. centos 6.5安装VMware tools

    系统描述:win7旗舰版64位系统+VMware Workstation10+CentOS6.5(win7系统上安装了VMware Workstation10虚拟化软件,在该虚拟化软件上安装了Cent ...

  10. Mac下操作mysql

    修改密码 进入到mysql工作目录 cd /usr/local/mysql/bin/ 登录mysql mysql -u root -p 输入初始密码 mysql> 设置新密码 mysql> ...