背景是我们打包出来是7z格式的压缩包,最近我在安装里面的包的时候,发现一直安装失败。报错提示这个:
adb install base.apk
$ Performing Push Install
$ base.apk: 1 file pushed, 0 skipped. 0.3 MB/s (11702337 bytes in 33.669s)
$ pkg: /data/local/tmp/base.apk
$ Failure [INSTALL_FAILED_INVALID_APK]
尝试 adb push base.apk /sdcard/download中,手动安装也是提示失败。
file base.apk
base.apk: Zip archive data, at least v0.0 to extract, compression method=deflate
我用jadx打开也是报错。
jadx.core.utils.exceptions.JadxRuntimeException: Failed to process zip file: /temp/base.apkat jadx.api.plugins.utils.ZipSecurity.visitZipEntries(ZipSecurity.java:148)at jadx.api.ResourcesLoader.defaultLoadFile(ResourcesLoader.java:159)at jadx.api.ResourcesLoader.loadFile(ResourcesLoader.java:154)at jadx.api.ResourcesLoader.load(ResourcesLoader.java:47)at jadx.api.JadxDecompiler.getResources(JadxDecompiler.java:433)at jadx.api.JadxDecompiler.load(JadxDecompiler.java:127)at jadx.gui.JadxWrapper.open(JadxWrapper.java:72)at jadx.gui.ui.MainWindow.lambda$loadFiles$0(MainWindow.java:520)at jadx.core.utils.tasks.TaskExecutor.wrapTask(TaskExecutor.java:166)at jadx.core.utils.tasks.TaskExecutor.runStages(TaskExecutor.java:142)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)at java.base/java.lang.Thread.run(Thread.java:1570)
Caused by: java.util.zip.ZipException: zip END header not foundat java.base/java.util.zip.ZipFile$Source.findEND(ZipFile.java:1695)at java.base/java.util.zip.ZipFile$Source.initCEN(ZipFile.java:1703)at java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1541)at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1504)at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:724)at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:251)at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:180)at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:194)at jadx.api.plugins.utils.ZipSecurity.visitZipEntries(ZipSecurity.java:130)... 12 common frames omitted
直到后面我用7z解压压缩包,而不是用mac系统自带的解压(Archive Utility),包才正常。
$ zipinfo ./app/build/channel/platform/base.apk
[./app/build/channel/platform/base.apk]End-of-central-directory signature not found. Either this file is nota zipfile, or it constitutes one disk of a multi-part archive. In thelatter case the central directory and zipfile comment will be found onthe last disk(s) of this archive.
zipinfo: cannot find zipfile directory in one of ./app/build/channel/platform/base.apk or./app/build/channel/platform/base.zip, and cannot find ./app/build/channel/platform/base.apk.ZIP, period.
$ zipinfo ./out/app/build/channel/platform/base.apk
Archive: ./out/app/build/channel/platform/base.apk
Zip file size: 11702331 bytes, number of entries: 1040
-rw-rw-rw- 0.0 unx 55 b- defN 81-Jan-01 01:01 META-INF/com/android/build/gradle/app-metadata.properties
-rw-rw-rw- 0.0 unx 6678548 b- defN 81-Jan-01 01:01 classes.dex
$ hexdump ok.apk > o.txt
$ hexdump fail.apk > f.txt
$ diff o.txt f.txt< 0b29030 3104 00f4 f400 b19b 0000 0000
---
> 0b22ec0 0000 0000 0000 0000 0000 0000 0000 0000
> *
> 0b29030 0000 0000 0000 0000 0000 0000
0b22ec0 0000 0000 0000 0000 0000 0000 0000 0000
看着就是Archive Utility解压7z的包,解压之后,0b22ec0 之后的数据出现了丢失,变成了*, 丢失的信息(zip END header)导致jadx解析失败,也导致 adb 安装失败。