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





更多相关文章

  1. Android实现多渠道打包,动态替换包名、Icon、图片等资源,解决因app
  2. 【Android那些高逼格的写法】Callable与 Future
  3. Android比较字符串是否为空(isEmpty)
  4. Android 获取屏幕截图 和保存到本地的sd卡路径下
  5. Windows下,Android Studio项目路径中包含中文字符无法编译的问题
  6. android--------根据文件路径加载指定文件
  7. Android studio 修改git路径
  8. Android 工具类的两种写法---单例模式与静态方法

随机推荐

  1. [Android学习笔记五] Android View和Widg
  2. Android(OPhone) 学习笔记 - SharedPrefere
  3. What Is Bootloader And How To Unlock B
  4. 基于 Android 的英文电子词典
  5. 2020.8.12 京东Android开发工程师一面面
  6. Android - API Levels-
  7. Android ScrollView中的组件设置android:
  8. Vue实现简书导航栏效果
  9. App测试中Android和IOS测试区别
  10. PC上安装android market软件并提取apk文