记录一下多渠道自动化打包的另外一些配置操作,主要分为以下5个方面

1.一个渠道多个信息

2.打包签名配置

3.修改生成apk包名

4.设置编译时的渠道信息

5.其他

添加多个渠道信息

上一面文章里面给出是示例,只是简单的给UMENG_CHANNEL打上不同的渠道名。那么,如果我想要为每个渠道名添加一个对于的渠道ID,那应该怎么做咧?首先,我在原先生成友盟渠道名的meta-data那里创建一个新的meta-data,作为标识每个渠道的ID。

<meta-dataandroid:name="UMENG_CHANNEL"android:value="${CHANNEL_VALUE}" /><meta-dataandroid:name="CHANNEL_ID"android:value="${CHANNEL_ID}" />

按照我的想法,豌豆荚,360手机助手和百度手机助手的渠道id分别设置成200、201、202。于是,移出原先的循环,只能直接去到各个渠道的闭包下做配置。

android {...productFlavors {wandoujia {manifestPlaceholders = [CHANNEL_VALUE: 'wandoujia' , CHANNEL_ID:200]}qihu360 {manifestPlaceholders = [CHANNEL_VALUE: '360' , CHANNEL_ID:201]}baidu {manifestPlaceholders = [CHANNEL_VALUE: 'baidu' , CHANNEL_ID:202]}}}

到这里就可以在打包的时候成功打上渠道名和其对应的ID号了。如果想要验证结果的话,还是可以去反编译查看一下。

打包签名配置

打包签名的配置分为两种情况,一种是采用AndroidStudio来打包,这样只需要在步骤中勾选好打包的签名文件已经填写相关的密码信息,即可完成;另外一种,是进入到命令行界面进行打包操作,这时候就需要我们在build.gradle脚本中做好如下的签名信息配置

android {...signingConfigs {debug {}release {storeFile '打包签名路径'storePassword 'XXX'keyAlias 'XXX'keyPassword 'XXX'}}}

但这种做法是非常不建议的,因为这样会导致我们签名信息泄露,且不方便于我们进行控制和管理。所以,官方提倡的做法是,把这些关键信息存放到文件中去,然后再gradle打包脚本中读取信息。所以,我直接在当前的module下面创建了一个signing.properties的配置文件,

在这里面通过键值对的方式写好签名的关键信息

再根据下面的gradle打包代码,从这份文件中读取签名信息出来打包

