简介
之前的文章写过关于Android多渠道的问题--->在这里啊
因为之前是修改META-INF文件夹写入渠道信息,但是这种方式会有问题,因为Android7.0的系统使用Signature Scheme v2,所以修改完apk包以后再次安装的时候会提示安装包未包含任何证书,从而安装失败。查了相关资料看到一个开源库VasDolly。
VasDolly是一种快速多渠道打包工具,同时支持基于V1签名和V2签名进行多渠道打包。插件本身会自动检测Apk使用的签名类别,并选择合适的多渠道打包方式,对使用者来说完全透明。
项目实践
VasDolly提供了两种打包方式
第一种是Android Studio 的gradle打包
第二种是命令行打包
因为我们的包是从服务器打的渠道包,所以我写一下命令行打包方式,测试完成后把命令行的工作迁移到服务器就可以了。
- 首先从github下载VasDolly的项目,因为客户端只需要读取渠道所以我们只需要common和reader库的代码,如下图
新建Android项目,将common和reader库的代码拷贝到项目中
新建ChannelReaderUtil类
public class ChannelReaderUtil {
private static final String TAG = "ChannelReaderUtil";
private static String mChannelCache;
public ChannelReaderUtil() {
}
public static String getChannel(Context context) {
if(mChannelCache == null) {
String channel = getChannelByV2(context);
if(channel == null) {
channel = getChannelByV1(context);
}
mChannelCache = channel;
}
return mChannelCache;
}
public static String getChannelByV2(Context context) {
String apkPath = getApkPath(context);
String channel = ChannelReader.getChannel(new File(apkPath));
Log.i("ChannelReaderUtil", "getChannelByV2 , channel = " + channel);
return channel;
}
public static String getChannelByV1(Context context) {
String apkPath = getApkPath(context);
String channel = ChannelReader.getChannelByZipComment(new File(apkPath));
Log.i("ChannelReaderUtil", "getChannelByV1 , channel = " + channel);
return channel;
}
public static String getStringValueById(Context context, int id) {
String apkPath = getApkPath(context);
String value = IdValueReader.getStringValueById(new File(apkPath), id);
Log.i("ChannelReaderUtil", "id = " + id + " , value = " + value);
return value;
}
public static byte[] getByteValueById(Context context, int id) {
String apkPath = getApkPath(context);
return IdValueReader.getByteValueById(new File(apkPath), id);
}
public static Map<Integer, ByteBuffer> getAllIdValueMap(Context context) {
String apkPath = getApkPath(context);
return IdValueReader.getAllIdValueMap(new File(apkPath));
}
private static String getApkPath(Context context) {
String apkPath = null;
try {
ApplicationInfo applicationInfo = context.getApplicationInfo();
if(applicationInfo == null) {
return null;
}
apkPath = applicationInfo.sourceDir;
} catch (Throwable var3) {
var3.printStackTrace();
}
return apkPath;
}
}
- 获取渠道
String channel = ChannelReaderUtil.getChannel(getApplicationContext());
- 打包测试
打开VasDolly项目找到 command/jar/VasDolly.jar 执行下面的命令
./ 指当前目录
java -jar VasDolly.jar put -c "channel1,channel2" app-release.apk ./