背景:
公司的移动端业务范围涵盖手机、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两个工程
我是菜鸟我怕谁,菜鸟初飞步骤:
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管理很多渠道所需的资源文件,分支切换和打包后的效果就不在演示了,有兴趣的朋友自己动手试试吧
版权声明:本文为博主原创文章,转载请标明出处。