美文网首页
Android多渠道包

Android多渠道包

作者: 琴瑟迷音 | 来源:发表于2018-04-11 18:40 被阅读76次

    简介

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

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

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

    项目实践

    VasDolly提供了两种打包方式

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

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

    1. 首先从github下载VasDolly的项目,因为客户端只需要读取渠道所以我们只需要common和reader库的代码,如下图
    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<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;
        }
    }
    
    
    1. 获取渠道
       String channel = ChannelReaderUtil.getChannel(getApplicationContext());
    
    1. 打包测试

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

    ./ 指当前目录

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

    命令行参数详解

    项目地址

    相关文章

      网友评论

          本文标题:Android多渠道包

          本文链接:https://www.haomeiwen.com/subject/bbmzhftx.html