美文网首页Android开发程序员Android知识
android 二次打包完成apk多渠道打包

android 二次打包完成apk多渠道打包

作者: 君莫醉 | 来源:发表于2017-10-28 16:09 被阅读256次

    本文介绍将渠道号写入assets文件里面,通过解压apk修改assets里的文件,用Java代码生成jarsigner脚本并运行脚本二次打包的方式来获取新的渠道包

    此打包方式一个渠道包只需要5秒左右,可实现快速打渠道包

    对于为了在assets获取渠道号来打渠道包的方法,其实很简单,你只要知道apk里面装的什么东西,就会了

    将apk用压缩方式解压,你会得到像

    $3G0`R0_{KZ0J{S}48TB098.png

    这样的文件列表,其中就有assets文件夹;当然前提条件是你在项目中必须创建assets文件夹。既然有了这个文件夹,安卓里面又能通过代码获取这个文件夹里面的文件,并读取文件:

        private static String getChannel(Context context){
            try {
                InputStream in = context.getAssets().open("qudao.txt");
                int size = in.available();
                byte[] buffer = new byte[size];
                in.read(buffer);
                in.close();
                String txt = new String(buffer, "utf-8");
                Log.d("qudaobiaoji:",txt);
                return txt;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "未知";
        }
    

    那么接下来就只需要通过修改里面的文件,并重新打包,签名来打渠道包了。

    如何修改里面的文件,并打包签名,我特地写了一个打包工具,通过java工程生成jar,通过命令行运行jar读取配置文件然后生成打包脚本,自动运行脚本进行打包

    介绍

    在java工程中的入口是
    main函数,

     public static void main(String[] args) {}
    

    以前一直不知道args是干嘛的,后来通过命令行传入参数,才知道args可以带入命令行的参数

    1.读取配置文件:

    通过文件的方式传入要打的渠道包,及渠道包的名字,渠道号
    读文件操作很简单,就是通过流的形式,不多介绍,可以自行阅读源码
    文件配置:

    app_path=app-release_aligned_signed.apk;
    keystore=ej_v3.jks;
    keyAlias=ej_v3;
    keyPassword=123456;
    storePassword=123456;
    contents=优亿,魅族;
    apkname=youyi,meizu;
    
    2.解压apk文件

    通过java代码将apk解压出来、
    通过ZipFile来解压文件
    解压完后删除签名文件

    3.替换渠道号文件

    获取解压后的assets路径,并修改里面的渠道文件内容,

                    //------修改内容
                    String content = contents[i];
                    String apkn = apkNames[i];
                    buffer.setLength(0);
                    String path = buffer
                            .append(prefixName).append(ZipUtil.UPDATE_PATH_NAME).toString();
                    System.out.println("path:"+path);
                    br = new BufferedReader(new InputStreamReader(new FileInputStream(path),"UTF-8"));
                    while ((br.readLine()) != null) {
                        osw = new OutputStreamWriter(new FileOutputStream(path),"UTF-8");
                        osw.write(content, 0, content.length());
                        osw.flush();
                    }
    
    4.重新压缩生成.apk文件,此文件是未签名文件
    ZipUtil.compress(prefixName,targetPath+"\\"+unsing+"\\"+apkn+"_unsin.apk");
    
    5.生成签名脚本内容
    batStr+="jarsigner -verbose -keystore "+keystore+" -signedjar "+targetPath+"\\"+sing+"\\"+apkn+"_sin.apk "+targetPath+"\\"+unsing+"\\"+apkn+"_unsin.apk"+" "+keyAlias+"\n";
    
    6.运行签名脚本
        public static void runbat(String batName) {
            String cmd = "cmd /c start "+ batName;// pass
            try {
                Process ps = Runtime.getRuntime().exec(cmd);
                ps.waitFor();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
            catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("child thread donn");
        }
    

    有兴趣的同学可以看下源码,在增加别的渠道的情况下不需要另外配置gradle参数,直接修改配置文件,运行脚本就行了

    今天网上查了下jarsigner打包命令,发现可以直接在脚本中输入密码,可直接打包,不用反复输入密码
    脚本:
    jarsigner -verbose -keystore test.jks -storepass 123456 -keypass 123
    456 -signedjar target\sing\youyi_sin.apk target\unsing\youyi_unsin.apk test

    源码地址:https://github.com/dengzhi00/ApkQuDao

    相关文章

      网友评论

        本文标题:android 二次打包完成apk多渠道打包

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