您的位置:首页 > 移动开发 > Android开发

【转】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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: