一、序

在将 App 宣布到市场之前,很主要的一个步调就是为 APK 举行署名,大局部时候,这个操纵隐藏在了打包的流程中,而不被我们注重到。

署名的作用,除证实 App 的一切权以外,还能够资助 Android 市场和装备校验 APK 的准确性

Android 署名是自证实的,实在不会对证书举行 CA 认证。也就是我们能够运用东西自行天生署名证书,只如果一个准确的署名,体系就会认可,而且许可装置。

天生署名的时,能够指定一个有用时候,这个时候默以为 25 年,而且 Google Play 也有硬性规定,上架的 App 署名有用期必须在 2033-10-22 日期以后。以是只需不是手欠修正了这个有用期,在当下这个时候,是不会有题目,究竟结果到如今还没有一款 App 存在 25 年。

有些题目不在面前,倒是实在存在的。关于一款上架的 App,最主要的就是用户,而当署名失效以后,我们只能被迫换署名,此时由于署名校验没法经由历程,就会致使旧用户没法掩盖装置。这些汗青用户独一的挑选,就是卸载后重新装置。

幸亏这不仅仅是你我的题目,天塌下来有个子高的顶着,以是别忧郁,Google 已动手在处理这个题目了。

计划就是 Android 9.0 新增的对 APK V3 署名的支撑。

二、新的署名计划 V3

2.1 Android 的署名计划

Android 的署名计划,生长到如今,不是一挥而就的。Android 如今已支撑三种运用署名计划:

  • V1 计划:基于 JAR 署名。
  • V2 计划:APK 署名计划 V2,在 Android 7.0 引入。
  • V3 计划:APK 署名计划 V3,在 Android 9.0 引入。

V1 到 V2 是颠覆性的,为了处理 JAR 署名计划的平安性题目,而到了 V3 计划,实在构造上并没有太大的调解,能够理解为 V2 署名计划的晋级版,有一些材料也把它称之为 V2+ 计划。

由于这类署名计划的晋级,就是向下兼容的,以是只需运用妥当,这个历程对开发者是通明的。

V1 到 V2 计划的晋级,对开发者影响最大的,就是渠道签订的题目。在当下这个大环境下,我们想让分歧渠道、市场的装置包有所区别,照顾渠道的独一标识,这就是我们俗称的渠道包。幸亏各大厂都开源了本身的签渠道计划,比方:Walle(美团)、VasDolly(腾讯)都是异常优异的计划,想相识的能够先看看之前的文章:《Android 署名和多渠道打包道理》。

2.2 署名的汗青

先从 Android 署名的汗青讲起。

在上个世纪 80 年代,Phil Katz 创建了 ZIP 花样,能够将文件和一些元数组,组合在一个文件中,便于传输和存档,该花样是为了处理紧缩、校验和冗余优等题目而提出的处理计划。

Sum 公司在上世纪 90 年代,将 ZIP 作为 JAR 花样的基本,而 JAR 本质上就是一个 ZIP 存档。在个中,META-INF 目录下会包罗一些元数据和署名数据等信息。

Android 涌现后,也沿用了 Java 的 JAR 的宣布体式格局,将 APK 建立在 JAR 花样之上,在此基本上对 Dalvik 字节码 classes.dex 和资本 resources.arsc 等文件增加更多标准化的构造。事先 Android 的 APK 完整依靠 JAR 的署名计划来确保运用程序的准确性,这就是我们俗称的 V1 计划(JAR 计划)。

在 V1 署名计划中,实在不会珍爱 APK 内的一切文件,会存在一些破例局部,即使被修正也不会致使署名失效,比方:ZIP 元数据。同时,V1 计划对 APK 内部被珍爱的原始文件,是零丁举行盘算数据择要的,以是在考证时,须要先解压再考证,致使装置时会消费更多的时候,斲丧更多的内存。比方 V1 计划中签渠道的体式格局就是利用了此特征,将渠道信息写入 META-INF 文件中,这不会损坏 V1 署名。

多年后,在 Android 7.0 中增加了一种新的署名体式格局,就是我们俗称的 V2 计划。V2 署名供应了更壮大的 APK 文件考证,它不再搜检包内单个文件,而是搜检全部 APK。它在 ZIP 文件中,插进去一个分外的署名块,掩盖 ZIP 文件中的其余局部。

