修改Android打包apk的名字和目录

app打包生成apk后通常需要进行备份,但是要区分好哪个apk是什么版本的、什么时候打包的,以方便以后区分使用。

最开始的想法是把版本号、创建时间这些加在apk文件名上即可,但是公司要求apk使用一个固定的名称,那我怎么保存版本号信息啊,后来想到可以加一个文件夹,在文件夹名字上加入这些信息即可,示例如一:

app/build.gradle

import java.text.SimpleDateFormat

android {
	//release版本输出位置与文件名配置
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            if (buildType.name == 'release') { //只处理生产版本
                def createTime = new Date().format("yyyy-MM-dd-kkmmss", TimeZone.getTimeZone("GMT+08:00"))
                def dirName = "ball_v${defaultConfig.versionName}_${defaultConfig.versionCode}_$createTime"
                def apkDir = rootProject.file("apk/$dirName")
                if (!apkDir.exists()) {
                    apkDir.mkdirs()
                }
                variant.packageApplicationProvider.get().outputDirectory = apkDir  // 指定apk的输出位置
                output.outputFileName = "Railway_4G_Platform_ball.apk"             // 指定输出文件名
            }
        }
    }
}

这里省略了很多其它的信息,只贴关键代码,导包是要放在文件的最前面,关键代码要是写在android节点下的。

上面是以前的写法了,现在(今天是2024年03月07日)最新版本Android Studio已经使用了更新的Gradle,而且新创建的项目也默认使用Kotlin作为gradle的脚本语言了,那肯定是要追随官方的脚步啊,于是想把上面的配置翻译成Kotlin的版本,即可发现已经用不了,新版本的Gradle已经不允许那种方式来修改apk的名称了,于是又找了新的方式,感觉新的方式还更专业一些,如下:

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

android {    
    afterEvaluate {
        tasks.named("assembleRelease") {
            finalizedBy("copyAndRenameApkTask")
        }
    }
}

val copyAndRenameApkTask by tasks.registering(Copy::class) {
    val config = project.android.defaultConfig
    val versionName = config.versionName
    val versionCode = config.versionCode
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss")
    val createTime = LocalDateTime.now().format(formatter)
    val destDir = File(rootDir, "apkBackup/big_data_v${versionName}_${versionCode}_$createTime")
    from("build/outputs/apk/release/app-release.apk")
    into(destDir)
    rename { _ -> "Railway_4G_Platform_big_data.apk" }
}

与前面的修改方式对比:

  • 前面的是直接修改了打包apk的位置和apk的文件名。用的是groovy语言。
  • 后面的是打包后apk后复制该apk到指定的位置并进行重命名。用的是kotlin语言,平时写代码也是用Kotlin了,所以使用kotlin还是感觉比较亲切的。

打包两个版本的apk看一效果:
在这里插入图片描述
这样,我就完成了以公司要求的名字去命名apk,同时我使用文件夹名称来保留了apk的版本信息。

我们公司的apk在上传到公司服务器时,除了上传apk外,还需要填写apk的相关信息,比如包名、版本号这些,同时也允许通过上传一个配置文件来指定这些信息,像这样每次打包每次要修改这些信息也是挺烦人的,都说Gradle可以完成自动化的事情,于是让Gradle帮我生成一个不就行了吗,实现这个很简单,在之前的复制重命名的任务中添加生成配置文件的代码即可,如下:

val copyAndRenameApkTask by tasks.registering(Copy::class) {
    val config = project.android.defaultConfig
    val versionName = config.versionName
    val versionCode = config.versionCode
    val applicationId = config.applicationId
    val timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss")
    val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss")
    val now = LocalDateTime.now()
	val createTime = now.format(timeFormatter)
	val createDate = now.format(dateFormatter)
    val destDir = File(rootDir, "apkBackup/big_data_v${versionName}_${versionCode}_$createTime")
    from("build/outputs/apk/release/app-release.apk")
    into(destDir)
    rename { _ -> "Railway_4G_Platform_big_data.apk" }
    doLast {
        File(destDir, "app上传配置.txt").outputStream().bufferedWriter().use {
            it
                .appendLine("版本号:${versionCode}")
                .appendLine("版本名称:${versionName}")
                .appendLine("软件名称:掌上运维")
                .appendLine("软件包名:${applicationId}")
                .appendLine("版本说明:说明")
                .appendLine("发布时间:${createDate}")
                .appendLine("发布状态:1")
                .appendLine("更新类型:0")    // 0-询问更新,1-强制更新到此版本
                .appendLine("强制更新标记:0") // 0-此版本无需强制更新,1-此版本不能使用,必须更新(此参数始终传0)
                .appendLine("软件分类:1")
                .appendLine("业务分类:1")
                .appendLine("软件级别:1")
                .append("备注:")
        }
    }
}

