转载请注明出处:
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 简介
-
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>
最后,执行打包命令 , 就ok了
关于打包命令:
$gradle build 打全渠道即所有flavor;且含所有buildTypes
$gradle assemble[flavor][buildType]
如:gradle assembleFlavor1Release 如:gradle assembleFlavor2Debug
gradle本身支持命令缩写, 如:gradle assFlavor1R
完整示例:https://github.com/aa86799/ProguardPack