多渠道打包时修改apk的输出目录

在使用productFlavors进行多渠道打包时,在打release包时可能需要对所有的release包进行拷贝到一个目录中,这里有两种方法,一种是直接修改输出的目录,一种是拷贝到另外的目录中。

1.修改输出目录:在以前版本的gradle中可以使用outputFile的方式,而新版本只能使用outputFileName的方式。判断是否release,然后修改输出的目录。

    applicationVariants.all { variant ->
        variant.outputs.all {
            def apkName = "app_${variant.productFlavors[0].name}_${buildType.name}_v${defaultConfig.versionName}"
            if (buildType.name.toLowerCase().contains("release")) {
                outputFileName = "../../../apks/${variant.versionName}/" + apkName + ".apk"
            } else {
                outputFileName = apkName + ".apk"
            }
        }

../表示上一级的目录,所有的release包会输出到outputs下的apks下的当前版本号的目录中。

2.拷贝文件:使用task的doLast方法,在完成之后进行apk文件的拷贝

        def obj
        if (variant.hasProperty('assembleProvider')) {
            obj = variant.assembleProvider.get()
        } else {
            obj = variant.assemble
        }
        obj.doLast { assemble ->
            println("assemble:${assemble}")
            if (assemble.name.toLowerCase().contains("release")) {
                copy {
                    from variant.outputs*.outputFile
                    into "./build/apks/${variant.versionName}"
                }
            }
            //if you don't want to delete the file after copying it comment the line below
            // 可以选择删除或保留当前文件夹下的apk
            //delete variant.outputs*.outputFile
        }

其中处理了assemble过时的问题,判断是否有新版本的assembleProvider方法,如果有的话则使用assembleProvider进行处理。拷贝完成后可以选择保存或删除当前的apk文件。源码地址https://github.com/jklwan/NoteApplication

PS:关于打开variant类的方法,打开build.gradle文件,按下ctrl键,放到android下的buildTypes上打开BaseExtension类,然后找到BaseVariant再打开,就会发现下面的代码

    /**
     * Returns the assemble task for all this variant's output
     *
     * @deprecated Use {@link #getAssembleProvider()}
     */
    @Nullable
    @Deprecated
    Task getAssemble();

    /**
     * Returns the {@link TaskProvider} for the assemble task.
     *
     * 

Prefer this to {@link #getAssemble()} as it triggers eager configuration of the task. */ @Nullable TaskProvider getAssembleProvider();

其中assemble已经标记为过时了。

你可能感兴趣的:(Android,技术分享)