【转】Android 多渠道打包:使用Gradle和Android Studio
本文出自: 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:
[plain] view plain copy print ?
- applyplugin:'com.android.application'//启用android应用插件
- android{
- compileSdkVersion22
- buildToolsVersion"22.0.1"
- defaultConfig{
- applicationId"com.stone.testbuild"
- minSdkVersion8
- targetSdkVersion22
- versionCode1
- versionName"1.0"
- }
- buildTypes{
- release{
- minifyEnabledfalse
- proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
- }
- }
- }
- dependencies{
- compilefileTree(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 ?
- applyplugin:'com.android.application'
- /*
- 定义一个方法,仅def声明时,返回类型任意(自动判断)
- 可以将返回值直接写成String或defString
- gradle支持groovy语言,groovy默认引入的包有:
- java.io.*java.lang.*java.math.BigDecimaljava.math.BigInteger
- java.net.*java.util.*groovy.lang.*groovy.util.*
- */
- defStringcomputeVersionName(){
- return"8.8.8"
- }
- android{
- compileSdkVersion22
- buildToolsVersion"22.0.1"
- defaultConfig{
- applicationId"com.stone.myapplication"
- minSdkVersion8
- targetSdkVersion22
- versionCode1
- versionNamecomputeVersionName()//使用外部定义的方法
- /*
- manifestPlaceholders
- manifest中使用占位符,如:<...android:name="${YOUR_APP_KEY}">
- 以[key-value]形式替换:[YOUR_APP_KEY:"value"]
- */
- manifestPlaceholders=[YOUR_APP_KEY:"友盟后台的appkey"]
- }
- signingConfigs{//gradleassembleRelease
- /*
- 可以定义多个签名配置项,如下面的myConfig
- */
- myConfig{
- storeFilefile("stone.keystore")
- storePassword"mypasswd"
- //storePasswordSystem.console().readLine("\nKeystorepassword:")
- keyAlias"stone"
- keyPassword"mypasswd"
- //keyPasswordSystem.console().readLine("\nKeypassword:")
- }
- }
- buildTypes{
- /*
- 可以配置多个buildType项,如下面的release,debug,aabbcc
- */
- release{
- minifyEnabledtrue//译:使变小enabled。即启用混淆器
- //混淆文件:sdk/tools/proguard/proguard-android.txt和当前module下的proguard-rules.pro
- //proguardFilesgetDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
- //getDefaultProguardFile('proguard-android.txt'),
- //getDefaultProguardFile('proguard-android-optimize.txt'),
- signingConfigsigningConfigs.myConfig
- zipAlignEnabledtrue//混淆后的zip优化,默认为true,可不写。当不显示配置为true时,不会生成unaligned.apk
- }
- debug{
- debuggabletrue//启用debug的buildType配置
- }
- aabbcc{//自定义配置,未配置签名项,所以会生成未签名apk
- multiDexEnabledtrue
- }
- }
- productFlavors{
- /*
- productFlavors-产品风格:
- 即不同产品的配置,它会基于上面的公共配置项defaultConfig
- 下面的配置项与buildTypes{}中的配置项,成类似sql中的全联(fulljoin)关系
- 当执行$gradlebuild命令后,会生成:
- 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{
- //Localbinarydependency本地jar包
- compilefileTree(dir:'libs',include:['*.jar'])
- //Moduledependency引用android-library项目
- compileproject(':eventbuslib')
- /*
- Remotebinarydependencydownloadtolocalgroup: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'
- }
manifest.xml:
[html] view plain copy print ?
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns: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>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid: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使用自定义属性
- Android 自定义ToneGenerator
- 关于android的animation的xml定义中的android:interpolator属性
- android自定义标题栏。。。。。。。
- Android Interface Definition Language (AIDL) android接口定义
- Android: 自定义Tab样式
- Android 自定义View及其在布局文件中的使用示例(二)
- Android快速开发框架Android_BaseLib,集成了常用工具类,自定义View
- Android中自定义权限