Android-Gradle(4)gradle插件V2签名多风味打包

享学课堂诚邀作者:周周

转载请声明出处!

正文大纲

1. gradle是什么
2. groovy语言的特性以及它和java的关系
3. 为什么你的apk打包这么慢
4. 如何利用gradle编程解决工作中的实际问题
5. gradle的高级用法(gradle多渠道快速打包插件)

5. gradle的高级用法(gradle多渠道快速打包插件)

本节小目录

  • productFlavors多渠道打包的优势与缺陷
  • android中签名的那些梗
  • 如何在V1签名校验下写入渠道信息
  • 如何在V2/V3签名校验下写入渠道信息
  • 如何发布gradle插件到mavenLocal

如何在V2/V3签名校验下写入渠道信息

Demo地址:

https://github.com/18598925736/GradleStudy1023/tree/v2v3Sign(请进入 v2v3Sign 分支)

理论基础

阅读本节需要 有扎实的字节码操作的概念基础(不然容易走神懵逼)
RandomAccessFile.java , ByteBuffer.java 有基本的了解.

V2/V3 本质上区别不大,android7.0 优先选择V2签名校验,9.0则优先选择V3签名校验。
相对于V1 ,它保护的并不是签名之前原本apk中存在的文件,而是整个apk的字节码,任何针对apk的篡改(包括上一节中我们在META-INF中塞入的 新文件),都会导致字节码的变化.

一个apk文件,其实本身就是一个zip格式的压缩包,一个zip包所包含的3个部分是
(ZIP内容区块中央目录区块中央目录的结尾区块):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Sgh8s5L-1623555941492)(https://upload-images.jianshu.io/upload_images/4100513-08321d7226bc1e27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uYcR3uCL-1623555941494)(https://upload-images.jianshu.io/upload_images/4100513-0cc96bb00cae1d92.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
签名之后多出来的部分,就是签名区块,安装apk的时候,就是对这一块进行校验,如果有人在拿到apk之后,对第1,3,4区块进行了修改,那么就会导致签名校验不通过,安装失败。但是! 如果我们在第2 签名区块中新增一些东西,并不会导致1,3,4区块的变化,从而不会导致校验失败。这也就是 V2/V3签名 下仍然可以写入渠道信息的原因!
那么既然要在这一块字节区块中写入我们自己的数据,我们必须要去了解这一块的内容都有什么含义。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S4Wi2vTl-1623555941495)(https://upload-images.jianshu.io/upload_images/4100513-97d6d6348e3f444b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

解读一下上图,Apk签名区块中的大部分数据我们不能去修改,因为 这些数据是用来校验apk的合法性的,一旦篡改,apk不合法,但是,我们在上图蓝色区域 id-Value这一块字节中插入一个id-value,不去影响其他的字节,则不算篡改。

那么,确定V2/V3签名下的 渠道信息注入方案的大方向:

1. 拿到一个apk,确定当前apk经过了V2/V3签名
2. 拷贝原apk,并且重命名为带有渠道信息的apk
3. 在拷贝之后的apk文件的Apk签名区块中加入我们自己的id-value
4. 在安装该apk之后,同样用读取字节码的形式,找到我们自己插入的id-value并解析它

其中最难的是第一点,我们如何确定 一个apk使用了V2/V3签名??
以下内容假设已经启用了V2/V3签名

解决这个问题,必须了解 apk的第四部分: EndOfCentralDirectory 的内容.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cKTMOFQn-1623555941496)(https://upload-images.jianshu.io/upload_images/4100513-f0f82d1de4a9f266.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]这一部分数据的格式是EOCD格式:其字节数据的内容如下图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-piyGmc37-1623555941497)(https://upload-images.jianshu.io/upload_images/4100513-0ed63fb213a63294.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]当然,上图中的大部分内容暂时对我们没有用,有用的只有一个:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rskSlTzk-1623555941498)(https://upload-images.jianshu.io/upload_images/4100513-7f8294ded483146c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]它其实表示的是 核心目录,也就是 3 CentralDirectory[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XittyGv5-1623555941498)(https://upload-images.jianshu.io/upload_images/4100513-ba088d6290382e82.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]相当于与整个apk的字节数据的开始的偏移位置, 我们找到了第三部分的起始位置,也就找到了第二部分 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-olawcyg8-1623555941500)(https://upload-images.jianshu.io/upload_images/4100513-67e79841cef3291c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
的结束位置.
然后,我们回顾一下第二部分2ApkSigningBlockapk签名区块的内容,它的结尾部分是一个16个字节长度的 magic 用于标记数据格式的,他是一个 写死的固定值
我们从apk的字节数据中,找到了核心目录 CentralDirectory的起始位置, 假如是200 , 我们往前推16个字节,再读16个字节的长度的数据,然后跟magic的值(这个值是zip格式定义的写死的值)进行对比。如果相同,那么说明存在 2ApkSigningBloc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值