Gradle多渠道打包[umeng]
前言
国内Android应用市场品种太多,血统不纯,每次上线App都打包打到手软,上传上到吐血!好在我们有了Android studio和gradle,一条命令打包各种渠道版本App!
正文
Umeng多渠道
我们在项目中会使用统计SDK,用的最流行的当属umeng了吧。这里我们就用友盟来说明。
用了友盟的App的清单文件AndroidManifest.xml中都会写上meta-data,来区分不同的渠道:
<meta-data
    android:name="UMENG_CHANNEL"
    android:value="Channel_ID" />1.将Channel_ID更改为${UMENG_CHANNEL_VALUE},如下:
<meta-data
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}" />2.在app的build.gradle设置produceFlavors:
  productFlavors {
    xiaomi {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
    }
    qihoo {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qihoo"]
    }
    baidu {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
    }
    wandoujia {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
    }
    qq {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq"]
    }
  }3.来看看我在项目中使用的build.gradle文件内容:
apply plugin: 'com.android.application'
def releaseTime() {
  return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
  compileSdkVersion 23
  buildToolsVersion "23.0.0"
  defaultConfig {
    // 这里的applicationId根据自己的替换
    applicationId "com.sunjiajia.xxxxx"
    minSdkVersion 14
    targetSdkVersion 22
    versionCode 1
    versionName "0.0.1"
    multiDexEnabled true //dex突破65535限制
    manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
  }
  lintOptions {
    disable 'MissingTranslation', 'ExtraTranslation'
    abortOnError false
  }
  signingConfigs {
    // /home/monkey/Projects/AndroidStudioProjects/debug.jks是签名文件所在全路径
    // debug时打包用的签名
    debug {
      keyAlias 'debug'
      keyPassword '123456'
      storeFile file('/home/monkey/Projects/AndroidStudioProjects/debug.jks')
      storePassword '123456'
    }
     // release时打包用的签名
    release {
      keyAlias 'monkey'
      keyPassword '123123'
      storeFile file('/home/monkey/Projects/AndroidStudioProjects/monkey.jks')
      storePassword '123123'
    }
  }
  buildTypes {
    debug {
      // 显示Log
      buildConfigField "boolean", "LOG_DEBUG", "true"
      versionNameSuffix "-debug"
      minifyEnabled false
      zipAlignEnabled false
      shrinkResources false
      signingConfig signingConfigs.debug
    }
    release {
      // 不显示Log
      buildConfigField "boolean", "LOG_DEBUG", "false"
      minifyEnabled true
      zipAlignEnabled true
      // 移除无用的resource文件
      shrinkResources true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      signingConfig signingConfigs.release
      applicationVariants.all { variant ->
        variant.outputs.each { output ->
          def outputFile = output.outputFile
          if (outputFile != null && outputFile.name.endsWith('.apk')) {
            // 输出apk名称为appname_v1.0_2015-09-15_09-57-58_wandoujia.apk
            // 下面的appname改为你自己的app name
            def fileName = "appname_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
            output.outputFile = new File(outputFile.parent, fileName)
          }
        }
      }
    }
  }
  packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LGPL2.1'
  }
  // 友盟多渠道打包
  productFlavors {
    xiaomi {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
    }
    qihoo {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qihoo"]
    }
    baidu {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
    }
    wandoujia {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
    }
    qq {
      manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq"]
    }
  }
}
dependencies {
  testCompile 'junit:junit:4.12'
  compile 'com.android.support:appcompat-v7:23.0.1'
  compile 'com.android.support:design:23.0.1'
}命令创建task
1.进入项目的根目录:
// 打包全部Debug版本
./gradlew assembleDebug// 打包全部Release版本
./gradlew assembleRelease2.assemble和Product Flavor 结合创建指定渠道的任务版本。例如:
// 打包wandoujia渠道的Release版本和Debug版本
./gradlew assembleWandoujia// 打包wandoujia渠道的Release版本
./gradlew assembleWandoujiaReleaseGradle多渠道打包[umeng]的更多相关文章
- [转]Android Studio系列教程六--Gradle多渠道打包
		转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ... 
- Android Studio系列教程六--Gradle多渠道打包
		Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ... 
- gradle多渠道打包及友盟统计-eclipse版本
		在进行渠道打包的之前,先看看准备篇,知道打包为了什么. 参见1.0android批量打包认知. eclipse中使用gradle多渠道打包全部流程 一.生成gradle文件,配置本地的gradle环境 ... 
- 【转】Android Studio系列教程六--Gradle多渠道打包
		原文链接:http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ 由于国内Android市场众多渠道,为了统计每个渠道的 ... 
- Gradle多渠道打包
		国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包 以友盟多渠道打包为例 在AndroidManifest.xml里面 <meta-data a ... 
- 使用gradle多渠道打包
		以友盟的多渠道打包为例,如果我们须要打包出例如以下渠道:UMENG, WANDOUJIA, YINGYONGBAO. 第一种方法.是须要创建文件的. 我们在写完我们的代码之后,在app/src以下.分 ... 
- android studio学习----gradle多渠道打包
		由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了. 友盟多渠道打包 废 ... 
- Android Studio + gradle多渠道打包
		通过工具栏的Build->Build Apk 好像只能打包第一个Module(eclipse里面是Project的概念),怎么多渠道打包呢?目前好像只能一个一个的打 首先在清单文件里设置个变量: ... 
- Android Studio 使用Gradle多渠道打包
		第一步:配置AndroidManifest.xml 以友盟渠道为例,渠道信息一般都是写在 AndroidManifest.xml文件中,大约如下: <meta-data android:name ... 
随机推荐
- #linux包之sysstat之iostat命令
			概述 对于I/O-bond类型的进程,我们经常用iostat工具查看进程IO请求下发的数量.系统处理IO请求的耗时,进而分析进程与操作系统的交互过程中IO方面是否存在瓶颈.同vmstat一样,iost ... 
- Android-Adapter用法总结
			1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的 View(ListView,GridView)等地方都需要用到Adapter.如下图 ... 
- Amazon后台模拟登陆
			本文基于python3.4的selenium库打开浏览器,并将浏览器中的登陆cookie保存到本地,那么下次登陆就可以直接利用cookie了: # !/usr/bin/python3.4 # -*- ... 
- MySQL分库分表环境下全局ID生成方案 转
			在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库 ... 
- DBA常用SQL之会话与等待事件
			SELECT * FROM V$SESSION WHERE USERNAME IS NOT NULL AND STATUS = 'ACTIVE' ORDER BY LOGON_TIME, SID; 1 ... 
- Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法
			Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法 最近在适用Ext JS4开发 ... 
- Python基础(三)——集合、有序 无序列表、函数、文件操作
			1.Set集合 class set(object): """ set() -> new empty set object set(iterable) -> n ... 
- @synthesize obj = _obj 理解
			在很多代码里可以看到类似得用法: @interface MyClass:NSObject{ MyObjecct *_object; } @property(nonamtic, retain) MyOb ... 
- FreeDroid开发过程中遇到的一些问题
			http://bestzp.com/?p=83 Android Studio混淆: build.gradle中 1 2 3 4 5 6 buildTypes { release { ... 
- SecureCRT自动登录
