Android多渠道打包

步骤:配置多渠道 -> 360加固助手多渠道打包加固 -> 批量修改生成的APK名称

1、在 AndroidManifest.xml 中配置 meta-data 标签:

Android多渠道打包_第1张图片

我这里定义的变量为"QD_CHANNEL_ID",这个变量有两个用处。

a.可在代码中获取到渠道号,如下代码(tv_cur_qd是一个TextView):

        ApplicationInfo appInfo = null;
        String channelIdStr = "";
        try {
            appInfo = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            Object channelId = appInfo.metaData.get("QD_CHANNEL_ID");
            channelIdStr = TextUtils.isEmpty(channelId.toString()) ? "1000" : channelId.toString();
        } catch (PackageManager.NameNotFoundException e) {
            channelIdStr = "1000";
            e.printStackTrace();
        }
        tv_cur_qd.setText("渠道id : " + channelIdStr);

b.在下文使用360多渠道加固的时候会用到,与平台名称对应。

2、在项目的 build.gradle 里配置 productFlavors,定义渠道号:

这里配置了三个渠道号作为案例,如 xiaomi的渠道号为1001,当然这个1001是自己根据业务定义的。

android {

    ................

    //多渠道打包,渠道配置,
    //Android Studio3.0 要求每个flavor必须有dimension
    productFlavors {
        //官方包
        official {
            dimension "official"
            //渠道标识
            manifestPlaceholders = [QD_CHANNEL_ID_VALUE: "1000"]
            //渠道包名不一致时可以单独设置每个包的包名
            //applicationId = "xx.xx.xx"
        }
        xiaomi {
            dimension "xiaomi"
            //渠道标识
            manifestPlaceholders = [QD_CHANNEL_ID_VALUE: "1001"]
            //渠道包名不一致时可以单独设置每个包的包名
            //applicationId = "xx.xx.xx"
        }
        huawei {
            dimension "huawei"
            //渠道标识
            manifestPlaceholders = [QD_CHANNEL_ID_VALUE: "1002"]
            //渠道包名不一致时可以单独设置每个包的包名
            //applicationId = "xx.xx.xx"
        }
    }
}

3、使用studio打包app,这里打包过程略。想看的可了解 《Android App打包》:https://blog.csdn.net/qq_30304193/article/details/81778579

因为增加了多个渠道配置,以下操作步骤有所不同,Flavors选择official即可,然后点击finish,生成apk。

Android多渠道打包_第2张图片

4、启动360加固助手,配置密钥可参考上步骤的文章,也可以参考《360加固助手使用手册》。然后进行"多渠道配置",这里有几个说明:

配置多渠道:如下图配置,统计平台名称填与第一步中的清单文件变量名"QD_CHANNEL_ID"一致

Android多渠道打包_第3张图片

导入:可以选择已有的配置文件导入,如下图(文件在360加固安装路径下):

Android多渠道打包_第4张图片

导出: 可以导出配置形成多渠道模板文件,如上图。
5、按上述步骤配置好后,选择"加固应用",加固完后就会生成相应的渠道包了。

这里可以在你的app中显示出你的渠道号,然后安装每个包验证一下是否成功。

Android多渠道打包_第5张图片

6、批量修改apk名称。

如上步骤生成的各渠道包,名字那么长且不符合要求,不可能就直接发给运营同志了,不然一个一个重命名得把他们搞死,不怼死你才怪。由于Android应用平台实在太多了,不说上百也有几十个,如果要按个进行重命名.....。

以下是利用studio进行文件批量命名,当然还有其他方法,这里就介绍这个了。

a.建立FileRename.java批量命名的代码文件,这里建在 app\src\main\java 下,当然放在哪里你可以自己选择。以下代码中,把路径换成你的路径就可以了,这里的路径指的是加固后存放apk的文件路径。

注意:至于重命名的规则,可以根据自己的规则编写代码,这里只是根据上步骤5生成apk名字进行的案例编写。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileRename {

    public static void main(String[] args) {
        multiRename("E:\\开发软件\\360加固\\360jiagubao1537\\jiagu\\output\\18682333090");
    }

    /**
     * 批量重命名
     * @param path
     */
    public static void multiRename(String path){
        File file = new File(path);
        boolean isDirectory = file.isDirectory();

        /** 如果不是文件夹,就返回* */
        if(!isDirectory){
            System.out.println(path + "不是一个文件夹!");
            return;
        }

        String[] files = file.list();
        File f = null;
        String oldFileName = ""; //之前的名字
        int count = 0; // 下划线个数统计
        int validApkcount = 0; // 有效apk包个数
        /** 循环遍历所有文件* */
        for(String fileName : files){
            oldFileName = fileName;
            count = fileName.length() - fileName.replace("_", "").length();
            if(fileName.endsWith(".apk") && count ==9){

                String tempFileName = getText(fileName, 0, 6) + ".apk"; // 截取有用的文件名
                String channelStr = getText(fileName, 8, 9); // 加固后的渠道
                String originalChannelStr = getText(fileName,3, 4); // 加固前的渠道

                fileName = tempFileName.replace(originalChannelStr, channelStr);
                System.out.print(count + ":");
                System.out.print(originalChannelStr + ":");
                System.out.print(channelStr + ":");
                System.out.print(tempFileName + ":");
                System.out.print(fileName + "\n");


                f = new File(path + "\\" + oldFileName); //输出地址和原路径保持一致
                f.renameTo(new File(path + "\\" +  fileName));
                validApkcount++;
            }else{
                f = new File(path + "\\" + oldFileName);
                f.delete();
            }

        }

        if(validApkcount > 0){
            System.out.println("恭喜,批量重命名成功!" + "共完成" + validApkcount +"个安卓包。");
            System.out.println("并已删除无效文件!");
        }else{
            System.out.println("未找到匹配的文件,请查看文件名是否符合线上环境包命名规则!");
            System.out.println("清空加固输出文件目录,请重新加固!");
        }

    }

    private static String getText(String str, int st, int ed) {
        int n = 0;
        int pos = -1;
        while (n < st) {
            pos = str.indexOf("_", pos + 1);
            if (pos == -1) {
                return "";
            }
            n++;
        }
        int st_pos = pos;
        while (n < ed) {
            pos = str.indexOf("_", pos + 1);
            if (pos == -1) {
                return str.substring(pos + 1);
            }
            n++;
        }
        return str.substring(st_pos + 1, pos);
    }

}

b .右键FileRename.java运行,如下操作:

Android多渠道打包_第6张图片

b.运行结果如下:

Android多渠道打包_第7张图片

 

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