效果如下:
在这里插入图片描述
app上传配置.txt内容如下:

版本号:20240307
版本名称:1.0.0
软件名称:掌上运维
软件包名:cn.dazhou.bluebook
版本说明:说明
发布时间:2024-03-07-154401
发布状态:1
更新类型:0
强制更新标记:0
软件分类:1
业务分类:1
软件级别:1
备注:

另外,还可以把git的提交记录添加到文件夹中,以便可以清楚的知道打包的时候git的当时提交版本是什么,所以,在打包的时候一定要先把所有代码提交了再打包,核心代码如下:

import java.io.ByteArrayOutputStream

fun exec(command: String): String {
    val outputStream = ByteArrayOutputStream()
    val process = Runtime.getRuntime().exec(command)
    process.inputStream.copyTo(outputStream)
    return outputStream.toString().trim()
}

val copyAndRenameApkTask by tasks.registering(Copy::class) {
    。。。
    val gitHash = exec("git rev-parse --short HEAD")
    val destDir = File(rootDir, "apkBackup/big_data_v${versionName}_${versionCode}_${createTime}_$gitHash")
    。。。
}

另外,由groovy转到kotlin带来的一些改变这里也一并记录一下:

签名配置:

android {
	signingConfigs {
        create("release") {
            storeFile = file("123456.jks")
            storePassword = "123456"
            keyAlias = "key0"
            keyPassword = "123456"
        }
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
            signingConfig = signingConfigs.getByName("release")
        }
    }
}

在libs目录中添加jar或aar时的配置:

implementation(fileTree(mapOf("include" to arrayOf("*.jar", "*.aar"), "dir" to "libs")))

对比原来Groovy的配置:

implementation(fileTree(includes: ["*.jar", "*.aar"], dir: "libs"))

仓库设置:

maven {
    isAllowInsecureProtocol = true // 仓库默认不允许使用非https协议,所以这里设置为允许
    url = uri("http://192.168.1.251:8081/content/repositories/android_repositories/")
}
maven { url = uri("https://jitpack.io") }

对比原来Groovy的配置:

 maven {
     allowInsecureProtocol = true // 仓库默认不允许使用非https协议,所以这里设置为允许
     url 'http://192.168.1.251:8081/content/repositories/android_reposito
 }
 maven { url 'https://jitpack.io' } // 用于:RxPermissions

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/448068.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL学习——19.模板测试

前情提要:本文代码源自Github上的学习文档“LearnOpenGL”,我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动,一切著作权归原作者所有,本文仅供学习交流,如有侵权,请联系我删除。L…

Vue+OpenLayers7入门到实战:OpenLayers鼠标移动事件使用,实现鼠标移动到点位上方后高亮显示点位要素

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上监听鼠标移动事件,并简单实现鼠标移动到点位上方后高亮显示点位要素的功能,带领大家快速上手OpenLayers鼠标移动事件的应用。 二、依赖和使用 "ol": &quo…

趣味看图-Linux 文件系统的组成

/(根目录):根目录是Linux文件系统中的顶级目录。所有其他目录都是根目录的子目录,使其成为整个文件系统的父目录。 /bin:包含启动系统和执行基本操作所需的基本二进制可执行文件。这些对所有用户都可用。 /boot&…

利用yaml文件部署NacosXxl-job到阿里云的ACK

背景介绍 随着容器化的技术成熟落地,拥抱各种成熟的容器化集群平台是加速我们落地的必然之路,目前国内以阿里云、华为云、腾讯云为平台的供应商为主,国外则以AWS,Azure为主,让我们借助平台已有的优势进行快速落地提高…

G-LAB郭主任公开课:Docker容器,3月18日开课!

带你一起走进Linux的世界! 【G-LAB】 Linux最新技术—Docker容器 免费公开课即将开讲! 不容错过! 公开课课程为期两天,3月18日&3月19日晚20:00 分享主题: —3月18日 Docker概念、安装、架…