在这个分外的署名块(Apk Signature Block V2)中,会对以后 APK 的其他局部署名。

从平安的角度 V2 会比 V1 更平安,V2 署名是考证全部打包后的 APK 文件,以是对其 APK 文件做“任何”修改都邑损坏署名。注重这里的任何是带引号的,V2 署名的署名块实际上是一个 K-V 的构造,能够向个中插进去一些简朴的数据而不损坏 V2 署名,这就是 V2 计划下,多渠道的计划思绪。

在引入 V2 计划的同时,也包管了向后兼容,旧的 JAR 署名计划仍然在旧的装备(Android 7.0 以下)中见效,而在较新的装备上,也会推断是不是运用 V2 署名,不是则依旧会去校验 V1 署名。

V2 计划处理了平安题目以及装置时考证的效力题目,然则它并没有处理前面提到的换署名题目。

2.3 Android 的 V3 计划

Android 9.0 中引入了新的署名体式格局,它的花样大致和 V2 相似,在 V2 插进去的署名块(Apk Signature Block V2)中,又增加了一个新快(Attr块)。

在这个新块中,会纪录我们之前的署名信息以及新的署名信息,以密钥转轮的计划,来做署名的替代和晋级。这意味着,只需旧署名证书在手,我们就能够经由历程它在新的 APK 文件中,变动署名。

V3 署名新增的新块(attr)存储了一切的署名信息,由更小的 Level 块,以链表的情势存储。

个中每一个节点都包罗用于为之前版本的运用署名的署名证书,最旧的署名证书对应根节点,体系会让每一个节点中的证书为列表中下一个证书署名,从而为每一个新密钥供应证据来证实它应当像旧密钥一样可托。

这个历程有点相似 CA 证书的证实历程,已装置的 App 的旧署名,确保掩盖装置的 APK 的新署名准确,将信托通报下去。

2.4 V3 署名的考证历程

Android 的署名计划,不管怎样晋级,都是要确保向下兼容。

在引入 V3 计划后,Android 9.0 及更高版本中,能够依据 APK 署名计划,V3 → V2 → V1 顺次实验考证 APK。而较旧的平台会疏忽 V3 署名并实验 V2 署名,末了才去考证 V1 署名。

全部考证的历程,如下图:

须要注重的是,关于掩盖装置的状况,署名校验只支撑晋级,而不支撑降级。也就是说装备上装置了一个运用 V1 署名的 Apk,能够运用 V2 署名的 Apk 举行掩盖装置,反之则不许可。

三、总结时候

Android 署名替代的题目,Google 已在斟酌了,9.0 新增的 V3 署名计划就是为了处理署名替代的。这些,一定都是提前预备。

署名逾期的题目,不须要太忧郁,我们只须要随着 Google 的措施就能够了。

末了小结一下结论,署名逾期的题目,在 Android 9.0 上新支撑的 V3 署名,已有处理的计划了。别的:

  1. V1 署名遵照 JAR 的署名体式格局,零丁考证 APK 紧缩包中的文件。
  2. V2 署名是针对 APK 文件的考证,将署名信息写入署名块中,增强了平安性和考证效力。
  3. V3 署名在署名块中又增加了新块(attr),由更小的 level 块,以链表的情势存储多个证书。
  4. 在 V3 计划中,最旧的证书为新块链表的根节点,以此对新证书署名,确保新证书准确有用。

V3 计划还没有正式开放,在最新版的 Build Tools 版本 28.0.3 中的 Apksigner,尚不支撑 V3 的 APK 署名计划。想尝鲜能够经由历程源代码自行编译。

从现有的材料来看,我比较关心的多渠道打包的支撑计划,在晋级到 V3 以后,旧的 V2 支撑的多渠道计划应当依旧有用(或许少许修改)。

期待上线后的详细结果。

你对 V3 署名有甚么设法主意或许疑问,迎接在留言区议论。如若本文对你有所资助,迎接留言、转发、点赞

reference:

Android APK signature scheme V3

Android Doc:运用署名

Android P V3 署名新特征

民众号背景复兴生长『生长』,将会获得我预备的进修材料,也能复兴『加群』,一同进修提高;你还能复兴『发问』,向我提议发问。
Last modification:March 25, 2020
如果觉得我的文章对你有用,请随意赞赏