Gradle常用配置-版本号自增
Android Studio使用Gradle进行构建,不仅可以非常方便的管理依赖,还可以自定义一些实用的功能,例如多渠道打包,自动签名apk等。
多渠道打包
上线一款app后需要统计分析各个渠道的使用数据,这就需要对渠道进行标示,这里以友盟统计为例
在AndroidManifest中加入占位符
<meta-dataandroid:name="UMENG_CHANNEL"android:value="${UMENG_CHANNEL}"/>
在module的build.gradle中加入
android {defaultConfig {applicationId "com.linkzhang.gradlesample"minSdkVersion 15targetSdkVersion 23versionCode 1versionName "1.0"manifestPlaceholders = [UMENG_CHANNEL: "example"]//默认渠道} //自动多渠道打包productFlavors {xiaomi {}_360 {}baidu {}wandoujia {} //...添加其它渠道}productFlavors.all {flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL: name]} }
自动签名apk
使用命令行进行打包,需要读取签名配置并自动对apk进行签名
在module的根目录下新建signing.properties文件
STORE_FILE = /keystore.jks STORE_PASSWORD = 123456KEY_ALIAS = example KEY_PASSWORD = 123456
在module的build.gradle中创建
android {signingConfigs {debug {}release {storeFilestorePasswordkeyAliaskeyPassword}} }
读取配置文件
android {signingConfigs {debug {}release {storeFilestorePasswordkeyAliaskeyPassword}}getSigningProperties() }//读取签名配置文件def getSigningProperties(){ def propFile = file('signing.properties') if (propFile.canRead()){ def Properties props = new Properties()props.load(new FileInputStream(propFile)) if (props!=null && 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 {println 'signing.properties found but some entries are missing'android.buildTypes.release.signingConfig = null}}else {println 'signing.properties not found'android.buildTypes.release.signingConfig = null} }
更改release设置
android {buildTypes {release {minifyEnabled true //开启代码混淆zipAlignEnabled trueshrinkResources true // 移除无用的resource文件signingConfig signingConfigs.releaseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'} }
版本号自增
每次编译release版本时,版本号自动增加
在module的根目录下新建version.properties文件
VERSION_CODE=1
读取版本号
def getVersionCode() { def versionFile = file('version.properties') if (versionFile.canRead()){ def Properties versionProps = new Properties()versionProps.load(new FileInputStream(versionFile)) def versionCode = versionProps['VERSION_CODE'].toInteger() def runTasks = gradle.startParameter.taskNames //仅在assembleRelease任务是增加版本号if ('assembleRelease' in runTasks) {versionProps['VERSION_CODE'] = (++versionCode).toString()versionProps.store(versionFile.newWriter(), null)} return versionCode} else { throw new GradleException("Could not find version.properties!")} }
修改defaultConfig
android { def currentVersionCode = getVersionCode()defaultConfig {applicationId "com.linkzhang.gradlesample"minSdkVersion 15targetSdkVersion 23versionCode currentVersionCodeversionName "1.0"manifestPlaceholders = [UMENG_CHANNEL_VALUE: "example"]//默认渠道} }
自定义apk名称
导出的apk以app名版本号打包时间_渠道名_release.apk格式命名
获取app名称和当前时间
// 获取当前系统时间def releaseTime() { return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")) }// 获取程序名称def getProductName(){ return "gradlesample"}
替换文件名
android {buildType { release {//修改生成的apk名字,格式为 app名_版本号_打包时间_渠道名_release.apkapplicationVariants.all { variant ->variant.outputs.each { output -> def oldFile = output.outputFile if (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)}}}}}
}
代码
完整代码
不足
每次新建项目都要复制一份,准备写成Gradle插件发布到maven这样就能很方便的引用了
参考和感谢
Android Studio Gradle实践之多渠道自动化打包+版本号管理
使用 Xcode 和 Android Studio 管理 iOS 和 Android 项目版本
Android Studio系列教程六--Gradle多渠道打包
Gradle常用配置-版本号自增相关推荐
- Gradle常用配置
为什么80%的码农都做不了架构师?>>> 1.Module默认是release模式,BuildConfig.DEBUG也一直是false.如果想继承app的模式,需要在Modu ...
- 华为交换机linux版本号,Cisco和华为交换机常用配置命令总结
Cisco和华为交换机常用配置命令总结 一.调试命令 思科: Switch#show run 显示所有配置命令 Switch#show ip inter brief 显示所有接口状态 Sw ...
- 【Android Gradle 插件】PackagingOptions 配置 ④ ( pickFirsts、merges、excludes 属性配置 Set<String> 类型属性值常用配置方法 )
文章目录 一.清空 pickFirsts.merges.excludes 属性配置 二.追加 pickFirsts.merges.excludes 属性配置 三.减少 pickFirsts.merge ...
- 这一次彻底弄明白Gradle相关配置
这一次彻底弄明白Gradle相关配置 鸿洋 鸿洋 微信号 hongyangAndroid 功能介绍 你好,欢迎关注鸿洋的公众号,每天为您推送高质量文章,让你每天都能涨知识.点击历史消息,查看所有已推送 ...
- [Android Studio]报错error:failed linking references的解决方案以及有关gradle和sdk版本号的思考
最近在用android studio开发app的过程中,总是遇到类似"error:failed linking references"的报错,让人很是苦恼,心态差点被搞崩,经过上网 ...
- Android Gradle依赖配置与依赖冲突解决
#.Gradle依赖配置 ##.Gradle依赖管理与两个重要的classpath相关,每个Module都有: 1.编译时路径:compileClasspath 编译时能使用的代码,当一个类参与编译时 ...
- Android Gradle 的配置从 Groovy 迁移到 KTS
目录 #1. 引用 #2.常用术语 #3.脚本文件命名 #4.Gradle迁移示例 1.准备工作:对 Groovy 做简单转换 2. plugins 代码块迁移 3. 显式和隐式 buildTypes ...
- 【node】Sequelize常用操作、基本增删改查
[node]Sequelize常用操作.基本增删改查 sequelize初始化 先初始化一个数据库实例 再初始化一个model实例 sequelize的数据类型 基本增删改查的写法 SELECT * ...
- gradle仓库配置
Android Studio使用Gradle构建app.Gradle的使用非常灵活,其中可以设置使用多种类型的仓库,来获取应用中使用的库文件. 支持的类型有如下几种: 类型 说明 Maven cen ...
最新文章
- 百度前端技术学院Task20 笔记
- 使用Zabbix监控ZooKeeper服务的健康状态
- 为什么不从算法上优化机器的“眼睛”,而是从“大脑”入手?
- python thrift demo
- 用jquery调用wcf下的各种错误码的解释。
- java gui编程:swing创建窗体和进度条代码示例
- python的动态参数
- rstudio安装后打不开_R与RStudio最简单安装指南
- 装修要找大品牌还是游击队,还是包工头?
- 深圳很适合创业,无论小白造梦,或是落魄重生
- 编程测试,程序员过不去的坎?
- java好学吗谁学过说话,最全Java知识总结
- Linux c学习--进程基础学习
- 中国科技统计年鉴面板数据Excel格式(2009-2019年)
- 版本控制选择SVN还是Git?
- 二元二次方程例题_二元二次方程组-解法-例题
- 千锋php 靠谱吗,千锋PHP学员心得 长久的坚持不懈才能接近成功
- 基于微信小程序的游戏账号交易小程序
- R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类...
- Golang适合高并发场景的原理
热门文章
- 环路的产生及RIP防环机制
- java访问远程共享文件
- ubuntu 20 安装vnc_Windows 远程控制 Ubuntu 系统
- liteos内核驱动和linux,移植RTOS必备基础知识
- echarts tab切换_Python 数据可视化实战:使用 PyQt5 和 Echarts 打造股票数据看板
- linux io映射,【原创】Linux 文件系统移植全解密以linux-2.6.35内核源码为例说明一下IO静态映射的过程...
- python数据类型怎么定义_零基础如何学好Python 之int 数字整型类型 定义int()范围大小转换...
- java lang保_java.lang.Object的受保护方法如何保护子类?
- php str_replace多个参数,php str_replace()函数的用法,有那些参数?
- android dts配置_AndroidLinux关于DTS设备树源码的介绍