最近因为业务需要,要做马甲包,看了网上很多文章,但是对 productFlavors 的使用做说明,但具体功能是什么却没太多相关的介绍,在些我说一下个人对 productFlavors 的感受。
个人觉得 productFlavors 有点类似子类父类的继承关系,以一套代码以核心,根据不同的 Flavor 进行不同的修改从而生成不同的 apk 包,以此达到定制化的目的。
如何使用就不多说了,以下是几个不错的链接
https://www.jianshu.com/p/4677efee7214
https://www.jianshu.com/p/29cb209197bf
https://www.jianshu.com/p/1ae5c85d2ff2
这里说一下自己在使用后的一些总结:
1.Gradle在构建应用时,会优先使用flavor所属dataSet中的同名资源。
所以如果只是 fragment 或 activity 中的页面布局不同的话,只要在不同的马甲包下创建同名的 xml 布局文件就可以了。
2.有些特殊情况,比如老板脑子发神经,说什么马甲包要特殊功能,和主包不同时。比如主包的个人中心页中没有A功能,但马甲包中的要有,这时马甲包中就要有主包中没有的文件了,方便方法是在马甲包中新建一个继承自主包的个人中心页的页面。
这样,在打包时不同名的文件就会打入包中但不会替换,而在主文件中,就要想办法替换入口了,当打马甲包时,要进入的是马甲包中的子类而不是主包中的父类。
这里介绍一个方法
在 第一行代码 中 郭霖 大神推荐每一个activity 都要有一个公共的 start 方法,如
public static void start(Context context, int actorId, String videoUrl) {
Intent starter = new Intent(context, ActorPagerActivity.class);
starter.putExtra(Constant.ACTOR_ID, actorId);
starter.putExtra(Constant.VIDEO_URL, videoUrl);
context.startActivity(starter);
}
目的在于方法知道要传入哪些函数给 activity ,如果我们把所有 start 方法都写在一个 helper 类中,即跳转类。然后在马甲包中创建子类,之后复写跳转类把去父类的地方定义成子类,这样打包时跳转类被覆盖,方法就会定向到子类去了。
而 fragment 也类似,每个 fragment 都有其 newInstance 方法
public static salaryFragmentNoticeList newInstance(Bundle bundle) {
salaryFragmentNoticeList fragment = new salaryFragmentNoticeList();
fragment.setArguments(bundle);
return fragment;
}
也用上面 类似 start 的方法统一管理后统一复写的话,就能达到统一替换的方法。
总结下来一句话,主包中的父类管理功能。马甲包中的子类可定制页面及根据不同需求拓展一定功能。
如果接了微信的支付和登录的话,在马甲包中也有要相应路径文件,这样才调的起来。