android {...signingConfigs {debug {}release {storeFile storePassword keyAlias keyPassword }}buildTypes {release {signingConfig signingConfigs.release //设置签名信息}}}//读取文件中的信息来配置打包签名
File propFile = file('signing.properties');
if (propFile.exists()) {def Properties props = new Properties()props.load(new FileInputStream(propFile))if (props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {android.signingConfigs.release.storeFile = file(props['STORE_FILE'])android.signingConfigs.release.storePassword = props['STORE_PASSWORD']android.signingConfigs.release.keyAlias = props['KEY_ALIAS']android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']} else {android.buildTypes.release.signingConfig = null}
} else {android.buildTypes.release.signingConfig = null
}....

TeamLeader可以在提交代码的时候把signing.properties文件忽略掉,这样就不会将签名等信息泄露出去,对app的安全造成威胁。同时,也方便TeamLeader进行控制管理。

修改生成apk包名

在使用AndroidStudio打渠道包的时候,生成的渠道包默认都是以app名-渠道名-release.apk的格式命名。如果你想在让生成的渠道包进行自定义的格式命名,那么可以在gradle脚本中这样做

apply plugin: 'com.android.application'//获取产品的名字
def getProductName() {return "clock"
}
//获取当前系统的时间
def releaseTime() {return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}android {...signingConfigs {...}buildTypes {...}//修改生成的apk名字,格式为 app名_版本号_打包时间_渠道名_release.apkapplicationVariants.all { variant ->variant.outputs.each { output ->def oldFile = output.outputFileif (variant.buildType.name.equals('release')) {def releaseApkName = getProductName() + "_v${defaultConfig.versionName}_${releaseTime()}_" + variant.productFlavors[0].name + '_release.apk'output.outputFile = new File(oldFile.parent, releaseApkName)}}}}....

按照上面的代码进行打包之后,生成的包名就会变成我们重新指定的格式。这样肯定比我们手工操作方便多了,码农的任务就是要用代码解放双手,哈哈。

设置编译时的渠道信息

在我们配置好打发布包的脚本时,随之也会遇到一个问题。就是,我们再AndroidManifest里面做的配置

在平常的开发调试模式下,这两个值它会变成什么值呢?是不是突然有点懵了...别懵,这时候你只要来到androidStudio的左下角点开Build Variants窗口

点击下拉,就可以勾选我们开发模式下要生成什么渠道信息了。

如果你的开发工具左下角没有Build Variants窗口,那自己去到工具栏>View>Tool Windows里面打开。

其他

除了以上的一些配置外,在打包的时候还有另外一些配置问题,如:配置混淆规则,配置混淆优化,移除无用的资源文件,压缩对齐apk包,突破65535个方法限制等等。这里主要记录一下最后的65535方法限制的问题,其他的会在最后给出完整的打包脚本。

Android生成的app的apk包要求所有方法的总数必须小于65536个方法,否则就无法生成单个class.dex文件(干过反编译这事的人应该都熟悉这东东)。所以,一个app在不断发展迭代的过程之后,必然会面临这个问题。gradle给出的解决方法很简单

android {...buildTypes {release {...multiDexEnabled true//启用生成个dex文件的支持}}dependencies {compile fileTree(dir: 'libs', include: '*.jar')compile files('libs/locSDK_5.01.jar')compile 'com.umeng.analytics:analytics:latest.integration'//添加支持multidex的兼容包compile 'com.android.support:multidex:1.0.0'
}

除此之外,我们还需要继承MultiDexApplication,并重写attachBaseContext方法

/**
 * 处理解决mutiDex的问题
 *
 * Created by Clock on 2015/7/23.
 */
public class BaseApplication extends MultiDexApplication{@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);//支持多dex的apk安装MultiDex.install(this);}
}

这样就可以解决问题了,不过因为Android系统的各种原因,这种方式只能够在Android4.0开始及之后的平台生效。因为在Multidex在2.x的系统上因为突然需要开辟一大块内存,所以会造成崩溃而无法使用的问题。

最后

好了,本次的笔记就到此了。记录能够帮助自己消化知识,同时也分享给其他需要的开发者。最后献上一份完整的build.gradle打包脚本,还有一张打包生成apk的整个流程图。

apply plugin: 'com.android.application'//获取生成的产品名
def getProductName() {return "clock"
}//获取打包的时间
def releaseTime() {return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}android {compileSdkVersion 21buildToolsVersion "21.1.2"packagingOptions {exclude 'META-INF/LICENSE.txt'exclude 'META-INF/NOTICE.txt'exclude 'META-INF/MANIFEST.MF'}lintOptions {//忽略一些构建信息,降低对错误的检查checkReleaseBuilds falseabortOnError false}defaultConfig {applicationId "com.clock.chatlink"minSdkVersion 9targetSdkVersion 21versionCode 1versionName "1.0"}signingConfigs {debug {}//配置签名的关键信息release {storeFilestorePasswordkeyAliaskeyPassword}}buildTypes {release {//启用混淆代码的功能minifyEnabled true//压缩对齐生成的apk包zipAlignEnabled true//指定混淆规则,需要压缩优化的混淆要把proguard-android.txt换成proguard-android.txtproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定打release包的签名signingConfig signingConfigs.release//移除无用的资源文件shrinkResources true//启用multidex的支持multiDexEnabled true}}productFlavors {wandoujia {manifestPlaceholders = [CHANNEL_VALUE: 'wandoujia' , CHANNEL_ID:200]}qihu360 {manifestPlaceholders = [CHANNEL_VALUE: '360' , CHANNEL_ID:201]}baidu {manifestPlaceholders = [CHANNEL_VALUE: 'baidu' , CHANNEL_ID:202]}}//修改生成的apk名字applicationVariants.all { variant ->variant.outputs.each { output ->def oldFile = output.outputFileif (variant.buildType.name.equals('release')) {def releaseApkName = getProductName() + "_v${defaultConfig.versionName}_${releaseTime()}_" + variant.productFlavors[0].name + '_release.apk'output.outputFile = new File(oldFile.parent, releaseApkName)}}}
}//配置打包签名
File propFile = file('signing.properties');
if (propFile.exists()) {def Properties props = new Properties()props.load(new FileInputStream(propFile))if (props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {android.signingConfigs.release.storeFile = file(props['STORE_FILE'])android.signingConfigs.release.storePassword = props['STORE_PASSWORD']android.signingConfigs.release.keyAlias = props['KEY_ALIAS']android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']} else {android.buildTypes.release.signingConfig = null}
} else {android.buildTypes.release.signingConfig = null
}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:appcompat-v7:21.0.3'compile 'com.umeng.analytics:analytics:latest.integration'//添加multidex的外部依赖jar包compile 'com.android.support:multidex:1.0.0'
}

下面给的整个打包流程图,可以让大家清晰的看到整个打包流程都做了些什么。

更多关于Gradle打包的详情,移步到官方的文档(需要翻墙)官方原文请戳这里

也可以直接在Github上看看随手记的开发者翻译出来的文档 中文译本请戳这里

Android Gradle多渠道和自动化打包(深入篇)相关推荐

  1. Android Gradle 多渠道打包、动态配置AppName

    目录 一.简介 二.Gradle多渠道打包 1.普通做法 2.Gradle多渠道打包 一.简介 因为国内Android应用分发市场的现状,我们在发布APP时,一般需要生成多个渠道包,上传到不同的应用市 ...

  2. android gradle 多渠道打包小结

    概述 多渠道对于android来说是一个比较常见的概念,举几个常见的用法: 根据不同的渠道使用不同的资源 根据不同的渠道使用不同的依赖 根据不同的渠道作不同的数据统计 根据不同的渠道,游戏app中对应 ...

  3. jenkins自动化打包android,Android使用Jenkins实现自动化打包

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android项目开发过程中,每次测试打包都会浪费较长的时间,为了能节省时间.将精力更多的放在代码编写上, 可利用Jen ...

  4. Android Gradle实现一键签名打包

    手动打包签名 Build->Generate Singned Bundle or APK->APK Next 选择你的密钥,填入key和两个密码,Next 选择Build Variants ...

  5. Android Gradle学习(一)

    文章目录 一.Gradle及Groovy简介 1.Gradle及自动化构建 (1)Gradle介绍 (2)为什么要学习Gradle (3)关于项目构建 (4)安卓自动化构建发展史 (5)Gradle提 ...

  6. 读书笔记--Android Gradle权威指南(上)

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近看了一本书<Android Gradle 权威指南>,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所 ...

  7. Android Gradle指南系列

    自己已经做了几年的Android开发,但是对gradle并不是非常熟悉,遇到了问题大都是去Google查询资料,虽然都能解决问题,但是并不能从根本上去了解本质,每次去查找都要花费不少的时间,如果开发任 ...

  8. Android Gradle 插件版本说明

    Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能.虽然 Android 插件通常会与 Andro ...

  9. Android Gradle实用技巧/如何自动为APK瘦身

    <Android Gradle 权威指南>终于发售上市了,这本书里包含了很多实用技巧.实战经验以及原理分析,今天这篇文章主要介绍下如何自动为APK瘦身的. 随着工程越来越大,功能越来越多, ...

最新文章

  1. python opencv 检测特定颜色
  2. CentOS系统bash: groupadd: command not found问题
  3. python 发邮件 timeout_python发送邮件
  4. 调试Android之system.img的来回切换。
  5. java fx listview,JavaFX 8自定义ListView单元它是邪恶的
  6. 搭载华为HiCar 新宝骏跨界融合打造智能出行生态圈
  7. 深度学习常用性能评价指标
  8. javascript中的计时器
  9. 自然语言处理入门(4)——中文分词原理及分词工具介绍
  10. 企业财务报表分析【4】
  11. window下编译ffmpeg--mys2下安装对应库编译ffmpeg
  12. 5.NDK Android jni开发 异常处理 native奔溃解决(相机图片美化)
  13. office图标不能正常显示
  14. C/C++语言100题练习计划 84——分数线划定(结构体+快排函数)
  15. 使用与破解ExcelVBA密码
  16. 要学完Java大概需要多长时间
  17. 与电容有关的几个经典电路--微分、积分、采样与电荷泵
  18. [BZOJ1616][Usaco2008 Mar]Cow Travelling游荡的奶牛(dfs||dp)
  19. HouseRobber 打家劫舍
  20. 电脑动态盘转换基本盘怎么操作?

热门文章

  1. 弘辽科技:淘宝商家如何应对宝贝隐形降权?补救四大步骤!
  2. selenium爬取煎蛋网
  3. asp版微信公众号支付(包含源代码)
  4. PHP使用copy函数复制windows文件时出现failed to open stream: Invalid argument in错误
  5. 通过NFS挂载主机硬盘给另一台主机
  6. 毛新生--Web 2.0讲解
  7. WINPE U盘版制作-老毛桃版本
  8. js逻辑运算ab 与 a||b作为返回值时的规律
  9. 输出以下图案菱形7行_西兰卡普的图案艺术特征
  10. 用Win 2003架设邮件服务器(转)