Apktool 3.0.0
This is a major release with significant breaking changes. Please read carefully before upgrading.
Breaking Changes
Dropped Support
- aapt1 support removed - Apktool now uses aapt2 only.
- 32-bit platforms no longer supported - Only 64-bit platforms are supported
-api / --api-leveloption removed - API level is now automatically detected- Short flags removed for advanced options - Advanced options now use long-form flags only
Command Changes
| Category | v2 | v3 |
|---|---|---|
| decode | -api/--api-level | Removed |
| decode | --only-main-classes | Removed |
| decode | -b/--no-debug-info | --no-debug-info |
| decode | -k/--keep-broken-res | --keep-broken-res |
| decode | -m/--match-original | --match-original |
| decode | -resm/--res-resolve-mode | --res-resolve-mode |
| decode | remove, dummy, keep | default, greedy, lazy |
| decode | — | -a/--all-src (new) |
| decode | — | --ignore-raw-values (new) |
| build | --use-aapt1 | Removed |
| build | -api/--api-level | Removed |
| build | -a/--aapt | --aapt |
| build | -c/--copy-original | --copy-original |
| build | -d/--debug | --debuggable |
| build | -n/--net-sec-conf | --net-sec-conf |
| build | -na/--no-apk | --no-apk |
| build | -nc/--no-crunch | --no-crunch |
| other | efd/empty-framework-dir | cf/clean-frameworks |
aapt1 Removal
With new features introduced to the resources.arsc we noticed aapt1 no longer receiving updates from the official Android Open Source Project. This meant it was time for us to drop it as well so we can evolve Apktool with its integration with the more robust aapt2.
32-bit Removal
On that same token, AOSP was making it more and more difficult to build native 32 bit binaries out of the project. With Android saying goodbye to 32 bit and computers moving on to 64 bit a long time ago we could reduce our footprint with dropping 32 bit.
-api / --api-level Removal
A large part of our support issues were end users mix and matching api versions to trick baksmali or smali to do a specific task. This always caused more problems than intended so now Apktool properly reads the intended api version and passes that on to baksmali automatically.
Short Flag Removal
As we took a look at all CLI options Apktool offered it was a lot. It didn't seem fair that a lot of advance options were hogging single letter short flags that may rarely be executed. With dropping all short flags from advanced options and enforcing a single letter short value we introduced a little shortcut on multiple flags - allowing you to chain them together like vfo.
Resource Modes
Historically we had remove, dummy and keep which didn't truly accurately respect their purpose. Now we have:
default- Adds dummy entries only for resources that cannot be resolved.greedy- Adds dummy entries for all missing resources at end of each package.lazy- Ignores resources that are missing or cannot be resolved.
This also allowed us to majorly clean up the serialization of dummy resources properly resolving the item/bag type. With unifying this behavior we retired APKTOOL_MISSING_* for only APKTOOL_DUMMY_* resource names.
Clean Frameworks
With our CLI cleanup we could retire the oddly named -efd / --empty-framework-dir with a generic cf / --clean-frameworks. We also added a few flags for this execution.
-a/--all- Include all framework files regardless of tag.-p/--frame-path <dir>- Set the path for framework files.-t/--frame-tag <tag>- Suffix the framework files with that tag.
This allows a fine-grained control on cleaning up frameworks specific to directories or tags if you manage a complex set of framework files.
Main Classes vs All Classes
In Apktool v2 we had an option called --only-main-classes which locked Apktool down to only disassembling the .dex files in the root of the project in the form of classes[#].dex. This was added because some applications included encrypted or malformed dex files outside the root which our greedy parser discovered and crashed attempting to parse.
In v3 that option is removed and now the default, with the reversal option of -a / --all-src to include all those files. This will be used at your own risk as those dex files may not be in a form ready for disassembly.
Changes to output
apktool.yml Changes
packageInforenamed toresourcesInfo.forcedPackageIdrenamed topackageId.
Output Format Changes
- Resource types may be properly aligned (ie
<dimen name="foo">instead of<item type="dimen" name="foo">) - Hex integer values now use compact form (
0x20instead of0x00000020) - Color values now represent the format from the original APK
- Modern Android standards adopted:
dpused instead ofdipmatch_parentused instead offill_parent
- [#3820] Drop support for aapt1. (Thanks IgorEisberg)
- [#3885] Drop support for 32-bit platforms. (Thanks IgorEisberg)
- [#3885] Drop short flags for any advanced options. (Thanks IgorEisberg)
- [#3885] Drop
-api / --api-leveloption for automatic detection. (Thanks IgorEisberg) - [#3885] Support disassembling resources not in
res|r|Rfolders. (Thanks IgorEisberg) - [#3888] Support new
BinaryResourceParser,ResChunkPullParserandBinaryDataInputStreamfor modern disassembly for resources. (Thanks IgorEisberg) - [#3885] Change all short commands to a single character to enable multiple commands like
-vfofor-v -f -o. (Thanks IgorEisberg) - [#3885] Change
efd|empty-framework-dirtocf|clean-frameworks. (Thanks IgorEisberg) - [#3885] Change
packageInfotoresourcesInfoinapktool.ymlrepresenting all transformation options. (Thanks IgorEisberg) - [#3885] Change hex integer values to preferred compact form. (
0x20instead of0x00000020) (Thanks IgorEisberg) - [#4001] Change temporary files to be prefixed with binary name (ie aapt2). (Thanks jpstotz)
- [#4041] Change default resolve mode to
KEEP(DEFAULTin v3) instead ofREMOVE. (Thanks IgorEisberg) - [#4044] Change resolve modes to
default,greedyandlazyto improve serialization. (Thanks IgorEisberg) - [#3885] Fix all
<item>tags to properly reference their respective resource types. (Thanks IgorEisberg) - [#3885] Fix usage of
dpinstead ofdipas a more modern development standard. (Thanks IgorEisberg) - [#3885] Fix usage of
match_parentinstead offill_parentas a more modern development standard. (Thanks IgorEisberg) - [#3885] Fix color values to represent the format they were in the original apk. (Thanks IgorEisberg)
- [#3994] Fix odd integer encoding behavior as a string. (Thanks IgorEisberg)
- [#3994] Fix support for feature flags prefixed with exclamation mark. (Thanks IgorEisberg)
- [#3997] Fix building on headless CI systems.
- [#4041] Fix entry spec naming to account for malicious or invalid spec names. (Thanks IgorEisberg)
- [#4041] Fix injection of entries to account for stripped apks. (Thanks IgorEisberg)
- [#4059] Fix handling of styled strings that fail valid checks. (Thanks IgorEisberg)
- [#3767, #3943] Swap to google/smali built from source due to upstream abandonment.
- [#3810] Fix assumption of resources and move to source of truth of
resources.arsc. (Thanks IgorEisberg) - [#3905] Fix maven pipeline for modern Sonatype publishing.
- [#3990] Upgrade
guavato33.5.0-jre. - [#4025] Upgrade
commons-clito1.11.0. - [#4021] Upgrade
commons-ioto2.21.0. - [#4038] Upgrade
commons-textto1.15.0. - [#3998, #4026] Upgrade
commons-lang3to3.20.0. - [#4003, #4080] Upgrade
gradle/actionsto5.0.1. - [#4011] Upgrade
github/codeql-actiontov4. - [#4017] Upgrade
xmlunit-legacyto2.11.0. - [#4018, #4050] Upgrade
actions/upload-artifacttov6. - [#4033] Upgrade
actions/checkouttov6. - [#4031, #4064, #4090] Upgrade
r8to9.0.32.
v3.0.1 was quickly released due to a bugged GitHub release (missing artifacts) and is identical to v3.0.0 in content.
Download now at Bitbucket, Maven
- md5 -
3f28827470d2b5b04265801230d7bb27 - sha256 -
b947b945b4bc455609ba768d071b64d9e63834079898dbaae15b67bf03bcd362
This post was released with commentary at: https://connortumbleson.com/2026/02/22/apktool-v3-0-0-released/

