惯例:先上图后说话,谢谢各位伙伴的支持! 有你们是我的福分
左图为正常打包(不包括支付) ,右图带有支付功能的包
每日一言:世界没有完美,但努力可以接近完美。
将分包分为三个阶段:
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会生成不同的包,画红框框的是我们测试的内容,如果打普通包(不能支付),是不会把支付包打进去的。
感谢你的阅读,共同学习,一起进步,有任何问题可以留言,讨论。