Skip to main content

Apktool 3.0.0

Igor Eisberg
Maintainer of Apktool
Connor Tumbleson
Maintainer of Apktool
caution

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-level option removed - API level is now automatically detected
  • Short flags removed for advanced options - Advanced options now use long-form flags only

Command Changes

Categoryv2v3
decode-api/--api-levelRemoved
decode--only-main-classesRemoved
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
decoderemove, dummy, keepdefault, greedy, lazy
decode-a/--all-src (new)
decode--ignore-raw-values (new)
build--use-aapt1Removed
build-api/--api-levelRemoved
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
otherefd/empty-framework-dircf/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

  • packageInfo renamed to resourcesInfo.
  • forcedPackageId renamed to packageId.

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 (0x20 instead of 0x00000020)
  • Color values now represent the format from the original APK
  • Modern Android standards adopted:
    • dp used instead of dip
    • match_parent used instead of fill_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-level option for automatic detection. (Thanks IgorEisberg)
  • [#3885] Support disassembling resources not in res|r|R folders. (Thanks IgorEisberg)
  • [#3888] Support new BinaryResourceParser, ResChunkPullParser and BinaryDataInputStream for modern disassembly for resources. (Thanks IgorEisberg)
  • [#3885] Change all short commands to a single character to enable multiple commands like -vfo for -v -f -o. (Thanks IgorEisberg)
  • [#3885] Change efd|empty-framework-dir to cf|clean-frameworks. (Thanks IgorEisberg)
  • [#3885] Change packageInfo to resourcesInfo in apktool.yml representing all transformation options. (Thanks IgorEisberg)
  • [#3885] Change hex integer values to preferred compact form. (0x20 instead of 0x00000020) (Thanks IgorEisberg)
  • [#4001] Change temporary files to be prefixed with binary name (ie aapt2). (Thanks jpstotz)
  • [#4041] Change default resolve mode to KEEP (DEFAULT in v3) instead of REMOVE. (Thanks IgorEisberg)
  • [#4044] Change resolve modes to default, greedy and lazy to improve serialization. (Thanks IgorEisberg)
  • [#3885] Fix all <item> tags to properly reference their respective resource types. (Thanks IgorEisberg)
  • [#3885] Fix usage of dp instead of dip as a more modern development standard. (Thanks IgorEisberg)
  • [#3885] Fix usage of match_parent instead of fill_parent as 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 guava to 33.5.0-jre.
  • [#4025] Upgrade commons-cli to 1.11.0.
  • [#4021] Upgrade commons-io to 2.21.0.
  • [#4038] Upgrade commons-text to 1.15.0.
  • [#3998, #4026] Upgrade commons-lang3 to 3.20.0.
  • [#4003, #4080] Upgrade gradle/actions to 5.0.1.
  • [#4011] Upgrade github/codeql-action to v4.
  • [#4017] Upgrade xmlunit-legacy to 2.11.0.
  • [#4018, #4050] Upgrade actions/upload-artifact to v6.
  • [#4033] Upgrade actions/checkout to v6.
  • [#4031, #4064, #4090] Upgrade r8 to 9.0.32.
warning

v3.0.1 was quickly released due to a bugged GitHub release (missing artifacts) and is identical to v3.0.0 in content.

success

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/