Ramblings of a Tampa engineer

Apktool v2.5.0 has been released! This is a long overdue release that fixes many long-running issues.

The last release was way back on November 29, 2019 and by the time this version is released - It will have been over 1 year since our last Apktool release. So what happened?

Honestly a combination of 2020, burnout and life changes. None of which are important to this release post. Though if you are interested - I blogged about some of the burnout of long-running open source projects.

Let's talk about maintaining a backlog. Apktool prior to this release had over 250 tickets ranging from 8 years old to 1 day old. It was frankly insane. Some of the topics hadn't even been responded to in years. So I spent roughly 20 hours over Thanksgiving and went through every single ticket. The backlog is now 40 tickets, organized and ready to be fixed. Some tough choices were made on a handful of tickets, but I had to be realistic when it came to fixing some of these anti-tamper issues.

I wouldn't have done this without the help from "peret" who helped build aapt/aapt2 binaries for me on Mac. For some reason (still to this post) a few select repositories cloning from AOSP result in:

RPC failed: HTTP 499 curl 16 Error in HTTP2 framing layer

This was blocking me for months from completing the release. However, that is enough meta discussion. Apktool development is active again, a smaller backlog has me hooked and a helpful community of authors will keep the discussions and features going.

So lets talk about the changes.


This release packs in Android 11 support, which will require a framework update as well as upgrading to the latest and greatest smali project. We embraced GitHub Actions dropping TravisCI and started the deprecation process for 32 bit machines. (Sorry, AOSP is pushing me here)

Error messages were overhauled to help explain why things aren't working. Test cases were enhanced to prevent regressions and each pull request is automatically tested again all 3 major operating systems and a variety of Java versions.

The obfuscation war never ends and Apktool v2.5.0 makes leaps of improvements when it comes to parsing files. Apktool will survive when all namespace references have been removed. Apktool will survive with dummy resources if all resource names have been stripped. Apktool will also survive if all resources have been tweaked to the same name. This of course makes compilation very difficult, but at least the application can be disassembled now.

Binaries for aapt/aapt2 received another great set of patches aiming to lessen the errors that either will encounter during compilation. This led to patching many compression related bugs when it comes to rebuilding applications as well as patching many crashes that result when resources can't be found.

Features were added for the new compileSdkVersion property as well as a apktool list-frameworks command. Finally, some quality of life enhancements for error codes, helper scripts and copyrights. So with that, the detailed change log and author breakdown.


This release had 180 commits by 11 people

  • Connor Tumbleson (iBotPeaches) - 160 commits
  • Giacomo Ferretti (giacomoferretti) - 4 commits
  • Frieder Bluemle (friederbluemle) - 3 commits
  • Peter Retzlaff - 3 commits
  • Ankit Pati (ankitpati) - 2 commits
  • Comnir (Nir) - 2 commits
  • Leo Wandersleb (Giszmo) - 1 commit
  • Patrick Decat - 1 commit
  • Steven Arzt (StevenArzt) - 1 commit
  • Taras - 1 commit
  • chris-sharl - 1 commit
  • vladimir (vldmrrr) - 1 commit

Changes since 2.4.1

  • [#2399, #2397, #2369, #2167] Android 11 Support.
  • [#2006, #1718] Upgraded smali/baksmali to v2.4.0.
  • [#2110, #2053] Deprecate 32 bit operating systems.
  • [#2251] Fix thread crash with binary name collision.
  • [#2323] Fix compression on resources.arsc.
  • [#2333] Fix crash with empty files during compression. (Thanks peret)
  • [#2328, #2364] Fix debug mode handling with aapt2. (Thanks Comnir)
  • [#2386, #2217, #2119] Fix handling XML files with $ in name.
  • [#2300] Fix NPE while disassembling manifest with no resource matching resId.
  • [#2438, #1903] Fix aapt2 with dummy properties of bool(false) to ref(null).
  • [#2317, #2188, #1859] Fix non-standard namespaces in obfuscated manifests.
  • [#1945, #2146] Fix NPE when finding referent of a missing resource.
  • [#2343] Fix error message when framework directory cannot be written.
  • [#2411] Add tests for classes[1-3].dex
  • [#1913] Added new list frameworks command.
  • [#2368] Added support for compileSdkVersion.
  • Updated response codes to properly be non-zero if invalid parameters passed. (Thanks Giszmo)
  • Updated license headers to reflect start date of project & remove javadoc style. (Thanks friederbluemle)
  • Added support for JAVA_HOME variable on Windows helper script. (Thanks vldmrrr)
  • Added support for SDK Codename "S"
  • Upgrade to gradle 6.4.1
  • Replaced TravisCI with GitHub Actions

Notes

  • Applications are becoming more and more difficult to build with aapt1, using the --use-aapt2 flag during rebuild is a good test.
  • There are only 40 issues in the backlog. Have an idea for a fix? Fancy reviewing some pull requests?

Download

  • Apktool 2.5.0
    • md5 4958ad93cba461f084a47d5626e2d486
    • sha256 b392d7cb99b592e9c5acc3c06f1b0f180edde96c66b86b3d6932b7c0c4079fe4
    • Rename to apktool.jar and follow the Instruction Guide if you need help.