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多渠道打包

本文转自ljianbing51CTO博客,原文链接: ,http://blog.51cto.com/ljianbing/1744928如需转载请自行联系原作者

Gradle常用配置-版本号自增相关推荐

  1. Gradle常用配置

    为什么80%的码农都做不了架构师?>>>    1.Module默认是release模式,BuildConfig.DEBUG也一直是false.如果想继承app的模式,需要在Modu ...

  2. 华为交换机linux版本号,Cisco和华为交换机常用配置命令总结

    Cisco和华为交换机常用配置命令总结 一.调试命令 思科: Switch#show  run  显示所有配置命令 Switch#show  ip  inter  brief  显示所有接口状态 Sw ...

  3. 【Android Gradle 插件】PackagingOptions 配置 ④ ( pickFirsts、merges、excludes 属性配置 Set<String> 类型属性值常用配置方法 )

    文章目录 一.清空 pickFirsts.merges.excludes 属性配置 二.追加 pickFirsts.merges.excludes 属性配置 三.减少 pickFirsts.merge ...

  4. 这一次彻底弄明白Gradle相关配置

    这一次彻底弄明白Gradle相关配置 鸿洋 鸿洋 微信号 hongyangAndroid 功能介绍 你好,欢迎关注鸿洋的公众号,每天为您推送高质量文章,让你每天都能涨知识.点击历史消息,查看所有已推送 ...

  5. [Android Studio]报错error:failed linking references的解决方案以及有关gradle和sdk版本号的思考

    最近在用android studio开发app的过程中,总是遇到类似"error:failed linking references"的报错,让人很是苦恼,心态差点被搞崩,经过上网 ...

  6. Android Gradle依赖配置与依赖冲突解决

    #.Gradle依赖配置 ##.Gradle依赖管理与两个重要的classpath相关,每个Module都有: 1.编译时路径:compileClasspath 编译时能使用的代码,当一个类参与编译时 ...

  7. Android Gradle 的配置从 Groovy 迁移到 KTS

    目录 #1. 引用 #2.常用术语 #3.脚本文件命名 #4.Gradle迁移示例 1.准备工作:对 Groovy 做简单转换 2. plugins 代码块迁移 3. 显式和隐式 buildTypes ...

  8. 【node】Sequelize常用操作、基本增删改查

    [node]Sequelize常用操作.基本增删改查 sequelize初始化 先初始化一个数据库实例 再初始化一个model实例 sequelize的数据类型 基本增删改查的写法 SELECT * ...

  9. gradle仓库配置

    Android Studio使用Gradle构建app.Gradle的使用非常灵活,其中可以设置使用多种类型的仓库,来获取应用中使用的库文件.  支持的类型有如下几种: 类型 说明 Maven cen ...

最新文章

  1. 百度前端技术学院Task20 笔记
  2. 使用Zabbix监控ZooKeeper服务的健康状态
  3. 为什么不从算法上优化机器的“眼睛”,而是从“大脑”入手?
  4. python thrift demo
  5. 用jquery调用wcf下的各种错误码的解释。
  6. java gui编程:swing创建窗体和进度条代码示例
  7. python的动态参数
  8. rstudio安装后打不开_R与RStudio最简单安装指南
  9. 装修要找大品牌还是游击队,还是包工头?
  10. 深圳很适合创业,无论小白造梦,或是落魄重生
  11. 编程测试,程序员过不去的坎?
  12. java好学吗谁学过说话,最全Java知识总结
  13. Linux c学习--进程基础学习
  14. 中国科技统计年鉴面板数据Excel格式(2009-2019年)
  15. 版本控制选择SVN还是Git?
  16. 二元二次方程例题_二元二次方程组-解法-例题
  17. 千锋php 靠谱吗,千锋PHP学员心得 长久的坚持不懈才能接近成功
  18. 基于微信小程序的游戏账号交易小程序
  19. R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类...
  20. Golang适合高并发场景的原理

热门文章

  1. 环路的产生及RIP防环机制
  2. java访问远程共享文件
  3. ubuntu 20 安装vnc_Windows 远程控制 Ubuntu 系统
  4. liteos内核驱动和linux,移植RTOS必备基础知识
  5. echarts tab切换_Python 数据可视化实战:使用 PyQt5 和 Echarts 打造股票数据看板
  6. linux io映射,【原创】Linux 文件系统移植全解密以linux-2.6.35内核源码为例说明一下IO静态映射的过程...
  7. python数据类型怎么定义_零基础如何学好Python 之int 数字整型类型 定义int()范围大小转换...
  8. java lang保_java.lang.Object的受保护方法如何保护子类?
  9. php str_replace多个参数,php str_replace()函数的用法,有那些参数?
  10. android dts配置_AndroidLinux关于DTS设备树源码的介绍