gradle神器~Android多渠道配置管理之构建多渠道module工程分支(5)

  • Post author:
  • Post category:其他


背景:

公司的移动端业务范围涵盖手机、Pad、OTT和TV等终端屏幕,手机和Pad的页面和操作逻辑还能统一,但是TV与手机、Pad对比页面显示、页面操作逻辑就完全不同了。如果重新开个工程每个终端的底层库和接口请求的都是一样的,咱们先来看看都能想到那些解决方法解决:

1.使用library,这种方式会增加维护的工作,library有改动的时候需要同步到每个工程。

2.把library发布jar、aar上传本地maven仓库或者jcenter,每个工程远程依赖

3.同一个工程里面开多个module,直接在每个module中依赖library。


4.在一个module里面根据渠道建立渠道分支目录源码,公共部分放在main目录

相信对于大多数同行的朋友来说,前三种方法在工程管理中都有不同程度的实际运用。至于第四种方法可能有很多人没有留意过,更极端的是没有听说过(纯属个人猜测~
奋斗
)。其实第四种方法如果您细心的留意就会发现也是AndroidStudio工程管理的一套标准,它就是app目录中的main和test两个工程


我是菜鸟我怕谁,菜鸟初飞步骤:

1. 在app/build.gradle配置渠道
productFlavors{
    //手机终端
    moblie{}
    //TV终端
    tv{}
}

2.根据渠道名字在app的目录下创建moblie分支对应moblie渠道、tv分支对应tv渠道




可以看到新创建的moblie分支和tv分支的各级目录和main的主目录是一样,执行打包命令会自动的根据渠道名字查找对应的分支并合并到main中,

需要注意的是各分支的包名需要和main里面的不要重复

写代码的时候怎么切换分支呢?很简单看图

蓝色框代表当前分支正在使用,黄色框代表分支是关闭状态。

就这么简单吗?如果每个终端只有一个渠道就这么简单,但实际的业务不可能每个终端只有一个渠道,先不说定制化APP只是上线Android APP应用商店手机端的就有360、应用宝、豌豆荚…… TV的应用商店有乐视、TCL、海信……  如果每个终端都有几十个渠道,是不是需要创建N多个相同源码的分支,答案当然是否定的,开启菜鸟的装B之路吧。


进化之路:


关于渠道配置的相关讲解,这里就不重复了可以 查看(1)(2)

1. 接着修改channel.json渠道配置文件

[
  {
    "channel_name" : "moblie",
    "versionCode" : 1,
    "versionName" : "1.0"
  },
  {
    "channel_name" : "hello_moblie",
    "versionCode" : 1,
    "versionName" : "1.0"
  },
  {
    "channel_name" : "tv",
    "versionCode" : 2,
    "versionName" : "2.0"
  },
  {
    "channel_name" : "nihao_tv",
    "versionCode" : 2,
    "versionName" : "2.0"
  }
]

总共配置了四个渠道,带有mobile标识的是手机终端,tv标识的是TV终端。

2. 在build.gradle中配置渠道信息

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
        
        }

    }
}

3.指定每个渠道的源码文件和资源文件

/*渠道对应的资源文件*/
sourceSets {
    getProductFlavors().each { f ->
        def terminal
        if(f.name.contains("tv")) //渠道名字包含tv就指向tv分支
            terminal = 'tv'
        else if(f.name.contains("moblie"))//渠道名字包含mobile就指向mobile分支
            terminal = 'moblie'
        "${f.name}"{
            manifest.srcFile "src/${terminal}/AndroidManifest.xml"
            /*该源目录包含了此源集的所有Java源文件,默认值[name/java]*/
            java.srcDirs = ["src/${terminal}/java"]
            /*该源目录包含了此源集的资源文件,默认值[name/resources]*/
            resources.srcDirs = ["src/${terminal}"]
            renderscript.srcDirs = ["src/${terminal}"]
            res.srcDirs = ["src/${terminal}/res"]
         
        }
    }

}

这样就可以通过gradle管理很多渠道所需的资源文件,分支切换和打包后的效果就不在演示了,有兴趣的朋友自己动手试试吧

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



版权声明:本文为weixin_39539092原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。