MySQL-QA-异常问题及解决方案(持续更新)

MySQL-Q&A(持续更新) 1.1 PID文件找不到 问题描述 错误详情: ERROR!The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid) 解决方案 首先排查配置文件,一般路径为:/etc/my.cnf 检查…

centos安装hadoop启动问题解决方案

1、出现了问题localhost: ERROR: JAVA_HOME is not set and could not be found. *解决方案尝试: 修改hadoop-env.sh(在etc/hadoop) sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh 将原本的JAVA_HOME 替换为绝对路径就可以了 #expo…

RK3588-hdmiin

1. HDMI-IN简介 HDMI IN功能可以通过桥接芯⽚的⽅式实现,将HDMI信号转换成MIPI信号接收RK3588芯⽚平台⾃带HDMI RX模块,可以直接接收HDMI信号,无需通过桥接芯⽚实现。在ArmSoM系列产品中,ArmSoM-W3支持HDMI-IN功能HDMI-IN功能框图…

3.10复试专业课日报【周末总结】

数据结构 考点一,考点二 操作系统 计算机网络 组成原理 1.什么是中断向量 2. 数据库 选择题80-100 1.数据库的逻辑模型(数据模型) 2.DCL,DML,DQL,DDL 3.数据库特点 算法 1.复习 对称二叉树,二叉树最大深度 2.只出现一…

Mybatis-plus学习之Lombok

何为Lombok Lombok 是一个 Java 库,旨在通过自动生成样板代码来简化 Java 类的编写。它通过使用注解来减少冗长和重复的代码,提高代码的可读性和开发效率。 优点与优势 使用 Lombok,你可以在 Java 类中添加各种注解,从而自动为…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《含海上风电制氢的综合能源系统分布鲁棒低碳优化运行》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Navicat连接数据库出现的问题(3.8)

Navicat使用教程——连接/新建数据库、SQL实现表的创建/数据插入、解决报错【2059-authentication plugin‘caching_sha2_password’……】_2059authentication plugin-CSDN博客

NTC 测试温度

NTC 测温应用电路汇总及温度读取软件设计 - 知乎 1.开尔文273.5就是0摄氏度 2.B一般厂家都会给 3.上面公式大概准 4.计算还是查表法,段与段之间近似直线

Net8 ABP VNext集成FreeSql、SqlSugar

ABP可以快速搭建开发架构,但是内置的是EFCore,国内中小企业使用FreeSql与SqlSugar还是较多,为新手提供使用提供参考 ABP、FreeSql、SqlSugar参考地址: ABP Framework | Open source web application framework for ASP.NET Core…

在win7中快速安装vue2

首先要求我们安装node.js 如果没有安装可以点击跳转 安装node 1.配置环境变量 其实安装完node,就自动在path里增加环境变量,但是为了以后的本地部署项目,我们需要找到node.js的安装根目录 1.1在当中新建"node_cache"缓存和&qu…

两会声音|中国石化人大代表:要突出战略性新兴产业、未来产业的位置

十四届全国人大二次会议即将闭幕,“新质生产力”首次写入政府工作报告,并出现在了重要位置。政府工作报告主要从推动产业链供应链优化升级、积极培育新兴产业和未来产业、深入推进数字经济创新发展等三个方面进行了阐述和规划。 全国两会期间&#xff0c…

使用Vite构建Vue3+TypeScript项目

1,新建项目前,确保电脑 已经安装Node.js,pnpm 在本地新建一个文件夹 ,在文件路径输入cmd 如下展示 2,执行如下指令搭建项目 filename,即搭建的项目名称。 pnpm create vitelatest filename 输入指令按回车之后如下…

29个社媒营销经典案例!外贸人速来学习!

今天给大家分享一些比较经典的外贸社媒营销案例,希望对大家有帮助! 01 创建重复的内容系列 如果你每天都在为决定要在社交媒体上发布什么内容而焦头烂额,那就创建一些你擅长的重复内容系列和主题。 例如,有人经常分享鼓舞人心的…

EDM营销怎么做才能提高转化率?怎么策划?

EDM营销怎么做才能达到最大效果?如何成功制定EDM营销策略? EDM营销仍然是企业营销策略中不可或缺的一环。然而,仅仅发送电子邮件并不足以保证高转化率,EDM营销怎么做才能真正达到预期效果呢?接下来,AokSen…