Android Gradle多渠道和自动化打包(深入篇)
记录一下多渠道自动化打包的另外一些配置操作,主要分为以下5个方面
1.一个渠道多个信息
2.打包签名配置
3.修改生成apk包名
4.设置编译时的渠道信息
5.其他
添加多个渠道信息
<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号了。如果想要验证结果的话,还是可以去反编译查看一下。
打包签名配置
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包名
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里面打开。
其他
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多渠道和自动化打包(深入篇)相关推荐
- Android Gradle 多渠道打包、动态配置AppName
目录 一.简介 二.Gradle多渠道打包 1.普通做法 2.Gradle多渠道打包 一.简介 因为国内Android应用分发市场的现状,我们在发布APP时,一般需要生成多个渠道包,上传到不同的应用市 ...
- android gradle 多渠道打包小结
概述 多渠道对于android来说是一个比较常见的概念,举几个常见的用法: 根据不同的渠道使用不同的资源 根据不同的渠道使用不同的依赖 根据不同的渠道作不同的数据统计 根据不同的渠道,游戏app中对应 ...
- jenkins自动化打包android,Android使用Jenkins实现自动化打包
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android项目开发过程中,每次测试打包都会浪费较长的时间,为了能节省时间.将精力更多的放在代码编写上, 可利用Jen ...
- Android Gradle实现一键签名打包
手动打包签名 Build->Generate Singned Bundle or APK->APK Next 选择你的密钥,填入key和两个密码,Next 选择Build Variants ...
- Android Gradle学习(一)
文章目录 一.Gradle及Groovy简介 1.Gradle及自动化构建 (1)Gradle介绍 (2)为什么要学习Gradle (3)关于项目构建 (4)安卓自动化构建发展史 (5)Gradle提 ...
- 读书笔记--Android Gradle权威指南(上)
本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近看了一本书<Android Gradle 权威指南>,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所 ...
- Android Gradle指南系列
自己已经做了几年的Android开发,但是对gradle并不是非常熟悉,遇到了问题大都是去Google查询资料,虽然都能解决问题,但是并不能从根本上去了解本质,每次去查找都要花费不少的时间,如果开发任 ...
- Android Gradle 插件版本说明
Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能.虽然 Android 插件通常会与 Andro ...
- Android Gradle实用技巧/如何自动为APK瘦身
<Android Gradle 权威指南>终于发售上市了,这本书里包含了很多实用技巧.实战经验以及原理分析,今天这篇文章主要介绍下如何自动为APK瘦身的. 随着工程越来越大,功能越来越多, ...
最新文章
- python opencv 检测特定颜色
- CentOS系统bash: groupadd: command not found问题
- python 发邮件 timeout_python发送邮件
- 调试Android之system.img的来回切换。
- java fx listview,JavaFX 8自定义ListView单元它是邪恶的
- 搭载华为HiCar 新宝骏跨界融合打造智能出行生态圈
- 深度学习常用性能评价指标
- javascript中的计时器
- 自然语言处理入门(4)——中文分词原理及分词工具介绍
- 企业财务报表分析【4】
- window下编译ffmpeg--mys2下安装对应库编译ffmpeg
- 5.NDK Android jni开发 异常处理 native奔溃解决(相机图片美化)
- office图标不能正常显示
- C/C++语言100题练习计划 84——分数线划定(结构体+快排函数)
- 使用与破解ExcelVBA密码
- 要学完Java大概需要多长时间
- 与电容有关的几个经典电路--微分、积分、采样与电荷泵
- [BZOJ1616][Usaco2008 Mar]Cow Travelling游荡的奶牛(dfs||dp)
- HouseRobber 打家劫舍
- 电脑动态盘转换基本盘怎么操作?