【转】Android 多渠道打包:使用Gradle和Android Studio
2016-02-23 16:32
567 查看
本文出自: /article/2234788.html
----------------- 匆忙拥挤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
一个project自动生成一个build.gradle,每个module下也自动生成一个build.gradle (本文主要讨论module中的build.gradle构建)
module/build.gradle:
[plain] view
plain copy
print?
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'
}
在DSL文档中,以上每个类型都有它的详细配置选项
例,module>build.gradle:
[plain] view
plain copy
print?
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:
[html] view
plain copy
print?
<?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了
完整示例:https://github.com/aa86799/ProguardPack
----------------- 匆忙拥挤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:
[plain] view
plain copy
print?
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:
[plain] view
plain copy
print?
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:
[html] view
plain copy
print?
<?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了
完整示例:https://github.com/aa86799/ProguardPack
相关文章推荐
- Android APK加壳技术方案【1】
- Android 调用已安装市场,去应用市场评分
- Android 沉浸式状态栏攻略
- 解决Android视频播放横竖屏切换播放问题!
- android 无法生成R文件
- Android 读取<meta-data>元素的数据
- Android四大组件之ContentProvider
- 解决android4.0系统中菜单(Menu)添加Icon无效问题
- 彻底解决Android 应用方法数不能超过65K的问题
- Android 增强版百分比布局库 为了适配而扩展
- android 五种存储方式
- Android Toast源码实现
- Android 5.x Theme 与 ToolBar 实战
- Android源码分析—带你认识不一样的AsyncTask(串并行)
- Android 自己实现 NavigationView [Design Support Library(1)]
- Color State List Resource
- android自定义permission android:protectionLevel说明
- Android学习------抓取Android开发技术周报(一)
- Android FloatingActionButton 完全解析[Design Support Library(2)]
- 【Android】SQLite使用基础