android app签名详解

article/2025/10/19 0:05:58

本文及文中图片转自:https://mp.weixin.qq.com/s?__biz=MzIwMzYwMTk1NA==&mid=2247493825&idx=1&sn=e926da39c6bd51397851d7e330d6ba24&chksm=96ce498ca1b9c09a7865264b26eadcf27bd012e9acc999b3eb3ca5c440266642763b6be27416&mpshare=1&scene=23&srcid=#rd

一、序

在将 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 签名,已经有解决的方案了。

另外:

V1 签名遵循 JAR 的签名方式,单独验证 APK 压缩包中的文件。
V2 签名是针对 APK 文件的验证,将签名信息写入签名块中,增强了安全性和验证效率。
V3 签名在签名块中又增加了新块(attr),由更小的 level 块,以链表的形式存储多个证书。
在 V3 方案中,最旧的证书为新块链表的根节点,以此对新证书签名,确保新证书正确有效。
V3 方案还没有正式开放,在最新版的 Build Tools 版本 28.0.3 中的 Apksigner,尚不支持 V3 的 APK 签名方案。想尝鲜可以通过源代码自行编译。

从现有的资料来看,我比较关心的多渠道打包的支持方案,在升级到 V3 之后,旧的 V2 支持的多渠道方案应该依然有效(或者少量改动)。

期待上线后的具体效果。


http://chatgpt.dhexx.cn/article/sFgEg7dh.shtml

相关文章

Android应用签名之AS签名

废话不多说直接上图 如之前未生成jks文件则,点击create new .. 这里只要输入几个必要项 Key store path(生产key文件的保存路径 ) Key store password(key 存储密码) Key alias(key别名) Key p…

安卓应用程序的签名

签名安卓应用程序 Android应用以它的包名作为唯一标识。如果在同一部手机上安装两个包名相同的应用,后面安装的应用就会覆盖前面安装的应用。为了避免这种情况的发生,Android要求对作为产品发布的应用进行签名。 签名主要有如下两个作用: 1.确…

android app签名方法

1、生成签名文件 在android studio 里操作如下: 填完即可。 会产生这个签名文件。 2、签名app 到jdk的bin文件夹下输入下面命令: jarsigner -verbose -keystore D:\appkey\geming.jks D:\svn\Bigdata\IOT\iot-village-app\village\platforms\android\…

Android应用签名

为了要签名? 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的。 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序&#xff0c…

Android App签名

Andriod应用程序如果要在手机或模拟器上安装,必须要有签名! 1.签名的意义   为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一…

Android开发给apk签名

前言 最近360加固助手签名突然收费了,加固完后要自己签名了。在此记录一下自己使用命令行签名步骤。 之后又更新了加固助手,点击自动签名提示如下: 之前没提示工具包手动签名,平时也就加固下应用,也没太注意工具包&…

Andorid进行签名的方式

目录 Android签名的简介 1.Android签名的作用 2.签名的方式 2.1签名方式的比较 3.在AS上操作的一般步骤(手动签名) 3.1 在AS操作步骤如下图 4.apk常用的签名方法(系统签名)有两种 4.1 使用工具对apk进行签名 4.2 在Ubuntu系统下,通过命令行进行签名 Androi…

Android APP的签名

Android APP的签名 Android项目以它的包名作为唯一的标识,如果在同一部手机上安装两个包名相同的APP,后者就会覆盖前面安装的应用。为了避免Android APP被随意覆盖,Android要求对APP进行签名。下面介绍对APP进行签名的步骤 1、选择builder菜…

keil中c语言定义数组,如题,KeilC51位变量能不能定义数组

公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解。 话题:如题,KeilC51位变量能不能定义数组回答:试试呗我的结论是不行 会报错 error C168: array of bit 手册描述:An array may not have type bi…

【C 语言】数组 ( 数组类型表达 | 定义数组类型 )

文章目录 总结一、数组类型表达二、定义数组类型三、代码示例 总结 // 定义类数组数据类型 int [10] , 类型别名为 ArrayTypetypedef int (ArrayType)[10];// 与 int array[10] {0}; 作用相同ArrayType array2 {0};一、数组类型表达 C 语言中的 数据类型 分为 基础数据类型 ,…

JavaScript定义数组

JavaScript定义数组 JavaScript中定义数组的方法: 定义时直接给数组元素赋值 var arr[值1,值2,值3....]定义一个空数组 var arr[];定义一个空数组并通过索引来赋值 var arrnew Array(); arr[0]1; arr[1]2;提示: JavaScript为数组提供了一个length属…

用卷积公式计算“独立随机变量之和”的概率分布 Distribution of sum of independent Rayleigh random variables

https://math.stackexchange.com/questions/1019375/distribution-of-sum-of-independent-rayleigh-random-variables

信号处理的卷积公式

《信号与系统》关于卷积的公式: 离散 序列卷积和 周期卷积 循环卷积 连续 卷积积分

卷积基本计算公式

1. 理论公式 2. tensorflow中使用 输入图片大小 WW Filter大小 FF 步长strides S padding的像素数 P 输出大小为NxNpadding “SAME”时,会在图像的周围填 “0”,padding “VALID”则不需要,即 P0。一般会选“SAME”,以来减缓图…

卷积公式的理解,卷积其实就是叠加与衰减。

对于初学者,我推荐用复利的例子来理解卷积可能更直观一些: 小明存入100元钱,年利率是5%,按复利计算(即将每一年所获利息加入本金,以计算下一年的利息),那么在五年之后他能拿到的钱数…

卷积公式细谈

原文地址:http://www.ilovematlab.cn/thread-293710-1-1.html ————————————-conv2函数—————————————- 1、用法 Cconv2(A,B,shape); %卷积滤波 复制代码 A:输入图像,B:卷积核 假设输入图像A大小为ma x na,卷…

关于卷积公式的模型

在信号分析处理中,卷积是最重要的运算,但是一般计算中,关于卷积的“反褶”,“平移”,“累加和”这三个步骤,其计算步骤和卷积的实际意义,貌似“脱离”,从而影响对信号与系统相互作用…

【概率】常见分布(离散/连续)、卷积公式(实际意义与作用、公式、记忆法)

发现自己对各种分布不太熟悉,决定趁此机会整理一下,看有没有比较好的记忆方法。 各种分布最重要的理解它的实际意义,都是解决什么问题的,其次是公式的含义。 所以下面都按以下几点来展开:实际意义、数学表达、对表达式…

概率论中多元随机变量函数分布中的卷积公式原来是重积分换元

文章目录 重积分换元(雅克比行列式)卷积公式①:把$x$换掉 确定范围卷积公式做定义法来做Zmax{X,Y}Zmin{X,Y} 重积分换元(雅克比行列式) { x x ( u , v ) y y ( u , v ) \left\{\begin{matrix} xx(u,v)\\ \\ yy(u,v) …

详解卷积公式的物理意义

作者:Uncle Jack 日期:2020/03/15 分解思维 1. 人类科学有一个特点是喜欢使用分解的思维去理解分析很多复杂的事物,比如傅里叶级数把很多奇形怪状的函数分解成无穷多个三角函数,又比如力学分析中把单个力分解成直角坐标系中的的…