实验步骤
1.直接安装我们实验要用的.apk
2、获取未签名的app
(1)删除META-INF文件
取消自动签名,直接删除改文
(2)查看此时app是否为未签名app
3、创建自签名证书
(1)打开keytool,生成私钥
keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
参数说明:
keystore
:密钥库文件名alias
:密钥别名validity
:有效期(单位:天)
按提示填写信息(如姓名、组织、城市等),设置密码(记住它,后面要用)。

4、对app签名
(1)使用 jarsigner
对 APK 签名:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore unsigned.apk my-key-alias
输入密钥库密码和密钥密码(如果设置了不同密码)。
5、安装app
(1)检查app的签名
jarsigner -verify -verbose -certs unsigned.apk
利用上述方法我们重新进行高强度签名。
这里我们直接使用MT管理器进行重签

查看重新签名后文件
(2)测试app是否能够正常安装
可以安装成功
总结
一、传统方案(JDK 自带)知识点速览
- 角色与文件
- keystore(.jks/.p12)= 包含 私钥 + 证书链
- alias = 私钥在库里的"名字"
- APK 本质 = ZIP,签名信息放在 META-INF(*.SF / *.RSA / *.MF)
- 两条命令
- 生成私钥
keytool -genkeypair -keystore xxx.jks -alias xxx -keyalg RSA -keysize 2048 -validity 3650
- 签名
jarsigner -sigalg SHA256withRSA -digestalg SHA-256 -keystore xxx.jks apk.apk alias
- 生成私钥
- 验证
jarsigner -verify -verbose -certs apk.apk
出现 jar verified 即可。 - 缺点
❌ 仅支持 V1 签名方案(JAR 签名)
❌ 对 ZIP 内容顺序/压缩方式敏感,无法对齐后签名
❌ 不支持 旋转密钥、密钥轮换
❌ 弱算法(SHA1/MD5)已被 Java 标记为 "视为未签名"
二、先进方式:Google 官方 APK Signature Scheme
-
工具升级
- apksigner (Android SDK/build-tools 24.0.3+)同时支持 V1(JAR)+ V2(APK 全文)+ V3(密钥轮换)+ V4(增量/ADB)
- zipalign 必须在 apksigner 之前 运行,保证内存对齐。
-
完整流程(推荐脚本)
`# 1. 对齐 zipalign -v -p 4 unsigned.apk aligned.apk
# 2. 签名(V1+V2+V3 全开) apksigner sign --ks release.jks --ks-key-alias release --out signed.apk aligned.apk
# 3. 验证 apksigner verify -v --print-certs signed.apk`
输出
Verified using v1 scheme (true), v2 scheme (true), v3 scheme (true)
即通过。 -
密钥与轮换
-
V3 方案支持 密钥轮换 :旧密钥 + 新密钥 交叉签名 ,可实现 无损更换签名证书(用户可无缝更新)。
-
旋转命令
apksigner rotate --out new.keystore --old-signer \\ --ks old.jks --new-signer --ks new.jks
-
-
算法与兼容性
- 默认使用 SHA-256 / RSA-2048(也可 ECC:SHA-256 / ECDSA-P-256)
- Android 7.0+ 支持 V2;Android 9.0+ 支持 V3;Android 11+ 支持 V4。
- 同时开启多版本 向下兼容 :低版本只识别 V1,高版本优先校验 V2/V3,速度+安全性双提升。
-
CI/CD 集成
- Google Play App Signing 强制要求上传 V2+ 签名;
- 在 GitHub Actions / GitLab CI 里加两步即可:
zipalign + apksigner sign --ks-key-alias ${``{ secrets.ALIAS }} --ks-key-pass pass:${``{ secrets.KP }} --ks-pass pass:${``{ secrets.KSP }} ...
- 本地调试/老旧教程 :jarsigner 够用,但记得 SHA-256 以上算法。
- 上架 Play / 新应用 :zipalign → apksigner 一步到位,同时开启 V1+V2+V3。
- 长期维护 :启用 Google Play App Signing + V3 密钥轮换,以后证书过期也能无缝迁移。