Android Studio 批量打包(渠道包,最新基于Gradle 2.2.1、Android Plugin 1.2.3)

出处:http://blog.csdn.net/u014231734/article/details/41695913

示例工程补上,下载地址:

http://download.csdn.net/detail/u014231734/8826327


最近上手了Android Studio,之前就听说可以利用Gradle批量打渠道包,在熟悉了下Android Studio后,就想着试试批量打包。于是找资料、看文档,整了好一阵,结果失败了。。。囧

主要思路来自友盟自动打包项目中的Gradle,地址https://github.com/umeng/umeng-muti-channel-build-tool/tree/master/Gradle,大伙先看下他的build.gradle写法,根据google官网的AS(Android Studio,以下都用此简写了)更新日志,在11月的时候将variant的一些方法废弃了,所以如果你的AS是11月之前的版本的话,按友盟的那种方式应该是可行的。但如果你跟我一样是最新版本的话,那就。。。呵呵

先来看下我报的无数错误中的一个:

Error:(70, 0) Could not find property 'processManifest' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@7d3ce2d1.

先说明下,这是我按照这种写法才报的错

android.applicationVariants.all{ variant -> 
    println "${variant.productFlavors[0].name}"
    variant.processManifest.doLast{
        copy{
            from("${buildDir}/manifests"){
                include "${variant.dirName}/AndroidManifest.xml"
            }
            into("${buildDir}/manifests/$variant.name")

            filter{
                String line -> line.replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
            }

            variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml")
        }    
   }
}
一开始对于啥也不懂的我,以为换另一种写法就会好了,另一种写法

//替换AndroidManifest.xml的UMENG_CHANNEL_VALUE字符串为渠道名称 By Remex Huang
android.applicationVariants.all{ variant -> 
    variant.processManifest.doLast{

        //之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁
        //${buildDir}是指build文件夹
        //${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成
        //下面的路径是类似这样:build/manifests/GooglePlay/release/AndroidManifest.xml
        def manifestFile = "${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml"

        //将字符串UMENG_CHANNEL_VALUE替换成flavor的名字
        def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
        new File(manifestFile).write(updatedContent, 'UTF-8')

        //将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件
        variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml")
    }    
}
然后,不管哪种都是调用了processManifest这个字段的,错误依然在那得瑟。。。

然后,又是一阵找资料,看文档,还动用了我亲爱的stackoverflow,结果发现她也不是万能的,我想要的东西还是没有找到。。。

吐槽的废话不想说了,期间的调试辛苦过程也不想说了,毕竟俺是小白。。。

解决方案的代码:

android.applicationVariants.all { variant ->
        //1、上面第二种写法的 processManifest 变成 outputs.get(0).processManifest
        variant.outputs.get(0).processManifest.doLast{
            //2、把 manifests 变成 intermediates/manifests/full</span>
            def manifestFile = "${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml"
            //将字符串UMENG_CHANNEL_VALUE替换成flavor的名字
            def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")

            new File(manifestFile).write(updatedContent, 'UTF-8')

            //3、把下面这句给注释掉了,因为我发现不写也完全可以
            //variant.outputs.get(0).processResources.manifestFile = file("${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml")
        }
    }


我是参照第二种写法改的,第一种写法没试了,有一种能用的就行了。

其实google也是只是改了改api,换了换路径而已,思路都是一样的,以后可能还会改api或者换路径啥的,掌握思路后,哥也不怕他了,他改我也改就是了

我改了的几处用1、2、3标出来了,就三处地方


就到这吧,如果又遇到啥error,可在评论中贴出,如果我遇到过或者能解决的话就会回复大家的,感谢阅读





你可能感兴趣的:(android,gradle,批量打包,Studio,渠道包,variant)