出处: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,可在评论中贴出,如果我遇到过或者能解决的话就会回复大家的,感谢阅读