Error When Decoding Manifest
Information
-
Apktool Version (
apktool -version) - 2.4.0 - Operating System (Mac, Linux, Windows) - Windows
- APK From? (Playstore, ROM, Other) - PlayStore & APKPure
Stacktrace/Logcat
F:\Workplace>apktool d DEC.apk
I: Using Apktool 2.4.0 on DEC.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\alepe\AppData\Local\apktool\framework\1.apk
Exception in thread "main" brut.androlib.err.RawXmlEncounteredException: Could not decode XML
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:148)
at brut.androlib.res.decoder.XmlPullStreamDecoder.decodeManifest(XmlPullStreamDecoder.java:154)
at brut.androlib.res.decoder.ResFileDecoder.decodeManifest(ResFileDecoder.java:161)
at brut.androlib.res.AndrolibResources.decodeManifestWithResources(AndrolibResources.java:204)
at brut.androlib.Androlib.decodeManifestWithResources(Androlib.java:136)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:122)
at brut.apktool.Main.cmdDecode(Main.java:167)
at brut.apktool.Main.main(Main.java:76)
Caused by: java.io.EOFException
at com.google.common.io.LittleEndianDataInputStream.readAndCheckByte(LittleEndianDataInputStream.java:226)
at com.google.common.io.LittleEndianDataInputStream.readInt(LittleEndianDataInputStream.java:116)
at brut.util.DataInputDelegate.readInt(DataInputDelegate.java:61)
at brut.androlib.res.decoder.AXmlResourceParser.doNext(AXmlResourceParser.java:890)
at brut.androlib.res.decoder.AXmlResourceParser.next(AXmlResourceParser.java:102)
at brut.androlib.res.decoder.AXmlResourceParser.nextToken(AXmlResourceParser.java:112)
at org.xmlpull.v1.wrapper.classic.XmlPullParserDelegate.nextToken(XmlPullParserDelegate.java:105)
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:141)
... 7 more
Steps to Reproduce
-
apktool d APKName.apk
Frameworks
If this APK is from an OEM ROM (Samsung, HTC, LG). Please attach framework files
(.apks that live in /system/framework or /system/priv-app) - using the usual framework apk
APK
If this APK can be freely shared, please upload/attach a link to it.
- PlayStore - https://play.google.com/store/apps/details?id=com.klab.yuhaku_maji_battle
- APKPure - https://apkpure.com/%E5%B9%BD%E9%81%8A%E7%99%BD%E6%9B%B8-100-%E6%9C%AC%E6%B0%97-%E3%83%9E%E3%82%B8-%E3%83%90%E3%83%88%E3%83%AB/com.klab.yuhaku_maji_battle
Questions to ask before submission
- Have you tried
apktool d,apktool bwithout changing anything?
- YES, -d won't work and I need to decode the manifest (only -r will work but is usless in my case)
- If you are trying to install a modified apk, did you resign it?
- not related to my issue
- Are you using the latest apktool version?
- yes, v2.4.0
This looks similar to the https://github.com/iBotPeaches/Apktool/issues/1131 issues...
~Ibuprophen
Confirmed.
I'm not sure about a fix for this because the manifest seems incorrect, but Android Studio / aapt are able to parse and present the file correctly. Anyway, here's what I found:
- APKTool seems to be able the decode most of AndroidManifest.xml - the file created in the output folder after the failure contains the end of the expected file (the closing 'manifest' tag)
- The AndroidManifest.xml in the APKs contains 2 namespaces:
<manifest xmlns:amazon="http://schemas.amazon.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android" ... - The decoding fails when 2 namespace-end chunks are expected, but only one is found.
- According to this post, the chunk header for namespace start looks like:
00 01 10 00 18and for namespace end it looks like01 01 10 00 18. - In the old version of the APK, the binary format of the AndroidManifest does include only a single namespace-end chunk, even though it has 2 namespace-start chunks.
- The end of the manifest from the new version:
000056e0 00 00 ff ff ff ff ff ff ff ff 46 00 00 00 03 01 |..........F.....|
000056f0 10 00 18 00 00 00 02 00 00 00 ff ff ff ff ff ff |................|
00005700 ff ff 8f 00 00 00 01 01 10 00 18 00 00 00 02 00 |................|
00005710 00 00 ff ff ff ff 2e 00 00 00 8c 00 00 00 01 01 |................|
00005720 10 00 18 00 00 00 02 00 00 00 ff ff ff ff 2d 00 |..............-.|
00005730 00 00 8b 00 00 00 |......|
00005736
- And from the old version:
00004900 00 00 00 ff ff ff ff 08 00 00 12 ff ff ff ff 03 |................|
00004910 01 10 00 18 00 00 00 2a 01 00 00 ff ff ff ff ff |.......*........|
00004920 ff ff ff 7d 00 00 00 03 01 10 00 18 00 00 00 4a |...}...........J|
00004930 00 00 00 ff ff ff ff ff ff ff ff 3d 00 00 00 03 |...........=....|
00004940 01 10 00 18 00 00 00 02 00 00 00 ff ff ff ff ff |................|
00004950 ff ff ff 7a 00 00 00 01 01 10 00 18 00 00 00 02 |...z............|
00004960 00 00 00 ff ff ff ff 28 00 00 00 77 00 00 00 |.......(...w...|
0000496f
In newer versions of the application the issue can no longer be reproduced, so I'm attaching a zip with thinner versions of the APKs and old/new manifest files.
2070-error-decoding-manifest.zip The zip contains:
- v5.7.5_apkpure.com.withoutAssetsAndLibs.apk and v4.0.1_apkpure.com.withoutAssetsAndLibs.apk - a smaller version of the APK mentioned in the issue description. The v5.7.5 one can be decompiled successfully.
- AndroidManifest.works.xml (from v5.7.5) and AndroidManifest.fails.xml (from v4.0.1) extracted from the APKs.
Thanks for the detailed research @Comnir. With the recent refactors and my increased knowledge of arsc/axml from those refactors this was easily patchable from your research.
It looks like either a complete mistake or some inner knowledge of AOSP not reading past EOF, so I do the same when reading axml chunks.
➜ 2070 apktool d 2070.apk -f
I: Using Apktool 2.8.2-22eb80-SNAPSHOT on 2070.apk
I: Loading resource table...
I: Decoding file-resources...
I: Loading resource table from file: /home/ibotpeaches/.local/share/apktool/framework/1.apk
I: Decoding values */* XMLs...
I: Decoding AndroidManifest.xml with resources...
W: AXML hit unexpected end of file at byte: 0x48F8
I: Regular manifest package...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
➜ 2070 apktool b 2070 --use-aapt2
I: Using Apktool 2.8.2-22eb80-SNAPSHOT
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk into: 2070/dist/2070.apk
➜ 2070
Will close when above PR is merged and sorry for the many year delay.