步骤:配置多渠道 -> 360加固助手多渠道打包加固 -> 批量修改生成的APK名称
1、在 AndroidManifest.xml 中配置 meta-data 标签:
我这里定义的变量为"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。
4、启动360加固助手,配置密钥可参考上步骤的文章,也可以参考《360加固助手使用手册》。然后进行"多渠道配置",这里有几个说明:
配置多渠道:如下图配置,统计平台名称填与第一步中的清单文件变量名"QD_CHANNEL_ID"一致
导入:可以选择已有的配置文件导入,如下图(文件在360加固安装路径下):
导出: 可以导出配置形成多渠道模板文件,如上图。
5、按上述步骤配置好后,选择"加固应用",加固完后就会生成相应的渠道包了。
这里可以在你的app中显示出你的渠道号,然后安装每个包验证一下是否成功。
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运行,如下操作:
b.运行结果如下: