An APK is an ordinary ZIP archive. The ZIP layer adds nothing Android-specific except the APK Signing Block before the central directory and the alignment rules below. This page lists the entries an APK holds.
Entries
| Path | Contents |
|---|---|
AndroidManifest.xml | The app manifest: package name, version, components, permissions and platform requirements. Stored as binary XML, not text. |
classes.dex, classes2.dex… | The app’s code as Dalvik Executable bytecode. |
resources.arsc | The compiled resource table: the values from res/values* and the paths of file resources, for every configuration. See resource table. |
res/ | File resources, in folders named by type and configuration qualifiers (below). |
assets/ | Files kept as they are, with no resource ID, read through AssetManager like a file system. |
lib/abi/libname.so | Native shared libraries (ELF), one folder per ABI. |
META-INF/ | The v1 (JAR) signature: MANIFEST.MF, NAME.SF and NAME.RSA, .DSA or .EC; see signed JAR files. |
stamp-cert-sha256 | SHA-256 of the source stamp certificate, when the APK carries a source stamp. |
Resource folders
Each folder under res/ is a resource type, optionally followed by
configuration qualifiers joined with dashes, in a fixed order of precedence, such as
drawable-night-hdpi or values-b+sr+Latn+RS. The qualifiers are
the same settings as the configuration
fields of the resource table (MCC and MNC, language and region, grammatical gender,
colour gamut, HDR, UI mode, night mode, density, touchscreen, keyboard, navigation,
API level and the screen size qualifiers).
| Folder | Holds |
|---|---|
drawable | Bitmaps (PNG, .9.png nine-patches, JPEG, GIF) and XML drawables (state lists, shapes, animation drawables and others) |
mipmap | Launcher icons for each density |
raw | Any file, kept as it is but given a resource ID |
values | XML of simple values (strings, integers, colours, arrays, styles); each child of <resources> is one resource. Compiled into resources.arsc. |
xml | Any XML read at run time with Resources.getXml(), including configuration files |
font | Font files (TTF, OTF, TTC) or XML with a <font-family> |
layout, menu, anim, animator, color | View layouts, menus, animations and colour state lists (XML), which the documentation now calls obsolete for apps written with Compose |
Native library ABIs
The package manager looks for lib/primary-abi/libname.so,
then the secondary ABI’s folder, and copies the matches to the app’s native library
directory. An APK holding several ABI folders is a “fat APK”.
| Folder | Instruction set |
|---|---|
armeabi-v7a | 32-bit ARM with Thumb-2 and Neon; not for ARMv5 or v6 |
arm64-v8a | AArch64 (Armv8.0) |
x86 | IA-32 with MMX, SSE to SSE3 and SSSE3 |
x86_64 | x86-64-v2 (SSE4.1, SSE4.2, POPCNT and more) |
armeabi, mips, mips64 | ARMv5 and MIPS; support removed in NDK r17 |
Alignment
- zipalign makes every uncompressed entry start at an offset aligned
to 4 bytes from the start of the file, by changing the size of the extra field in the
local file headers, so that Android can
mmapit. With-P 16it aligns uncompressed.sofiles to 16 KiB pages (valid sizes 4, 16 and 64; the older-pmeans 4 KiB). - With
apksigner(v2 and later), alignment must be done before signing; withjarsigner, after. resources.arsc: apps that target Android 11 (API level 30) or higher cannot be installed if it is compressed or not aligned on a 4-byte boundary.- 16 KB pages: from Android 15 devices may use 16 KB memory pages. Uncompressed shared libraries must then be 16 KB zip-aligned and their ELF segments 16 KB aligned. On Google Play, apps that target Android 15 or higher must support 16 KB pages on 64-bit devices; from 1 February 2027 updates that do not cannot be released.
- Apps that target Android 11 must also be signed with scheme v2 or higher, not only v1.
Split APKs and app bundles
Since Android 5.0 (API level 21) an app can be installed as several APKs treated as
one: a base APK, configuration APKs (native libraries
and resources for one density, CPU architecture or language) and feature module
APKs. Google Play builds them from an Android App Bundle (.aab),
which has one folder per module (base/, feature modules named by their
split attribute, asset packs), each holding manifest/,
dex/, res/, lib/, assets/,
root/ (files moved to the APK’s root) and Protocol Buffer descriptions
such as resources.pb and native.pb; plus
BundleConfig.pb and BUNDLE-METADATA/ at the top.
Sources
Android developer documentation: “App resources overview” (resource directories and
qualifiers), “Android ABIs” (ABI table, lib/ paths, install-time
extraction), “zipalign”, “Behavior changes: apps targeting Android 11” (compressed
resource files, scheme v2 requirement), “Support 16 KB page sizes”, “The Android App
Bundle format” and its split APK overview; AOSP apksig
SourceStampConstants (stamp-cert-sha256).