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()
                }
            }
        }
    }
}
 
相关文章
|
2月前
|
Android开发
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
|
2月前
|
Android开发
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
|
2月前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
90 0
玩转安卓之配置gradle-8.2.1
|
4月前
|
安全 Java Android开发
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
如何解压OTA升级包、编辑升级包内容(例如移除不需要更新的分区)、重新打包、签名以及验证OTA文件的过程。
314 2
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
|
4月前
|
Android开发
Android Studio: 解决Gradle sync failed 错误
本文介绍了解决Android Studio中出现的Gradle同步失败错误的步骤,包括从`gradle-wrapper.properties`文件中获取Gradle的下载链接,手动下载Gradle压缩包,并替换默认下载路径中的临时文件,然后重新触发Android Studio的"Try Again"来完成同步。
1481 0
Android Studio: 解决Gradle sync failed 错误
|
4月前
|
Java 开发工具 Android开发
Android Studio利用Build.gradle导入Git commit ID、Git Branch、User等版本信息
本文介绍了在Android Studio项目中通过修改`build.gradle`脚本来自动获取并添加Git的commit ID、branch名称和用户信息到BuildConfig类中,从而实现在编译时将这些版本信息加入到APK中的方法。
84 0
|
4月前
|
IDE API 开发工具
与Android Gradle Plugin对应的Gradle版本和Android Studio版本
与Android Gradle Plugin对应的Gradle版本和Android Studio版本
467 0
|
7月前
|
Android开发 开发者
Android Split APK介绍
【2月更文挑战第5天】
|
7月前
|
XML API Android开发
android S 上 安装apk出现android.os.FileUriExposedException
android S 上 安装apk出现android.os.FileUriExposedException
72 6
|
7月前
|
设计模式 缓存 Java
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试