Android多渠道包

简介

之前的文章写过关于Android多渠道的问题--->在这里啊

因为之前是修改META-INF文件夹写入渠道信息,但是这种方式会有问题,因为Android7.0的系统使用Signature Scheme v2,所以修改完apk包以后再次安装的时候会提示安装包未包含任何证书,从而安装失败。查了相关资料看到一个开源库VasDolly。

VasDolly是一种快速多渠道打包工具,同时支持基于V1签名和V2签名进行多渠道打包。插件本身会自动检测Apk使用的签名类别,并选择合适的多渠道打包方式,对使用者来说完全透明。

项目实践

VasDolly提供了两种打包方式

第一种是Android Studio 的gradle打包
第二种是命令行打包

因为我们的包是从服务器打的渠道包,所以我写一下命令行打包方式,测试完成后把命令行的工作迁移到服务器就可以了。

  1. 首先从github下载VasDolly的项目,因为客户端只需要读取渠道所以我们只需要common和reader库的代码,如下图
Android多渠道包_第1张图片
image
  1. 新建Android项目,将common和reader库的代码拷贝到项目中

  2. 新建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 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;
    }
}

  1. 获取渠道
   String channel = ChannelReaderUtil.getChannel(getApplicationContext());
  1. 打包测试

打开VasDolly项目找到 command/jar/VasDolly.jar 执行下面的命令

./ 指当前目录

java -jar VasDolly.jar put -c "channel1,channel2" app-release.apk ./

命令行参数详解

项目地址

你可能感兴趣的:(Android多渠道包)