android - 使用 Apksigner 时出现“未找到中央目录记录的 ZIP 结尾”错误
问题描述
我正在使用 android 构建工具 (29.0.2) 附带的 apksigner 二进制文件。首先,作为 CI/CD 流程的一部分,我将一个未签名的 apk 文件上传到 Artifactory。在签名阶段,我从 Artifactory 下载了 apk(这是成功的),并尝试使用 apksigner 对文件进行签名,如下所示:
COMMAND: '/yarrak/sdk/android/build-tools/29.0.2/apksigner' sign --ks /yarrak/tool/gradle/jks/TST.jks --ks-pass "pass:siktasak123" --out /yarrak/var/data/build-dir/MOBO-JOB1/myfile-signed-r.apk /yarrak/var/data/build-dir/MOBO-JOB1/myfile-signed.apk
需要提及的事情:
- 我在签名之前创建了输出 apk 文件并将文件权限设置为 775
- 我在 Linux 环境中工作
- apk 文件从 MacOS 机器上传到 Artifactory
下面的命令抛出错误:
线程“主”com.android.apksig.apk.ApkFormatException 中的异常:格式错误的 APK:不是 com.android.apksig.ApkSigner.sign(ApkSigner.java:217) 上 com.android.apksig.ApkSigner.sign 的 ZIP 存档(ApkSigner.java:193) 在 com.android.apksigner.ApkSignerTool.sign(ApkSignerTool.java:340) 在 com.android.apksigner.ApkSignerTool.main(ApkSignerTool.java:83) 引起:com.android.apksig。 zip.ZipFormatException:在 com.android.apksig.ApkSigner.sign(ApkSigner.java:215) 的 com.android.apksig.apk.ApkUtils.findZipSections(ApkUtils.java:57) 中找不到 ZIP 中央目录记录的结尾。 . 3 更多
可能是什么原因?我虽然从 MacOS 机器上传到 Artifactory 时,未签名的 apk 文件可能会以某种方式损坏。
解决方案
我已经解决了这个问题。该问题不是由 Artifactory 上传引起的。
在我的开发场景中,除了 .apk 文件之外,在原始文件(apk)之后上传了一个 .json 文件,并且该 .json 文件是一个类似定义的文件,并且不包含您可能猜到的任何二进制文件。在上传阶段,我错误地将两个文件命名为相同(请注意变量和范围)。自然,在签名阶段,最后一个文件会覆盖我的待签名文件,而我的 apksigner 二进制文件无法对伪装成存档文件的 .json 文件进行签名。
推荐阅读
- html - 如何在 BS 中将文本环绕在图像周围,将文本置于移动设备上的图像下方
- spring-mvc - 如何在页面重新加载时在 JSP 页面中保留类型文件的输入
- python - Pandas Plotting 在 x 轴上显示所有日期值(matplolib 仅显示少数值),格式为 MMM-YYYY
- javascript - 使用 React Redux 时出现以下错误 - TypeError: Cannot read property 'id' of undefined
- swiftui - SwiftUI HealthKit 氧饱和度
- react-native - REACT NATIVE - Expo AV didJustFinish
- c - linux内核的linked_list的list_entry返回随机值
- spring - 在 application.properties 文件中使用 Azure DevOps 的可变组,还是使用安全文件更好?
- android - 无法解析 glide 数据集中的函数 getImageUrl()
- spring - @JsonIgnore 和 @JsonIgnoreProperties 有什么区别