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

打印 上一主题 下一主题

主题 648|帖子 648|积分 1944

关键字

gradle配置变化、gradle kotlin版本、gradle新配置方式、签名、打包签名、仓库配置、仓库设置
定制apk位置的变化

app打包生成apk后通常必要进行备份,但是要区分好哪个apk是什么版本的、什么时候打包的,以方便以后区分使用。
最开始的想法是把版本号、创建时间这些加在apk文件名上即可,但是公司要求apk使用一个固定的名称,那我怎么保存版本号信息啊,后来想到可以加一个文件夹,在文件夹名字上参加这些信息即可,示比方一:
app/build.gradle:
  1. import java.text.SimpleDateFormat
  2. android {
  3.         //release版本输出位置与文件名配置
  4.     applicationVariants.all { variant ->
  5.         variant.outputs.all { output ->
  6.             if (buildType.name == 'release') { //只处理生产版本
  7.                 def createTime = new Date().format("yyyy-MM-dd-kkmmss", TimeZone.getTimeZone("GMT+08:00"))
  8.                 def dirName = "ball_v${defaultConfig.versionName}_${defaultConfig.versionCode}_$createTime"
  9.                 def apkDir = rootProject.file("apk/$dirName")
  10.                 if (!apkDir.exists()) {
  11.                     apkDir.mkdirs()
  12.                 }
  13.                 variant.packageApplicationProvider.get().outputDirectory = apkDir  // 指定apk的输出位置
  14.                 output.outputFileName = "Railway_4G_Platform_ball.apk"             // 指定输出文件名
  15.             }
  16.         }
  17.     }
  18. }
复制代码
这里省略了许多别的的信息,只贴关键代码,导包是要放在文件的最前面,关键代码要是写在android节点下的。
上面是以前的写法了,现在(今天是2024年03月07日)最新版本Android Studio已经使用了更新的Gradle,而且新创建的项目也默认使用Kotlin作为gradle的脚本语言了,那肯定是要跟随官方的脚步啊,于是想把上面的配置翻译成Kotlin的版本,即可发现已经用不了,新版本的Gradle已经不允许那种方式来修改apk的名称了,于是又找了新的方式,感觉新的方式还更专业一些,如下:
  1. import java.time.LocalDateTime
  2. import java.time.format.DateTimeFormatter
  3. android {   
  4.     afterEvaluate {
  5.         tasks.named("assembleRelease") {
  6.             finalizedBy("copyAndRenameApkTask")
  7.         }
  8.     }
  9. }
  10. val copyAndRenameApkTask by tasks.registering(Copy::class) {
  11.     val config = project.android.defaultConfig
  12.     val versionName = config.versionName
  13.     val versionCode = config.versionCode
  14.     val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss")
  15.     val createTime = LocalDateTime.now().format(formatter)
  16.     val destDir = File(rootDir, "apkBackup/big_data_v${versionName}_${versionCode}_$createTime")
  17.     from("build/outputs/apk/release/app-release.apk")
  18.     into(destDir)
  19.     rename { _ -> "Railway_4G_Platform_big_data.apk" }
  20. }
复制代码
与前面的修改方式对比:


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

如许,我就完成了以公司要求的名字去定名apk,同时我使用文件夹名称来保留了apk的版本信息。
我们公司的apk在上传到公司服务器时,除了上传apk外,还必要填写apk的相关信息,好比包名、版本号这些,同时也允许通过上传一个配置文件来指定这些信息,像如许每次打包每次要修改这些信息也是挺烦人的,都说Gradle可以完成主动化的事情,于是让Gradle帮我生成一个不就行了吗,实现这个很简朴,在之前的复制重定名的任务中添加生成配置文件的代码即可,如下:
  1. val copyAndRenameApkTask by tasks.registering(Copy::class) {
  2.     val config = project.android.defaultConfig
  3.     val versionName = config.versionName
  4.     val versionCode = config.versionCode
  5.     val applicationId = config.applicationId
  6.     val timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss")
  7.     val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss")
  8.     val now = LocalDateTime.now()
  9.         val createTime = now.format(timeFormatter)
  10.         val createDate = now.format(dateFormatter)
  11.     val destDir = File(rootDir, "apkBackup/big_data_v${versionName}_${versionCode}_$createTime")
  12.     from("build/outputs/apk/release/app-release.apk")
  13.     into(destDir)
  14.     rename { _ -> "Railway_4G_Platform_big_data.apk" }
  15.     doLast {
  16.         File(destDir, "app上传配置.txt").outputStream().bufferedWriter().use {
  17.             it
  18.                 .appendLine("版本号:${versionCode}")
  19.                 .appendLine("版本名称:${versionName}")
  20.                 .appendLine("软件名称:掌上运维")
  21.                 .appendLine("软件包名:${applicationId}")
  22.                 .appendLine("版本说明:说明")
  23.                 .appendLine("发布时间:${createDate}")
  24.                 .appendLine("发布状态:1")
  25.                 .appendLine("更新类型:0")    // 0-询问更新,1-强制更新到此版本
  26.                 .appendLine("强制更新标记:0") // 0-此版本无需强制更新,1-此版本不能使用,必须更新(此参数始终传0)
  27.                 .appendLine("软件分类:1")
  28.                 .appendLine("业务分类:1")
  29.                 .appendLine("软件级别:1")
  30.                 .append("备注:")
  31.         }
  32.     }
  33. }
