jixiaoyong / ApkSigner

A GUI-based Apk Signing Utility | 一款带GUI的Apk签名程序
GNU General Public License v3.0
153 stars 13 forks source link

[BUG] window系统上签名报错null cannot be cast to non-null type <root>.CommandResult,Success<*> #8

Open KeepDreamHCQ opened 7 months ago

KeepDreamHCQ commented 7 months ago

系统类型

Windows

系统版本

window

软件版本

1.1.2

问题描述

签名key和build-tools都配置好了,点击签名的时候报错 ![Uploading 73F6D9AD3A43032155383030EDD41CBF.png…]()

复现步骤

1. 2. 3.

KeepDreamHCQ commented 7 months ago

73F6D9AD3A43032155383030EDD41CBF

jixiaoyong commented 7 months ago

推测是签名配置信息有误,然后签名失败了,程序没有正确处理这种异常。

建议

KeepDreamHCQ commented 7 months ago

包再给个链接呗,过期了

KeepDreamHCQ commented 7 months ago

试了一下 -》 检查一下签名信息:可以在【签名信息】-> 【重新选择签名】-> 【编辑按钮】查看修改已有签名 没有效果,还是这个错误

jixiaoyong commented 7 months ago

包再给个链接呗,过期了

可以在这里下载新的测试包:https://github.com/jixiaoyong/ApkSigner/releases/tag/v1.1.3-20240311104223-alpha

这个包处理了这个错误,并且可查看出错信息,可以把错误信息贴上来方便定位问题。

KeepDreamHCQ commented 6 months ago

我试了三个签名,其中有一个签名会报错。在正常项目使用中是没有问题的,配置的签名信息都是正确的。 错误信息:

[1] H:\Desktop\x.apk

Failed to load signer "signer #1"java.io.IOException: Invalid keystore format at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:663) at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56) at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224) at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70) at java.security.KeyStore.load(KeyStore.java:1445) at com.android.apksigner.ApkSignerTool$SignerParams.loadKeyStoreFromFile(ApkSignerTool.java:833) at com.android.apksigner.ApkSignerTool$SignerParams.loadPrivateKeyAndCertsFromKeyStore(ApkSignerTool.java:723) at com.android.apksigner.ApkSignerTool$SignerParams.loadPrivateKeyAndCerts(ApkSignerTool.java:663) at com.android.apksigner.ApkSignerTool$SignerParams.access$500(ApkSignerTool.java:615) at com.android.apksigner.ApkSignerTool.sign(ApkSignerTool.java:269) at com.android.apksigner.ApkSignerTool.main(ApkSignerTool.java:89)

jixiaoyong commented 6 months ago

请问签名失败的这个签名文件,是什么格式的,用什么命令创建的,你在设置里面使用的build-tools版本是多少?

查了一些资料,这个错误好像是签名文件和android sdk/build-tools中的apksigner版本或者java版本不匹配导致的。

建议查看一下出错的签名对应的项目中用的java版本和buildToolsVersion,然后切换到对应的版本再试一下。 或者方便的话可以用同样方式生成一个临时签名发出来我这边定位一下问题

这个是ApkSigner默认的签名命令,供参考:

build-tools/34.0.0/apksigner sign -v --ks 222 --ks-key-alias 22 --key-pass pass:2222 --ks-pass pass:22 --v1-signing-enabled true --v2-signing-enabled true --v3-signing-enabled true --v4-signing-enabled true --out /Users/xxx/dev/temp/com.xxx.com_signed_signed_signed.apk /Users/xxx/dev/temp/com.xxx.com_signed_signed.apk

参考资料: https://www.jianshu.com/p/7b5e2919f50a https://stackoverflow.com/questions/1052700/java-io-ioexception-invalid-keystore-format https://knowledge.broadcom.com/external/article/218825/keytool-command-returns-invalid-keytore.html

KeepDreamHCQ commented 6 months ago

我是通过Android Studio的Build -> Generate Signed Bundle -> APK -> Create new... 生成的签名文件,build-tools版本28.0.3,我生成了一个test的签名文件,也会报错,我提供给你。签名密码:test123、别名:test test.jks.zip

jixiaoyong commented 6 months ago

我使用你的签名文件, 然后分别尝试了:

建议在ApkSigner的【设置信息】处修改你使用的build-tools版本后再次尝试签名

签名信息:

keytool -printcert -jarfile /Users/xxx/dev/temp/xxx_signed_signed.apk
Signer #1:

Certificate #1:
Owner: L=xx
Issuer: L=xx
Serial number: 37780402
Valid from: Tue Mar 12 10:59:37 CST 2024 until: Sat Mar 06 10:59:37 CST 2049
Certificate fingerprints:
     SHA1: 23:12:A5:75:AB:E7:28:BC:67:B1:44:23:0D:95:5E:08:C2:02:6D:3F
     SHA256: A8:03:3A:CE:1C:63:DB:89:0A:35:3D:D0:DB:EA:9B:00:47:6F:2C:F9:C9:4F:06:B5:03:2B:FE:5E:67:57:84:39
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

...
KeepDreamHCQ commented 6 months ago

诶?我现在测试的时候配置的配置信息就是build-tools版本30.0.3的情况下,还是会报错。 E5940BD251238505AB5E2DBE85D01F17 62C3943E5665BD84A89419CC861116E4

jixiaoyong commented 6 months ago

我这边使用上述签名没有复现“java.io.IOException: Invalid keystore format”这个问题,所以只能猜想,如果我们的build-tools版本一致的话,会不会是java版本有差异?

比如android studio创建签名文件的java版本和执行签名时的java环境版本有差异。

我刚刚分别在macOS和windows上面测试了v1.1.3-20240311104223-alpha,按照如下的配置: WXWorkCapture_17102260065970

WXWorkCapture_17102245155859 WXWorkCapture_17102245271151

其中windows上java版本为:

PS C:\Windows\System32> java -version
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

macOS上java版本为:

java --version
openjdk 11.0.22 2024-01-16 LTS
OpenJDK Runtime Environment Corretto-11.0.22.7.1 (build 11.0.22+7-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.22.7.1 (build 11.0.22+7-LTS, mixed mode)

对于build-tools版本为30.0.3可以签名成功。

其他的一些可能方案

“java.io.IOException: Invalid keystore format”一些可能的解决方案: