gradle神器~Android多渠道配置管理之自动替换图标ICON和资源图片(4)

时间:2024-03-19 10:28:02

链接地址: 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中的重复。

gradle神器~Android多渠道配置管理之自动替换图标ICON和资源图片(4)

  3.在AndroidManifest.xml中修改成以下所示:

gradle神器~Android多渠道配置管理之自动替换图标ICON和资源图片(4)

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:gradle神器~Android多渠道配置管理之自动替换图标ICON和资源图片(4)


  总结: 两种方案各有利弊,可以根据不同使用场景*选择,也可以结合使用

版权声明:本文为博主原创文章,转载请标明出处。