【白水日记】gradle flavor在Android

     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,区分之后,从项目设计的角度,要考虑到后续改动的需求,是否要将工具类,资源文件进行合理的隔离,从业务角度进行完整的拆分,不要有任何依赖的情况,尤其是项目变大之后,不可牵一发而动全身

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容