链接地址: gradle神器~Android多渠道配置管理之自动替换图标ICON和资源图片(3)
https://blog.csdn.net/weixin_39539092/article/details/80693017
昨天我的朋友看了自动替换资源的讲解后给我说,你只是替换一个简单的icon耗时还能接受,但是定制化需要大量的替换资源图片、布局、strings.xml等等的时候就需要复杂的gradle脚本支持,gradle的应用大多数都是停留在Android Studio默认的阶段。后来想了想我自己踩过的坑确实如此,下面我就来说说第二个解决方案,需求背景和原因我就不多说了和第3篇一样,还是以替换icon为示例。
解决方案二:
1. 创建渠道配置文件channel.json
[ { "channel_name" : "hello", "versionCode" : 1, "versionName" : "1.0", "icon": "@mipmap/hello" }, { "channel_name" : "nihao", "versionCode" : 2, "versionName" : "2.0", "icon": "@mipmap/nihao" } ]
请注意标红内容这里与上一篇每个渠道的icon名字都一样不同,这里可以是你自己的图片icon名字,我的两张图片名字是hello.png和nihao.png。
2.创建以渠道名字命名的res-XXX的资源文件夹,在对应的资源目录创建需要的文件,以res-XXX命名的资源文件夹在打包的时候,会自动的合并到main/res资源文件中,所以资源文件里面的命名要避免和main/res中的重复。
3.在AndroidManifest.xml中修改成以下所示:
4.配置渠道列表
productFlavors { def json = file("${projectDir.path}/channel.json").getText("UTF-8")//读取app目录下的channel.json文件内容 def flavors = new JsonSlurper().parseText(json) //转换成Jsons数组对象 flavors.each { flavor -> "${flavor.channel_name}"{//渠道名称,对应文件中的channel_name versionCode flavor.versionCode //渠道版本号,对应文件中的versionCode versionName flavor.versionName //渠道版本名称,对应文件中的versionName manifestPlaceholders = [ icon: flavor.icon] //APP要显示的ICON图标,对应文件中的icon } } }
5.配置sourceSets
关于sourceSets的作用我就不多说了,百度能出来一大堆比我也讲的明白。利用sourceSets的原理为每个渠道指定以自己渠道名字命名的res-XXX资源文件夹,AndroidStudio编译的时候就会去读取res-XXX的资源文件
sourceSets{ getProductFlavors().each{ f -> //遍历所有的渠道 "${f.name}"{ //渠道资源配置 res.srcDirs = ["src/main/res-${f.name}"] //指定资源目录 } } }
在命令终端执行打包命令gradlew assembleRelease:
总结: 两种方案各有利弊,可以根据不同使用场景*选择,也可以结合使用
版权声明:本文为博主原创文章,转载请标明出处。