复制代码
效果如下:

app上传配置.txt内容如下:
  1. 版本号:20240307
  2. 版本名称:1.0.0
  3. 软件名称:掌上运维
  4. 软件包名:cn.dazhou.bluebook
  5. 版本说明:说明
  6. 发布时间:2024-03-07-154401
  7. 发布状态:1
  8. 更新类型:0
  9. 强制更新标记:0
  10. 软件分类:1
  11. 业务分类:1
  12. 软件级别:1
  13. 备注:
复制代码
另外,还可以把git的提交记录添加到文件夹中,以便可以清晰的知道打包的时候git的当时提交版本是什么,所以,在打包的时候肯定要先把全部代码提交了再打包,核心代码如下:
  1. import java.io.ByteArrayOutputStream
  2. fun exec(command: String): String {
  3.     val outputStream = ByteArrayOutputStream()
  4.     val process = Runtime.getRuntime().exec(command)
  5.     process.inputStream.copyTo(outputStream)
  6.     return outputStream.toString().trim()
  7. }
  8. val copyAndRenameApkTask by tasks.registering(Copy::class) {
  9.     。。。
  10.     val gitHash = exec("git rev-parse --short HEAD")
  11.     val destDir = File(rootDir, "apkBackup/big_data_v${versionName}_${versionCode}_${createTime}_$gitHash")
  12.     。。。
  13. }
复制代码
签名配置的变化

Kotlin版本:
  1. android {
  2.         signingConfigs {
  3.                 getByName("debug") {
  4.             storeFile = file("123456.jks")
  5.             storePassword = "123456"
  6.             keyAlias = "key0"
  7.             keyPassword = "123456"
  8.         }
  9.         create("release") {
  10.             storeFile = file("123456.jks")
  11.             storePassword = "123456"
  12.             keyAlias = "key0"
  13.             keyPassword = "123456"
  14.         }
  15.     }
  16.     buildTypes {
  17.             debug {
  18.             isMinifyEnabled = false
  19.             proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
  20.             signingConfig = signingConfigs.getByName("debug")
  21.         }
  22.         release {
  23.             isMinifyEnabled = false
  24.             proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
  25.             signingConfig = signingConfigs.getByName("release")
  26.         }
  27.     }
  28. }
复制代码
留意:这里signingConfigs中debug的配置要使用getByName,不能使用create,因为debug这个配置是默认就会创建的,如果你再创建就提示已经存在,所以只能用getByName。对比一下groovy语法旧的签名方式:
  1. signingConfigs {
  2.     config {
  3.         keyAlias 'key0'
  4.         keyPassword '123456'
  5.         storeFile file('123456.jks')
  6.         storePassword '123456'
  7.     }
  8. }
  9. buildTypes {
  10.     debug {
  11.         signingConfig signingConfigs.config
  12.         minifyEnabled false
  13.         proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  14.     }
  15.     release {
  16.         signingConfig signingConfigs.config
  17.         minifyEnabled false
  18.         proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  19.     }
  20. }
复制代码
如上代码,signingConfigs中我们创建了一个名为 “config”的签名配置,这个名字是可以任意取的,而且这个配置可以同时给debug的构建类型使用,也可以给release的构建类型使用。同理,在Kotlin的版本中,signingConfigs中的create()中的名字也可以随意取,同一个签名配置也可以同时给debug和release使用。
aar或jar包依赖的变化

在libs目录中添加jar或aar时的配置:
  1. implementation(fileTree(mapOf("include" to arrayOf("*.jar", "*.aar"), "dir" to "libs")))
复制代码
对比原来Groovy的配置:
  1. implementation(fileTree(includes: ["*.jar", "*.aar"], dir: "libs"))
复制代码
仓库设置的变化

  1. maven {
  2.     isAllowInsecureProtocol = true // 仓库默认不允许使用非https协议,所以这里设置为允许
  3.     url = uri("http://192.168.1.251:8081/content/repositories/android_repositories/")
  4. }
  5. maven { url = uri("https://jitpack.io") }
复制代码
对比原来Groovy的配置:
  1. maven {
  2.      allowInsecureProtocol = true // 仓库默认不允许使用非https协议,所以这里设置为允许
  3.      url 'http://192.168.1.251:8081/content/repositories/android_repositories/'
  4. }
  5. maven { url 'https://jitpack.io' } // 用于:RxPermissions
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表