欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android多渠道打包

程序员文章站 2024-01-11 15:45:52
...

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

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

Android多渠道打包

我这里定义的变量为"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多渠道打包

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

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

Android多渠道打包

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

Android多渠道打包

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

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

Android多渠道打包

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多渠道打包

b.运行结果如下:

Android多渠道打包