自定义签名:让多个修补 App 之间能互调
为什么需要自定义签名
Android 系统在应用间通信时(通过 Intent、Provider、Service 等)会校验调用方的签名:
- 微信拉起 X 分享:微信会校验 X 的签名是否可信
- 修补版微信调修补版 X:如果两边签名一样,互相校验通过
- 修补版微信调原版 X:签名不一样,大概率被拒
LSPatch 默认给每次修补生成一个全新的随机签名。如果修补了两个 App,它们的签名是不同的——互相调用就会被拒绝。
解法:用同一个自定义签名修补所有需要互相配合的应用。
签名文件是什么
Android 应用签名用 Java 的 keystore 格式(.jks 或 .keystore)。一个 keystore 里包含:
- 证书(公钥)
- 私钥(签名时用)
- 密码(保护 keystore)
LSPatch 修补时需要这三个东西:keystore 文件路径、密码、证书别名(alias)。
生成自己的签名文件
电脑上用 Java 自带的 keytool(JDK 里有,JRE 不一定带):
keytool -genkeypair \
-v \
-keystore my_lspatch.jks \
-alias lspatch_key \
-keyalg RSA \
-keysize 2048 \
-validity 36500
参数解释:
-keystore my_lspatch.jks:输出的签名文件路径,自己取个名-alias lspatch_key:证书别名,LSPatch 里填这个-keysize 2048:密钥长度,标准值-validity 36500:有效期 100 年(单位天)
执行时会让你输入 keystore 密码、名字、组织等信息——前两个必填,后几个随便填。
重要:签名文件生成后备份好——丢了的话用新签名修补的 App 和旧签名修补的 App 签名又不一样了,还是不能互调。
在 CLI 里用自定义签名
java -jar lspatch.jar input\wechat.apk -o output \
--sign-keystore D:\Tools\sign\my_lspatch.jks \
--sign-alias lspatch_key \
--sign-password your_password
三个签名参数每次修补都要带上,而且所有应用用同一个签名文件。
在 Manager App 里用自定义签名
opatch/onpatch 分支的 Manager 设置里有签名相关的配置项。入口通常在:设置 → 签名设置 / 自定义签名。
不同版本叫法略有不同,但原理都是一样的:给 Manager 一个 keystore 文件路径和密码,它修补时就用这个签名。
原版 LSPatch 可能没有自定义签名选项——原版每次修补都生成新随机签名,要自定义签名只能用 CLI 模式。
常见场景
场景一:修补微博 + 修补微信,想让微博能分享到微信
- 生成一个签名文件
- 修补微博和修补微信都用这个签名(CLI 带
--sign-keystore等参数,或 Manager 里配好) - 安装两个修补版 → 测试微博分享到微信 → 应该能正常跳转
场景二:修补版微信 + 原版 X
这种情况无论怎么签名都解决不了——原版 X 的签名是官方的,和你的自定义签名永远不一致。要么两个都用你的签名修补,要么接受跨应用通信不工作。
场景三:便携模式分享给朋友
朋友那边如果也修补过其他 App,朋友自己的签名和你的签名不一样。你的便携版 App 发给朋友后,和朋友那边修补的 App 之间还是不能互调。要解决这个问题需要把你的签名文件也给朋友——注意私钥安全,别随便传给陌生人。
签名安全提醒
- 签名文件 = 数字身份证。丢了可以再生成新的,但旧签名修补的 App 和新签名修补的 App 永远无法互认
- 别随便把签名文件发给别人——拿到你签名的人可以冒充你"签发"任何 APK
- 签名文件里密码设复杂一点