Gradle7.0.0 修改apk输出目录outputDirectory,第二次打包时,上次apk被删除

4.2.2 升级Gradle7.0.0 后,第二次打包时,apk被删除,项目中修改了apk输出目录outputDirectory,故注释outputDirectory=代码排除,具体看了一下gradle 源代码未发现原因

//...
applicationVariants.all {
    
     variant ->
                if (variant.buildType.name != "debug") {
    
    //防止AS无法安装debug包(apk)
                    variant.getPackageApplicationProvider().get().outputDirectory = APK_SAVE_DIR //这导致了,第二次打包,上次apk没保留
                }
                //...
 } 
 //...

想法①:

不可行,doLast后outputDirectory为final

 String outputApkPath = variant.getPackageApplicationProvider().get().outputDirectory.getAsFile().get().getPath()
variant.assembleProvider.get().doLast {
    
    
//
 variant.getPackageApplicationProvider().get().outputDirectory = outputApkPath
}

想法②:copy-delete

applicationVariants.all {
    
     variant ->
    String outputApkPath = null
    if (variant.buildType.name != "debug") {
    
    //防止AS无法安装debug包(apk)
        //variant.getPackageApplicationProvider().get().outputDirectory = APK_SAVE_DIR
        outputApkPath = variant.getPackageApplicationProvider().get().outputDirectory.getAsFile().get().getPath()
    }
    variant.outputs.all {
    
    
        def fiName
        println("productFlavorsName:" + variant.productFlavors[0].name)
        if (variant.productFlavors[0].name == "vscreen_demo") {
    
    
            fiName = "VScreen_${variant.productFlavors[0].name}_build_${defaultConfig.versionCode}.apk"
        } else if (variant.productFlavors[0].name == "vscreen_universally") {
    
    
            fiName = "${variant.productFlavors[0].name}_v${versionName}_build_${defaultConfig.versionCode}.apk"
        } else {
    
    
            fiName = "VScreen_${variant.productFlavors[0].name}_v${versionName}_build_${defaultConfig.versionCode}.apk"
        }
        def noapkname = fiName.replaceAll("\\.apk", "")
        outputFileName = fiName
        variant.assembleProvider.get().doLast {
    
    
            if (variant.getBuildType().isMinifyEnabled()) {
    
    
                //cp位置
                copy {
    
    
                    //apk files
                    from outputApkPath
                    duplicatesStrategy = DuplicatesStrategy.INCLUDE
                    include '**/*.apk'
                    include '**/*.txt'
                    //mapping files
                    from variant.getMappingFileProvider().get()
                    into APK_SAVE_DIR
                    rename {
    
     String fileName ->
                        if (fileName.contains("mapping")) {
    
    
                            "${noapkname}-mapping.txt"
                        }
                    }
                }
                delete outputFile
                def apkFile = new File(APK_SAVE_DIR, fiName)
                def path = apkFile.getAbsolutePath()
                println2file(String.format("apkVersion: v%s (%s)", versionName, GIT_VERSION) + ", apkSize: " + apkFile.length() + ", apkPath: " + path)
                if (isJenkins) {
    
    
                    println2file("Jenkins DownloadUrl: http://192.168.3.136/job/vx-screen/ws/APK/" + fiName)
                }
                //上传apk
                if (getBool(dict, 'auto_push_apk') || (project.hasProperty('AUTO_PUSH_APK') && project.getProperties().get('AUTO_PUSH_APK') == 'yes')) {
    
    
                    uploadFile(path)
                }
            } else {
    
    
                def file = new File(project.rootDir.absolutePath + "/VScreen/build/outputs/apk/" + variant.productFlavors[0].name + "/debug")
                def apkFile = new File(file, fiName)
                println(String.format("apkVersion: v%s (%s)", versionName, GIT_VERSION) + ", apkSize: " + apkFile.length() + ", apkPath: " + apkFile.getCanonicalPath())
            }
        }
    }
}

duplicatesStrategy:默认是INHERIT,需要调整才不报错,位置也有讲究。
duplicatesStrategy = DuplicatesStrategy.INCLUDE

COPY官方文档

Android gradle配置打包后 Copy APK到指定路径
gradle执行打包并导出Apk、mapping文件到指定文件夹

指定文件夹clean。gradle 文件树、cleanTask相关知识

clean {
    
    
    println("VSApp:clean APK")
    //clean 成功
    doLast {
    
    
        def tree = fileTree(new File(project.rootDir, 'APK'))
        tree.include '*.apk'
        tree.include '*.txt'
        long now = System.currentTimeMillis()
        //println now
        tree.each {
    
    
            //println (it.lastModified())
            if (now - it.lastModified() >= 1000L * 60 * 60 * 24 * 30) {
    
    
                println("VSApp:clean del: " + it.name)
                it.delete()
            }
        }
    }
}

新增环境变量读取

// 从环境变量中读取字符串或整数
def env = {
    
     System.getenv it }
def envInt = {
    
     Integer.parseInt(env(it)) }
def hasEnv = {
    
     env(it) != null }
def GRADLE_USER_HOME_DIR = gradle.getGradleUserHomeDir()
def isJenkins = hasEnv("JENKINS_HOME")
println("isJenkins:" + isJenkins)

调试Gradle

//输出gradle版本 build.gradle
println("gradleVersion: " + gradle.gradleVersion)
println("getGradleUserHomeDir: " + gradle.getGradleUserHomeDir())
println("gradleHomeDir: " + gradle.gradleHomeDir)

    sourceSets {
    
    
        //引入Gradle源码: 【 需要 gradle - x.x - all.zip 】
        def base = "${gradle.gradleHomeDir}/src"
        main.java.srcDirs += [
                "${base}/core",
                "${base}/core-api",
                "${base}/base-services",
                "${base}/base-services-groovy",
                "${base}/logging",
                "${base}/plugins",
                "${base}/diagnosticcopys",
                "${base}/ide-native",
        ]
    }
    dependencies {
    
    
        //引入Gradle插件源码: 【需要用 gradle-x.x-all.zip】
        def gradle = "${GRADLE_USER_HOME_DIR}/caches/modules-2/files-2.1/com.android.tools.build/gradle/7.0.2"
        implementation fileTree(dir: gradle, include: ["*.jar", "*\\*.jar"])

        def gradleApi = "${GRADLE_USER_HOME_DIR}/caches/modules-2/files-2.1/com.android.tools.build/gradle-api/7.0.2"
        implementation fileTree(dir: gradleApi, include: ["*.jar", "*\\*.jar"])
    }

Android_Gradle

猜你喜欢

转载自blog.csdn.net/CSDNno/article/details/120643201