网上流传多种方法,用于多渠道打包
1.腾讯的 WasDolly 和美团的 Walle, 都是以开源 Tencent/VasDolly 基础演变出来
看过原理就知道是通过修改EOCD数据块,插入渠道标识达到目的,声称能绕过签名和校验流程,无须重新签名,能发布,从而节省时间.
这种方法严格来说,只是钻了人家漏洞而言,有漏洞迟早会给补上,实践也证实,老版 andorid 10 以下,相对稳定,但 andorid 11以上,就出现闪退,安装不成功等.
2.在manifest文件中写入一个meta标签
这是最早期做法,通过 apktool 反编译后 修改 AndroidManifest.xml ,很多打包工具也用类似这种方法实现,随着andorid 13以上流行,也出现 无法安装等问题.
3.直接 META-INF 写渠道文件
这种与第一种方法原理,也是差不多, 据说能 支持 V1/V2/V3/V4 签名,兼用性也是难保证.
以上都是用技术手段实行,都是有通病,兼用性得不到保证, 随着手机厂商系统版本升级,自然出现各种问题.最终App表现出不稳定,用户流失.
改动过apk本身,想要稳定,脱离重新签名的,无论怎样钻漏洞都是难而保证的稳定的,不要忘记人家弄个签名就是防止改过Apk的.
如果你的应用是商业化,建议不要用钻漏洞来呈现你的技术,最终只会在考验你的用户耐性,这是以用户流失作代价.
4.APP通用免反编译
也是我在用的方法,觉得比较可靠,归根到底没技术含量,纯属提示,因为最后也要对APP重新签名,但不用反编译,所以稳定,V1/V2/V3/V4 签名也不影响.
apx说到底也是一个zip压缩文件,既然zip文件,我们只要往里面追加一个文件作为渠道标识,就可以了,
apx里面中的assets文件夹,是资源库,是没编译的,用winrar打开,放一个空文件,以渠道名作文件名,就可以得到渠道标识,在源码中读取那个文件名出来,就是知道是那个渠道了,就是那么简单.
static String channel="";
public static String getChannel(Context appContext)
{
try {
if (channel.length()==0) {
String[] files = appContext.getAssets().list("channel");
//Assets加入channel文件夹
if(files!=null && files.length>0)
{
//读取channel文件夹里的文件名,文件名就代表渠道名,这样做轻松得到渠道
String[] t_channel= files[0].split("//");
channel=t_channel[t_channel.length-1];
Log.d(tag,"channel:"+channel);
}
}
}catch (Exception e)
{
}
return channel;
}
如图这样,vivo渠道,只是把空文件放进入,就完成了, 记得重新签名,
如果有几十,上百个渠道,难道又是一个个加入?当然不是,写个批处理文件就可以了
@echo off
set "zip_exe=D:\Program Files\WinRAR\WinRAR.exe"
set "apk_file=%~1"
set channel_dir=assets\channel\
set channel=vivo
call "%zip_exe%" a -ap%channel_dir% %apk_file% %channel%
这是我测试的bat批处理文件,只是把test.apk 拖到 vivo.bat,就完成加入渠道标识,要想全自动化,只要改进批处理命令就可以了,如,加入自动签名,完成后删除临时文件等命令,bat批处理文件dos命令宝刀未老,即使数百个渠道,也只是在bat批处理中加入循环而已.
注意:-ap%channel_dir% 这里的 参数 -ap后面接着的,不要有空格.