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

2024-06-04 7434阅读

关键字

gradle配置变化、gradle kotlin版本、gradle新配置方式、签名、打包签名、仓库配置、仓库设置

定制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看一效果:

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

    这样,我就完成了以公司要求的名字去命名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("备注:")
            }
        }
    }
    

    效果如下:

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

    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")
        。。。
    }
    

    签名配置的变化

    Kotlin版本:

    android {
    	signingConfigs {
    		getByName("debug") {
                storeFile = file("123456.jks")
                storePassword = "123456"
                keyAlias = "key0"
                keyPassword = "123456"
            }
            create("release") {
                storeFile = file("123456.jks")
                storePassword = "123456"
                keyAlias = "key0"
                keyPassword = "123456"
            }
        }
        buildTypes {
        	debug {
                isMinifyEnabled = false
                proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
                signingConfig = signingConfigs.getByName("debug")
            }
            release {
                isMinifyEnabled = false
                proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
                signingConfig = signingConfigs.getByName("release")
            }
        }
    }
    

    注意:这里signingConfigs中debug的配置要使用getByName,不能使用create,因为debug这个配置是默认就会创建的,如果你再创建就提示已经存在,所以只能用getByName。对比一下groovy语法旧的签名方式:

    signingConfigs {
        config {
            keyAlias 'key0'
            keyPassword '123456'
            storeFile file('123456.jks')
            storePassword '123456'
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.config
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            signingConfig signingConfigs.config
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    

    如上代码,signingConfigs中我们创建了一个名为 “config”的签名配置,这个名字是可以随便取的,而且这个配置可以同时给debug的构建类型使用,也可以给release的构建类型使用。同理,在Kotlin的版本中,signingConfigs中的create()中的名字也可以随意取,同一个签名配置也可以同时给debug和release使用。

    aar或jar包依赖的变化

    在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_repositories/'
     }
     maven { url 'https://jitpack.io' } // 用于:RxPermissions
    

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]