Drop a .apk to list its ZIP entries, count DEX files, detect lib/**/*.so, compute
SHA-256 with Web Crypto, and pull printable-string hints from binary AndroidManifest.xml.
The file is not uploaded to DroidXP. This is not a full AXML decode and not a substitute for apktool.
No file selected
Select an APK to analyze.
Use it when you already have an .apk and need a two-minute structural check: is the manifest present, how many DEX files shipped,
did the ABI split include the .so you expected, and does the SHA-256 match the file QA downloaded. Typical moments: a CI artifact before testers,
a Play upload that failed on version identity, or a sideload you do not want to install blindly.
Do not use it when you need a decoded AndroidManifest.xml tree, smali, resource IDs, or signing-block verification.
That is apktool, aapt / aapt2 dump, apksigner verify, or Play Console’s pre-launch report.
This page will not unpack an .aab.
The drop zone hands the file to JavaScript as an ArrayBuffer. JSZip (loaded from the CDN on this page) treats the APK as a ZIP
and walks every entry. We count names ending in .dex, flag paths under lib/ that end in .so, and note
AndroidManifest.xml, resources.arsc, and META-INF when they appear. Web Crypto
crypto.subtle.digest('SHA-256', buffer) hashes the entire file, not a single ZIP entry.
The packaged manifest is almost always binary AXML. We do not run a binary XML parser. We extract printable ASCII strings (length ≥ 4)
from the manifest bytes and regex-guess package=, versionName, and versionCode. Those hints are best-effort.
If the strings are UTF-16, obfuscated, or simply not stored as readable ASCII, the “Possible package” line will be empty even though the app is valid.
Limits and failure modes: JSZip must load (needs the network once for the library). Very large APKs can exhaust tab memory — you will see a hung UI or a thrown error, not a partial server-side job. Split APKs are valid ZIPs; you are inspecting that slice, not the reconstructed install set. If JSZip fails to parse the file, it was not a readable ZIP (wrong extension, truncated download, or a bundle).
Take a release APK named com.example.notes-release-24.apk, 18 MB. After drop, a healthy report looks like:
File: com.example.notes-release-24.apk SHA-256: 7f3c…a91b ZIP entries: 412 DEX files: 2 AndroidManifest.xml: present (binary AXML) Native .so libraries: detected under lib/ Possible package: com.example.notes Possible versionName: 2.4.0 Possible versionCode: 24003
Read it this way: two DEX files means multidex (or a companion classes2.dex) — expected for a non-trivial Kotlin app.
Native libs mean you should confirm the ABI you intended (arm64-v8a vs a leftover armeabi-v7a that bloats the download).
Compare the SHA-256 to the hash your Gradle job printed. If versionCode is missing from the heuristic block, do not assume the APK is unsigned —
switch to source XML in the Manifest Validator or run aapt dump badging.
versionCode as Play-authoritative. Play reads the binary manifest / bundle metadata, not our regex..so files live in config.arm64_v8a.apk..aab renamed to .apk. The ZIP may open; the layout is not an installable APK.Workflow write-up: How to analyze APK files without installing them. Next checks: APK String Extractor and Permissions Decoder.
No. The file is read in this tab with the File API and parsed by JSZip in memory. DroidXP does not receive the bytes as part of this tool.
Packaged manifests are binary AXML. This tool lists the archive and scans printable strings. It does not reconstruct the XML tree.
Any readable .apk ZIP works, including one split. .aab is a different format — use bundletool to produce APKs first.
The heuristic only sees ASCII strings in the binary manifest. Many builds will not expose package= that way. Use aapt or a decompiled manifest.
The library is loaded from a CDN. Offline or blocked third-party scripts produce “JSZip failed to load.” Allow that script or use a desktop unzip + aapt instead.