当前位置: 首页 > news >正文

android自定义Apk名称和指定生成的路径

一、写在前面

1.1、生成apk自定义路径

AS开发工具打包时默认是生成到项目App模块里面的build文件夹下,但是我们在服务端维护(托管)项目代码的时候,通常会过滤掉build文件夹,这样的话就有个问题,我们没法在服务端托管生成的apk文件,apk在版本备份的时候如果能跟代码一起打入tag,能帮助我们后期根据应用版本快速找到当时打的apk包。
所以我们在生成生产版本的Apk时,指定生成的路径就派上用场了。

1.2、自定义Apk名称

详细的apk名称可以帮助我们快速定位某个版本的apk在打包时是如何选择变体等信息的,所以我们可以把觉得有用的信息在打包的时候就自动添加到生成的Apk名称中。

二、Sample

android {
    //...
    defaultConfig {
        applicationId "com.yann02.sample"
        versionCode 10001
        versionName "V1.0.1"
        //...
    }
    productFlavors {
        free {
            dimension "role"
            //...
        }
        vip {
            dimension "role"
            //...
        }
        //...
    }
    //...
    android.applicationVariants.all { variant ->
        def createTime = new Date().format("YYYY-MM-dd_HH.mm")
        if (variant.buildType.name == "release") {
            //  将release版本放到项目的apks文件夹下,其它编译类型使用默认生成路径即可
            variant.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/apks/${variant.buildType.name}/${createTime}")
        }
        variant.outputs.all {
            if (variant.buildType.name == "release") {
                outputFileName = "${defaultConfig.applicationId}_${variant.flavorName}_${variant.buildType.name}_${defaultConfig.versionName}_${defaultConfig.versionCode}_${createTime}.apk"
            }
        }
    }
    //...
}

三、分析上面的Sample

上面的样例设置了只对release编译类型的生成包做处理,包括常用的如何获取应用打包时生成Apk名字常用到的关键字段信息
获取应用包名:defaultConfig.applicationId
获取应用版本名称:有两种方式

  • defaultConfig.versionName
  • variant.versionName

获取应用版本号:有两种方式

  • defaultConfig.versionCode
  • variant.versionCode

获取应用变体:有两种方式

  • variant.flavorName
  • variant.productFlavors[0].name

获取编译类型:variant.buildType.name
使用时间:可根据个人需要设置格式,我这里精确到了时分,不含秒

  • new Date().format("YYYY-MM-dd_HH.mm")

Noteworthy:我这里用到了自定义生成apk的路径,每个路径下只能生成一个apk包,打包时系统会替换掉旧的apk包。
我这里用时间来生成路径,以保留历史安装包。可酌情使用,非必要。

 四、相关的文章

这里记一个相关的安卓官方的关于配置应用打包时根据不同配置参数构建多个不同apk配置的文章构建多个APK

相关文章:

  • java框架----SSM快速整合教程
  • mongodb基本操作及使用
  • jQuery中的函数
  • leetcode:188. 买卖股票的最佳时机IV
  • 电脑技巧:Win7、Win10、Win11如何选择,看完你就懂了
  • 【初阶数据结构】堆排序和TopK问题
  • 筑梦远航 势不可挡|和数研究院四周岁啦
  • 广东2022年上半年系统集成项目管理工程师下午真题及答案解析
  • 【论文解读系列】NER方向:LatticeLSTM (ACL2018)
  • java毕业设计成品源码网站基于JSP的网上订餐管理系统|餐饮就餐订餐餐厅
  • Jenkins更新版本和插件导致maven工程job丢失(不显示)或部分功能丧失(svn,ssh)
  • 计算机网络——传输层の选择题整理
  • 多级缓存的原理和实现
  • hadoop学习使用
  • 【WSL2】CENTOS7 安装与配置
  • 《Java编程思想》读书笔记-对象导论
  • canvas 五子棋游戏
  • JavaScript 一些 DOM 的知识点
  • Laravel核心解读--Facades
  • Linux Process Manage
  • PV统计优化设计
  • Python 反序列化安全问题(二)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 分享一份非常强势的Android面试题
  • 简单基于spring的redis配置(单机和集群模式)
  • 全栈开发——Linux
  • 深入浅出Node.js
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微信小程序开发问题汇总
  • 写代码的正确姿势
  • 新书推荐|Windows黑客编程技术详解
  • 一天一个设计模式之JS实现——适配器模式
  • #define、const、typedef的差别
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (二)学习JVM —— 垃圾回收机制
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)平衡树
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)四层和七层负载均衡的区别
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .libPaths()设置包加载目录
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net FrameWork简介,数组,枚举
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .Net 高效开发之不可错过的实用工具
  • .NET4.0并行计算技术基础(1)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装