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()
                }
            }
        }
    }
}
 
相关文章
|
9月前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
252 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
10月前
|
存储 安全 小程序
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
316 32
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
|
10月前
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
811 18
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
10月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
312 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
Linux Android开发 iOS开发
使用Kivy创建“Hello World”应用并打包成APK
使用Kivy创建“Hello World”应用并打包成APK
|
Java Maven 开发者
gradle项目对比maven项目的目录架构以及对gradle wrapper的理解
gradle项目对比maven项目的目录架构以及对gradle wrapper的理解
198 0
|
Android开发 开发者
Android Split APK介绍
【2月更文挑战第5天】
|
SQL 人工智能 算法
Android性能优化之应用瘦身(APK瘦身)
Android性能优化之应用瘦身(APK瘦身)
|
XML API Android开发
android S 上 安装apk出现android.os.FileUriExposedException
android S 上 安装apk出现android.os.FileUriExposedException
422 6
|
设计模式 缓存 Java
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试

热门文章

最新文章