转载请注明出处:
http://blog.csdn.net/jjwwmlp456/article/details/45057067 ----------------- 匆忙拥挤repeat
Gradle,这个东西好复杂,不过在Android中,我们知道它大概怎么用,它的依据何来,就够了。
Gradle的DSL,领域特定语言(domain-specific languages,简称DSL),地址:http://gradle.org/docs/2.3/dsl/
Gradle的用户指南,地址:http://gradle.org/docs/2.3/userguide/userguide.html
Android-Gradle-DSL Android结合Gradle的DSL
下载地址:https://developer.android.com/shareables/sdk-tools/android-gradle-plugin-dsl.zip
简单介绍Android-Gradle构建插件的官方地址:https://developer.android.com/tools/building/plugin-for-gradle.html
详细介绍Android-Gradle构建插件的官方地址:http://tools.android.com/tech-docs/new-build-system
build.gradle的基本形式
Android Studio 建立project,可在其下建立多个moudle。
一个project自动生成一个build.gradle,每个module下也自动生成一个build.gradle (本文主要讨论module中的build.gradle构建)
module/build.gradle:
apply plugin: 'com.android.application' //启用android 应用插件 android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.stone.testbuild" minSdkVersion 8 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.0.0' }
Android-Gradle DSL 简介
上面示例中的android{ },就是我们需要主了解的,在android{}块中可以包含以下直接配置项:
defaultConfig{}
默认配置,是ProductFlavor类型。它共享给其他ProductFlavor使用
sourceSets{} 源文件目录设置,是AndroidSourceSet类型。
buildTypes{} BuildType类型
signingConfigs{} 签名配置,SigningConfig类型
productFlavors{} 产品风格配置,ProductFlavor类型
testOptions{} 测试配置,TestOptions类型
aaptOptions{} aapt配置,AaptOptions类型
lintOptions{} lint配置,LintOptions类型
dexOptions{} dex配置,DexOptions类型
compileOptions{} 编译配置,CompileOptions类型
packagingOptions{} PackagingOptions类型
jacoco{} JacocoExtension类型。
用于设定 jacoco版本splits{} Splits类型。
在DSL文档中,以上每个类型都有它的详细配置选项
多渠道打包
自动签名、混淆、打包、注入多个渠道。
例,module>build.gradle:
apply plugin: 'com.android.application' /* 定义一个方法,仅def声明时,返回类型任意(自动判断) 可以将返回值直接写成String 或def String gradle支持groovy语言,groovy默认引入的包有: java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger java.net.* java.util.* groovy.lang.* groovy.util.* */ def String computeVersionName() { return "8.8.8" } android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.stone.myapplication" minSdkVersion 8 targetSdkVersion 22 versionCode 1 versionName computeVersionName() //使用外部定义的方法 /* manifestPlaceholders manifest中使用占位符,如:<... android:name="${YOUR_APP_KEY}" > 以[key-value]形式替换:[YOUR_APP_KEY:"value"] */ manifestPlaceholders = [YOUR_APP_KEY: "友盟后台的appkey"] } signingConfigs { //gradle assembleRelease /* 可以定义多个签名配置项,如下面的myConfig */ myConfig { storeFile file("stone.keystore") storePassword "mypasswd" // storePassword System.console().readLine("\nKeystore password: ") keyAlias "stone" keyPassword "mypasswd" // keyPassword System.console().readLine("\nKey password: ") } } buildTypes { /* 可以配置多个buildType项,如下面的release,debug,aabbcc */ release { minifyEnabled true //译:使变小enabled。 即启用混淆器 //混淆文件:sdk/tools/proguard/proguard-android.txt 和 当前module下的proguard-rules.pro // proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro' //getDefaultProguardFile('proguard-android.txt'), //getDefaultProguardFile('proguard-android-optimize.txt'), signingConfig signingConfigs.myConfig zipAlignEnabled true //混淆后的zip优化,默认为true,可不写。当不显示配置为true时,不会生成unaligned.apk } debug { debuggable true //启用debug的buildType配置 } aabbcc {//自定义配置,未配置签名项,所以会生成未签名apk multiDexEnabled true } } productFlavors { /* productFlavors-产品风格: 即不同产品的配置,它会基于上面的公共配置项defaultConfig 下面的配置项与buildTypes{}中的配置项,成类似sql中的全联(full join)关系 当执行 $gradle build 命令后,会生成: module-flavor1-release-unaligned.apk module-flavor1-release.apk module-flavor1-debug-unaligned.apk module-flavor1-debug.apk module-flavor1-aabbcc.apk ...flavor2...apk applicationId 用于标识 在谷歌Play商店上的唯一标识 默认不配置,则与app的AndroidManifest.xml中的package一致 仅替换<manifest>中的package属性值,其它不受影响 */ flavor1 { proguardFiles 'proguard-rules.pro' applicationId "com.stone.myapplication.pro" //比如 专业版 manifestPlaceholders = [channelID: "百度应用平台"] } flavor2 { proguardFile 'proguard-rules.pro' applicationId "com.stone.myapplication.free" //比如 免费版 manifestPlaceholders = [channelID: "豌豆夹"] } } } dependencies { // Local binary dependency 本地jar包 compile fileTree(dir: 'libs', include: ['*.jar']) // Module dependency 引用android-library项目 compile project(':eventbuslib') /* Remote binary dependency download to local group:name:version 配置远程仓库中的jar包,打包时,检查本地有没有,若没有则下载到本地。 */ compile 'com.android.support:appcompat-v7:22.0.0' compile 'com.android.support:support-v4:22.0.0' compile 'com.android.support:cardview-v7:22.0.0' compile 'com.android.support:recyclerview-v7:22.0.0' }
关于多渠道,其实就是定义了多个flavor。用manifestPlaceholders配置,替换manifest中的占位符${}。
manifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.stone.myapplication"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="UMENG_APPKEY" android:value="${YOUR_APP_KEY}" /> <meta-data android:name="channelName" android:value="${channelID}" /> </activity> </application> </manifest>
最后,执行 $gradle build 命令 , 就ok了
补充一个引用远程jar包的操作,见下图: