apksigner签名APK报输入APK后存在意外参数(--out)错误
问题根因
报错本质是两个问题叠加导致:
- apksigner sign子命令有严格的参数位置要求:所有配置选项(--ks、--out、密码、别名等参数)必须全部放在待签名的输入APK路径之前,输入APK必须是整个命令的最后一个参数,后面不能跟任何其他内容。
- Build Tools 32.0.0版本自带的
apksigner.bat在Windows平台有已知传参bug:如果不切换到bat文件所在目录直接跨路径调用,脚本会错误截断参数,把第一个识别到的APK路径判定为输入文件,把后面的所有合法参数都判定为多余内容,抛出你看到的参数错误。
可直接执行的解决步骤
- 第一步:切换到对应版本Build Tools目录,规避bat脚本传参bug
cd C:\Users\你的实际用户名\AppData\Local\Android\Sdk\build-tools\32.0.0
- 第二步:按照正确参数顺序执行签名命令,注意不要把输入APK放在任何选项参数前面,同时不要把输出文件命名为和未签名包同名,避免覆盖原文件:
apksigner.bat sign ^ --ks D:\你的项目路径\app-release-key.jks ^ --ks-key-alias 你配置的密钥别名 ^ --ks-pass pass:你的密钥库密码 ^ --key-pass pass:你的密钥密码 ^ --out D:\你的项目路径\app-release-signed.apk ^ D:\你的项目路径\app-release-unsigned-aligned.apk
如果不想记多行参数,把上面的换行去掉写成一行即可。
- 第三步:如果执行上面的命令还是报同样的错,直接绕开有bug的bat脚本,调用同目录lib文件夹下的apksigner.jar执行(你之前找的bin路径下的jar包是错的,32.0.0版本的可执行jar在lib目录):
java -jar C:\Users\你的实际用户名\AppData\Local\Android\Sdk\build-tools\32.0.0\lib\apksigner.jar sign --ks D:\你的项目路径\app-release-key.jks --ks-key-alias 你配置的密钥别名 --ks-pass pass:你的密钥库密码 --key-pass pass:你的密钥密码 --out D:\你的项目路径\app-release-signed.apk D:\你的项目路径\app-release-unsigned-aligned.apk
- 第四步:签名完成后执行校验,确认签名有效,避免安装后启动失败:
apksigner.bat verify -v D:\你的项目路径\app-release-signed.apk
命令返回结果里v1、v2、v3签名校验均为true时,签名后的APK即可正常安装启动。
之前尝试方案失效的原因
- 用jarsigner签名后APP无法启动:jarsigner仅支持v1签名,targetSdkVersion 24及以上的应用要求必须带v2/v3签名,仅v1签名的APK在高版本Android系统上要么安装失败,要么安装后直接闪退。
- 参考网上的单命令执行报错:本质是跨路径调用32.0.0版本的apksigner.bat触发了脚本的传参bug,参数被错误截断导致。
- 之前调用jar包失败:找错了jar包路径,32.0.0版本的apksigner.jar存放在build-tools对应版本的lib目录下,而非bin目录。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

