对Android apk使用zip.exe、unzip.exe、jarsigner.exe或apksigner.jar进行分包操作,加入渠道号、分包ID等自定义参数

编程知识 更新时间:2023-04-17 17:45:09

渠道分包背景

  • 一般公司要发布一个应用,需要在各大平台去投放自己的应用,并接入各个投放平台的SDK,比如头条、热云、广点通等投放平台,一些平台会提供后台分包的功能,这样你将自己的apk上传到他们后台就可以分包了,分包成功后可以在三方SDK提供的api接口获取分包ID
  • 比如头条是有自己的一个分包SDK、广告主在接入了他们的分包SDK后,将apk上传到他们的后台,经过分包后,可以在分包SDK提供的api获取渠道ID,然后将这个ID与应用自己的数据进行关联
  • 一般我们自己的应用都会开发一套数据统计系统来服务我们自己的应用,针对不同的投放平台以及同一个投放平台的不同渠道来做数据分析,这样我们就需要进行分包来打入唯一的渠道分包ID,不同的渠道分包生成对应的下载链接供用户下载,那么我们怎么进行分包,如何将渠道分包ID快速、高效的打入apk,或者构建分包apk呢,下面提供几种方案

网络上流行的渠道分包

  • 在AndroidManifest.xml中写入渠道分包ID

        这种分包方式需要通过在AndroidManifest.xml的<application>标签写入<meta-data>子标签,然后写入键值对,在应用启动的时候去读取,这种方式需要使用apktool反编译apk文件,然后再加入分包ID,再重新构建apk,再对apk进行资源对齐,重签名,这种方式缺点很多,比如效率很低,apktool解包、构建包很耗时,包越大耗时会成倍增加,不建议使用

  • 美团打包V1签名打包

        我们知道apk其实就是一个压缩文件,当使用V1进行签名的时候,apk会被进行签名,但是里面有一个META-INFO的目录是不不参与签名校验的,所以可以在里面加一个空文件,文件名称就定义为一个唯一的渠道分包ID,在应用启动的时候就去读取这个文件名称,解析出渠道分包ID,这种方式优点就是速度极快,打一个包都是毫秒级的,缺点就是这个只适用于V1签名的方式,如果是某些渠道要求兼容V2签名的话,就不能用了

  • 美团打包V2签名打包

        美团开开源了针对V2签名的打包方案,开源项目叫瓦力(Walle),瓦力通过在Apk中的APK Signature Block区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,如果想了解原理请戳这里:

新一代开源Android渠道包生成工具Walle - 美团技术团队

        项目的Github地址是:

GitHub - Meituan-Dianping/walle: Android Signature V2 Scheme签名下的新一代渠道包打包神器

        这种打包方式效率也非常的高,兼容了V1,V2签名,可以通过Gradle插件的方式接入项目使用,也可以通过脚本执行的方式,还可以部署到服务器进行分包

使用zip.exe、unzip.exe、jarsigner.exe或apksigner.jar进行分包

  • 如果您不想使用美团的方案,可以试下这种方案,这个方案是我结合实际开发需求、压缩工具以及压缩命令实验出来的一种方案,下面我来说下我的思路和方案吧
  • 首先我们都知道apk文件其实就是一个压缩包文件,当我们使用压缩软件工具可以压缩打开一个apk文件,下面是我使用360压缩工具解压打开1.apk,打开过程是不耗时的
  • 接着我们再双击assets文件,定位到一个json配置文件,点击打开或者用记事本打开,然后修改里面的内容,接着保存一下,可以看到弹出了一个框提示我们更新到压缩包中去
  • 点击确定,将修改后的压缩文件重新压缩进apk,这个过程很快,不到1秒就完成了,是不是相当于我写了个渠道分包ID进去,然后花了不到1秒时间就出了一个渠道分包啊,哈哈。
  • 然后将修改后的apk在模拟上进行安装,没想到居然安装成功了,运行也没问题,其实部分模拟器可能对签名的验证不是很严格,当我将apk安装到手机里面时候就报错了,提示安装失败(-103),失败原因是安装包解析出错,肯定是我改了assets下的json文件引起的,破坏了文件,签名通不过了   
  • 接下来使用安装的jdk的bin目录下的jarsigner工具来对修改后apk进行签名,这个只能对apk进行V1签名,签名完成后在手机上机进行安装,OK,安装运行都没问题了
  • 然后我们再使用android sdk 路径下的apksigner.jar进行V1+V2签名,然后安装运行都OK
  • 这样一些列一操作我们的渠道分包就完成了,我们可以看到整个过程软件或命令执行耗时最多就是apk签名这个环节了,这个与包体积成正比,耗时5-20秒不等,1G多的apk大概耗时20秒左右,比起使用apktool反编译方式耗时减少了很多,对比美团的方案耗耗时就不占优势了,不过还能接受
  • 如果您的应用是将各种配置信息包括渠道分包ID都是写在assets下的文件中的,那么采用这种分包方案还是可行的,因为apk启动运行时不用再去解析额外的文件去获取渠道分包ID了,分包耗时也不长
  • 现在我们要做的就是将上面手动分包的方案用代码并结合解压,压缩,签名命令来实现了,我们可以在前端实现这个方式,在本地执行分包命令进行分包,也可以在服务器端写代码或脚本来实现,在服务器后台进行分包
  • 下面我提供压缩、解压局部单个文件的工具以及命令给大家吧,大家可以自己写代码或脚本去实现
  • unzip解压:unzip <apk路径> assets/my_cfg.json -d <解压目录>
  • zip压缩:zip <apk路径> -u assets\my_cfg.json
  • V1签名命令:jarsigner -digestalg SHA1 -sigalg SHA1withRSA -keystore <签名文件路径> -storepass <storePassword> -keypass <keyPassword> <apk path> <keyAlias>
  • V1&V2签名命令:java -jar <apksigner.jar path> sign --ks <签名文件路径> --ks-key-alias <别名> --ks-pass <秘钥密码> --out <待输出的apk路径> <待签名的apk路径>
  • windows系统可用的zip.exe,unzip.exe工具下载 地址:zip.exe,unzip.exe压缩解压工具-桌面系统文档类资源-CSDN下载
  • 如果是linux系统,可直接使用自带的命令,可参考Linux zip命令 | 菜鸟教程,Linux unzip命令 | 菜鸟教程

更多推荐

对Android apk使用zip.exe、unzip.exe、jarsigner.exe或apksigner.jar进行分包操作,加入渠道号、分包ID等自定义

本文发布于:2023-04-14 02:26:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/4ae51c614e0f08bd4d647e4456f6ed9a.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自定义   渠道   参数   操作   zip

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 74294文章数
  • 14阅读数
  • 0评论数