【Android 教程系列第 28 篇】Android 分别使用 jarsigner 和 apksigner 对 APK 签名(v1、v2 签名)的详细教程

这是【Android 教程系列第 28 篇】,如果觉得有用的话,欢迎关注专栏。

为了增加 Apk 的安全性,防止反编译,我们会对开发的 Apk 做签名处理,如果要上架应用商店,部分还会要求 Apk 必须加固后才能上架。

而对 Apk 签名,本篇博客提供两种工具,下面是文章正文。

操作系统:macOS BigSur 11.4 M1,java 版本: 1.8.0_211 。

注:给 Apk 签名前需要生成密钥 keystore ,如果你不会,可以参考这两篇博客

一:jarsigner 和 apksigner 两种签名工具的介绍

jarsigner

jarsigner 是 JDK 提供的针对 jar 包签名的工具,如果你本地已经安装了 Java 环境,会自带 jarsigner ,

比如我的 jarsigner 工具的位置在

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/jarsigner

效果图如下
在这里插入图片描述

apksigner

apksigner 是 Google 官方提供的针对 Android Apk 签名和验证的专用工具,位于 Android SDK / build-tools / SDK 版本 / apksigner

以我本地的 Android SDK 30.0.2 版本为例, apksigner 工具的位置在

/Users/suxing/Library/Android/sdk/build-tools/30.0.2/apksigner

效果图如下

在这里插入图片描述
如果你用的是 Android Studio 或者 IDEA ,安装这两个编辑器时会自动下载 Android SDK ,所以 apksigner 工具也不需要另外安装。

不过,无论是 apk 包 还是 jar 包,其本质都是 zip 格式的压缩包,如果只针对 v1 签名的话,两者的签名过程其实差不多。

apksigner 工具默认同时使用 v1 和 v2 签名,以兼容 Android 7 以下的系统版本。

二:简单了解 v1 签名和 v2 签名的区别

注:该段描述主要参考链接地址为 点击此处,如有描述不当之处,欢迎指正。

v1 签名

在 Android 7.0 (即 Android N,Android Api 24) 以下的版本,只能使用旧签名方案,也就是 v1 签名。

v1 签名使用 JDK 的 jarsigner 工具,对 zip 压缩包的每个文件进行验证,签名后仍可对压缩包进行修改、移动、重新压缩文件。

v2 签名

自 Android 7.0 开始,Google 新增了 v2 签名方案。

v2 签名使用 Google 自带的 apksigner 工具,对 zip 压缩包的整个文件进行验证,签名后不能修改压缩包,包括 zipalgin 。

如果你对 v2 签名的 apk 解压,没有发现签名文件,重新压缩后 v2 签名失效,这说明 v2 签名是对整个 Apk 进行签名验证。

v2 签名相对 v1 签名的优点

  • 因为不能修改压缩包,所以 v2 签名会更安全。
  • v2 签名是对整个 Apk 进行签名验证,不需要解压验证,所以签名验证的时间会更短。

三:对 Apk 签名

我在 Downloads 文件夹下新建了一个未签名的 Apk 和一个密钥库 keysotre,如下图所示
在这里插入图片描述
先用 keytool -printcert -jarfile 命令查看该 Apk 是否签名,如下图所示
在这里插入图片描述
当前 Apk 显示未签名,下面分别介绍如何用 jarsigner 和 apksigner 对 APK 签名。

方式一:jarsigner

jarsigner 只支持 v1 签名,先来看下使用命令,下面命令中涉及到路径的都是文件的绝对路径。

jarsigner -verbose -keystore 证书签名文件路径 -signedjar 签名后新Apk路径.apk 要签名的Apk路径.apk 证书签名别名

在终端输入命令后按回车,然后根据提示输入密钥库的密码后开始签名,如下图所示
在这里插入图片描述
因为 jarsigner 是对每一个文件进行签名,签名过程中输出的信息比较多,这里我直接截图到最后,如下图所示
在这里插入图片描述
在 Downloads 文件夹下新生成了一个 signed.apk 文件,
在这里插入图片描述
我们对 signed.apk 这个文件用 keytool -printcert -jarfile 命令查看该 Apk 是否签名,
在这里插入图片描述
可以看到已经成功签名,使用 jarsigner 对 Apk 签名,会新生成一个 Apk 文件,老的未签名的 Apk 文件不会受其影响,这点和 apksigner 的 v2 签名是不一样的。

方式二:apksigner

apksigner 默认同时支持 v1 和 v2 签名,先来看下使用命令,下面命令中涉及到路径的都是文件的绝对路径。

apksigner sign --ks 证书签名文件路径 --ks-key-alias 证书签名别名 要签名的apk路径.apk

在终端输入命令后按回车,然后根据提示输入密钥库的密码后开始签名,如下图所示
在这里插入图片描述
输入密钥库的密码后,直接就输出完毕了,什么情况?这就完成了?

是的,因为 apksigner 是对整个 Apk 包进行验证签名,所以没有其它的输出信息。

回到 Downloads 文件夹后,如下图所示
在这里插入图片描述
会发现多了一个后辍名为 .idsig 的,这个可以不用处理,直接删掉也没问题。

除了这个外,你会发现并没有新生成一个 Apk 文件,这是因为 apksigner 是直接对未签名的 Apk 包进行签名,我们用 keytool -printcert -jarfile 命令查看 allensu.apk 是否签名,如下图所示
在这里插入图片描述
可以看到,最原始的未签名的 allensu.apk 也已签名。

四:检查 Apk 是否已签名 v1、v2、v3、v4

在终端输入如下命令即可

apksigner verify -verbose -print-certs 要检查的Apk路径.apk

如下图所示
在这里插入图片描述
可以看到,allensu.apk 已签名了 v1、v2 和 v3,关于 v4 签名可以暂时不用考虑。

至此,关于 Android 分别使用 jarsigner 和 apksigner 对 APK 签名(v1、v2 签名)的教程便介绍到这里。

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。


结束语

技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。

最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。

猜你喜欢

转载自blog.csdn.net/qq_42351033/article/details/122301020