Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份

简介: Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
文件名:build.gradle (:app)
android {
  ...
  // 打包完成复制一份到apk文件夹内
    this.project.afterEvaluate { project ->
        project.tasks.each { task ->
            if (task.toString().contains("assemble")) {
                task.doLast {
                    android.applicationVariants.all { variant ->
                        def simpleName = "app-${variant.buildType.name}.apk"
                        // 默认生成apk的文件夹
                        def workFolder = "${project.getProjectDir().path}/build/outputs/apk/${variant.buildType.name}"
                        // 定义目标文件夹
                        def destFolder = new File("${project.getProjectDir().path}/apk/${variant.buildType.name}")
                        try {
                            if (!destFolder.exists()) {
                                destFolder.mkdir()
                            }
                            copy {
                                from "${workFolder}/${simpleName}"
                                into "${destFolder}/"
                                rename {
                                    "property_v${versionName}_${versionCode}_${variant.buildType.name}.apk"
                                }
                            }
                        } catch (Exception e) {
                            print e
                        }
                    }
                }
            }
        }
    }
}

这样在每次assembleXXXX任务的时候, 或者Build的时候, 都会在打包完成后复制一份到/app/apk/下面


通过Gradle一键打包多渠道apk至指定文件夹的方法

方法一:

   android.applicationVariants.all { variant ->
 
        // 打包完成后输出路径
        def name = "app"+
                "_" + variant.flavorName +
                "_" + variant.buildType.name +
                "_" + variant.versionName +
                "_" + new Date().format('yyyy-MM-dd') + ".apk"
 
        def path = "../../../../../apk/" //相当于路径 app/apk/
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                //指定路径输出
                output.outputFileName = new File(path, name)
            }
        }
 
    }

方法二:

android.applicationVariants.all { variant ->
 
        variant.outputs.forEach {
            it.outputFileName = "${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${new Date().format('yyyy-MM-dd')}.apk"
        }
 
        //  打包完成后复制到的目录
        def outputFileDir = "${project.projectDir.absolutePath}/apk/"
 
        // 打包完成后做的一些事,复制apk到指定文件夹
        variant.assemble.doLast {
            File out = new File(outputFileDir)
            copy {
                variant.outputs.forEach { file ->
                    //复制到指定文件夹
                    //copy {
                    //      from file.outputFile
                    //      into out
                    //}
                      //移动到指定文件夹
                      ant.move file: file.outputFile,
                        todir: "${project.rootDir}/apk"
                }
            }
        }
 
       
 }

gradle配置打包后 Copy APK到指定路径

配置文件:copy_apk.gradle

先看图:

配置位置:app的build.gradle(这里使用相对路径,copy_apk.gradle文件位于项目根目录下)

添加依赖:

apply from: "../copy_apk.gradle"

copy_apk.gradle 源码如下:

project.archivesBaseName = "XXXApp"
 
static def releaseTime() {
    return new Date().format("HHmmss")//yyyyMMdd_HHmmss
}
 
android.applicationVariants.all { variant ->
    variant.outputs.all {
        if (outputFileName.endsWith('.apk')) {
            //这里使用之前定义apk文件名称
 
//            outputFileName = "${project.archivesBaseName}_v${variant.productFlavors[0].versionName}_${variant.productFlavors[0].versionCode}_${variant.productFlavors[0].name}_${releaseTime()}_${variant.buildType.name}.apk"
            outputFileName = "${project.archivesBaseName}_${versionCode}_v${versionName}_${releaseTime()}_${name}.apk"
        }
    }
 
    //复制到根目录下的output文件夹
    File desFilePath = new File("${rootDir}/output")
    //删除output目录
    delete desFilePath
 
    //API 'variant.getAssemble()' is obsolete and has been replaced with 'variant.getAssembleProvider()'.
    //It will be removed in version 7.0 of the Android Gradle plugin.
    //编译完成后将apk复制到指定目录
//    variant.assemble.doLast {
//        variant.outputs.all {
//            try {
//                //判断文件夹是否存在
//                if (!desFilePath.exists()) {
//                    desFilePath.mkdir()
//                }
//                //将编译好的apk 复制到output目录
//                copy {
//                    from outputFile
//                    into desFilePath
//                    include '**/*.apk'
//                }
//            } catch (Exception e) {
//                e.printStackTrace()
//            }
//        }
//    }
    //used variant.getAssembleProvider().
    //(variant.assembleProvider.configure|variant.assembleProvider.get.doLast)
    //https://stackoverflow.com/questions/54193510/while-android-studio-updated-to-v3-3-getting-api-variant-getassemble-is-obso
    variant.assembleProvider.configure {
        it.doLast {
            variant.outputs.all {
                try {
                    //判断文件夹是否存在
                    if (!desFilePath.exists()) {
                        desFilePath.mkdir()
                    }
                    //将编译好的apk 复制到output目录
                    copy {
                        from outputFile
                        into desFilePath
                        include '**/*.apk'
                    }
                } catch (Exception e) {
                    e.printStackTrace()
                }
            }
        }
    }
}
 
目录
打赏
0
0
0
0
66
分享
相关文章
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
274 83
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
126 28
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
110 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
70 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
将Android应用程序打包
选中项目右击àExportàAndroidàExport Android ApplicationàNextàNextàCreate new keystore(创建新密钥)               {                      Location:表示要将打包的项目放置的位置                      Password:表示密码       
1110 0
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
259 76
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
82 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
216 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
71 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等