productFlavors是gradle的一个标签,主要用以区分渠道,也可用来区分debug,和release包,可以在物理层区分线上线下,甚至可以区分包名,一个手机可以装两个包,那么可不可以通过flavor来实现标准版和精简版呢?答案是可以的
新建一个工程,在gradle配置文件中,创建两个flavor
生效之后,我们现在就得到了4个build variant
之后在app/src目录下新建一个global目录
创建目录和名字没有严格要求,关键是配置sourceSets时要写对相应的路径
这里通过sourceSets里的name属性,过滤了global版本和其他,如果有更详细的需求,可以再累加
另外通过sourceSet.java.srcDirs配置java文件路径,通过manifest.srcFile配置manifest.xml,res,aidl,assets都可以区分配置,这里就不再赘述
最核心的代码是获取当前渠道配置,这里为了看着更清晰,额外定义了一个变量channel
我这里通过gradle的startParameter.getTaskNames()方法,区分编译的渠道是哪个,需要注意的是task的内容是驼峰的,所以需要手动调用toLowerCase()方法,给channel赋值,这个channel是可以在dependencies标签中生效的
举个例子,在国际版中不引用其他三方库,在其他渠道中,引用一个glide4
虽然这里也可以使用类似前缀chinaDebugImplementation方法区分开来,但是不方便管理,而且有一定局限性,这里不详细展开,还是推荐直接用渠道动态分开
分别打包,查看apk
生成了2个apk
可以看到两个apk的大小都不一样,查看里面的内容
两者对比,确实在引用依赖上有了区别
另外补充一点,一旦区分了AndroidManifest.xml,就相当于有两个配置文件,两个主入口activity,区分之后,从项目设计的角度,要考虑到后续改动的需求,是否要将工具类,资源文件进行合理的隔离,从业务角度进行完整的拆分,不要有任何依赖的情况,尤其是项目变大之后,不可牵一发而动全身
网友评论