浅谈Android Variants(Android变体)

如果现在有这样一个需求:一个App里面所有用到地图的地方,在国内用高德地图 (或者百度),在国外用Google Map(包括香港澳门)。

其实类似这样的需求是经常会碰到的,再比如国内推送用友盟(或者信鸽、极光),国外用GCM(或者Firebase,反正是谷爹原生的)。

实现这样的需求或许有很多方式,构建Android变体就是很好的选择,直接上图吧
这里写图片描述

这张图可以分开三部分来看,先来看看项目的结构,在src文件夹下面有cn、hk、main三个文件夹,main是我们最熟悉不过的了,就是整个项目代码的主体部分,而cn和hk就是用Gradle构建出来的Android变体了,可以在cn和hk文件夹里实现文章开头的需求代码;

再来看看右边的Gradle,productFlavors里面同样有cn和hk两部分,其实在src下面新建cn和hk文件夹之前,需要先在Gradle这里写好所需构建的变体名称,productFlavors里的变体名称要跟src下的文件夹名称对应好(包括大小写,当然用小写是比较规范的),其中applicationId就是不同变体的进程名了;

最后来看左下角的Build Variants,当做完前面两步后,打开这个Build Variants窗口,点击右边一栏Build Variants,就可以自由切换不同的变体进行开发,点击确定变体之后,AS会自动去把项目build一次,build完就可以愉快的按不同的变体进行开发了。

如果不同的变体需要用到不同的框架或者第三方的东西咋办?其实也很好办,直接上图就懂了
这里写图片描述

compile对应main文件夹,cnCompile对应cn文件夹,hkCompile对应hk文件夹,是不是很方便嘞

最后再说一点,如果项目中的MainActivity有某个button,在国内这个button的颜色是黄色,在国外是黑色,那么是不是要在cn、hk、main三个文件夹都要有这个MainActivity的layout#xml文件,然后分别去修改这个button的background呢?

答案是否定的,我们可以给这个button写一份drawable文件分别放在cn、hk、main的res下面(注意这个drawable在三个文件夹中的名字都是一样的!),然后button的background就引用这份drawable文件,而MainActivity的layout#xml则只需要放在main文件夹里就好,这样就可以达到同一个button不同变体不同颜色的效果了;
这是因为cn和hk中的res文件会自动覆盖main中的res文件(前提是res里的文件名字要相同)

简单来说,变体就相对于一个单独的App,只是不同的变体同时存在于一个项目中。

你可能感兴趣的:(浅谈Android Variants(Android变体))