惯例:先上图后说话,谢谢各位伙伴的支持! 有你们是我的福分
左图为正常打包(不包括支付) ,右图带有支付功能的包
每日一言:世界没有完美,但努力可以接近完美。
将分包分为三个阶段:
1.基础的,一维度;
2.升级,多维度但都在一个文件中;
3.多维度,并且有顺序,分文件打包。
一.配置文件
1.AndroidManifest.xml 中加入<meta-data>中的内容,SMART_POS_VALUE为变量,下面会用到
<application> <meta-data android:name="SMART_POS" android:value="${SMART_POS_VALUE}" /> </application>
2.项目的build.gradle 的{android }中加入以下内容,flavorDimensions为多维度,比如:是否可以支付类型,品牌类型;applicationId 表示在同一手机可以安装不同功能的几个应用
//定义了可能用到的维度和顺序 flavorDimensions "default", "version" //防止不会覆盖安装,多渠道支持 productFlavors { pay { applicationId "com.jiaxufei.framework.pay" dimension "default" } nopay { applicationId "com.jiaxufei.framework.nopay" dimension "default" } huawei { dimension "version" } xiaomi { dimension "version" } } //遍历渠道,将每个渠道的name替换到SMART_POS_VALUE中 productFlavors.all { flavor -> flavor.manifestPlaceholders = [SMART_POS_VALUE: name] }
二.在需要调用的地方调用下面的方法,比如:点击付款按钮,在pay的环境下是可以支付的,但是在nopay的环境下是不可以支付的
/** * 分情况执行 */ public void pack(){ try { //从配置文件获取 ApplicationInfo info=this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); String value=info.metaData.getString("SMART_POS"); switch (value){ case "pay": Intent intent=new Intent(this, UserLoginActivity.class); intent.putExtra("title","可以支付"); startActivity(intent); Toast.makeText(this,"可以支付",Toast.LENGTH_SHORT).show(); break; case "nopay": Intent intent1=new Intent(this, UserLoginActivity.class); intent1.putExtra("title","不可以支付"); startActivity(intent1); Toast.makeText(this,"不可以支付",Toast.LENGTH_SHORT).show(); break; } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } }
三.重新编译gradle,如果是基础功能,以上部分已经够用,所有的文件都写在main里面
但是为了是项目更加清晰,规范,我们进行了如下的优化:在src中新建 Android resource file ,Source set 下拉选择型,其它默认就行,在pay文件中可以新建java文件,layout,values,动画等文件
四.运行项目app会生成不同的包,画红框框的是我们测试的内容,如果打普通包(不能支付),是不会把支付包打进去的。
感谢你的阅读,共同学习,一起进步,有任何问题可以留言,讨论。