ASC: A Stateless Android Decompiler Front-End That Queries the APK Instead of Indexing It
ASC is a super FAST Android decompiler front-end designed for Agents/Mobile Researchers.
At a glance
- What is it?
- ASC (Droid ASC) is an Apache-2.0 Python front-end that skips global preprocessing and reads compiled DEX data on demand. It is aimed at agent and mobile reverse-engineering workflows where full inflation is the bottleneck.
- Who is it for?
- ASC is worth adopting if your workflow is target-driven: you know a class, string, method or field and want it fast, from a CLI or an agent loop, without building a global index. It is the wrong tool if you need whole-APK call graph exports, batch decompilation of thousands of classes, or a GUI-first experience, because the documented surface is two subcommands, getclass and findrefs, and the README does not describe bulk modes, rollback, or caching.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The Problem ASC Targets: Waiting for an Index You May Not Need
The README opens with a complaint rather than a feature list. When decompiling massive Android APKs, the standard procedure is to wait: tools consume gigabytes of RAM, fully inflate artifacts, and spend tens of minutes building global indexes and cross references. ASC's argument is that a compiled artifact is already highly structured, and that modern decompilers spend time and memory reconstructing a code-relationship database over data that already encodes those relationships. The project's framing is blunt: it calls the conventional approach an engineering approach that defies common sense, and asks whether preprocessing still holds value when a code relationship can be extracted directly from the APK in milliseconds. That is the problem ASC claims to solve, and it defines the audience. This is a front-end for people who arrive with a target: an agent resolving a reference, a mobile researcher chasing a method, a triage workflow that needs one class decompiled now. It is not positioned for someone who wants a complete, browsable model of the application.
How ASC Avoids Full Inflation: Deflate Probing, Huffman Tables and R8 Layout
The mechanism described in the README has three layers. First, ASC abandons full inflate and probes directly within the Deflate bitstream, building dense Huffman lookup tables to extract core metadata without touching irrelevant data blocks. Second, it uses R8 compiler behaviour as a primitive: deterministic constant relocation and instruction deduplication leave concentrated physical layouts, and ASC weaponizes that layout to run cross-DEX code searches. Third, it maps raw bytecode offsets back to methods through an O(1) instruction locating primitive, which the README describes as constant-time method resolution without building heavy mapping tables. The data flow is query-first rather than index-first: a search hits a target, and ASC then extracts only the specific bytecodes and their dependencies, dynamically reconstructing a minimal, self-consistent DEX entirely in memory for decompilation. The engine is described as stateless and zero-overhead, with extraction and search on demand. The README's benchmark section points to an image and a video, and the narrative claims global cross reference searches in 1.79 seconds and target class decompilation in 177 milliseconds at 141MB of RAM against a 352MB commercial APK. Those figures come from the project's own live demonstration; the README does not publish the hardware, the APK identity, or the methodology behind them.
Two Subcommands: getclass and findrefs
The documented interface is small. The entry point is main.py with two positional subcommands. getclass locates a target class in the APK, extracts one DEX in memory, then decompiles it. findrefs finds code references for a string, type, method or field across all DEX entries in the APK. The README gives these examples verbatim: python main.py app.apk --gui, python main.py getclass app.apk Lcom/poc/Main; -o Main.java, python main.py getclass app.apk com.poc.Main --threads 16, python main.py findrefs app.apk string token -o string_refs.txt, python main.py findrefs app.apk type com.poc.Main, python main.py findrefs app.apk method onCreate --class com.poc.Main, python main.py findrefs app.apk method notify --class MainActivity --fuzzy-class -o method_refs.txt, and python main.py findrefs app.apk field apiKey -o field_refs.txt. Several things are worth noting. Class names are accepted in both JVM descriptor form (Lcom/poc/Main;) and dotted form (com.poc.Main), which matters when an agent constructs arguments. There is a --threads option, so extraction can be parallelised. There is a --class filter on findrefs, plus a --fuzzy-class flag for matching a class name loosely, which is useful when R8 has renamed or shortened identifiers. Output can be redirected with -o. A --gui flag is shown in the first example, but the README does not document what the GUI exposes or how it differs from the CLI.
Where ASC Is the Wrong Tool
The same design that makes targeted queries fast makes whole-program analysis awkward. ASC reconstructs a minimal DEX in memory for the class you asked for; it does not, according to the README, produce a persistent global database. Anything that depends on a durable cross-reference index, such as exporting a call graph for the entire application, ranking methods by fan-in, or feeding a static analyser that expects a complete model, falls outside the documented surface. findrefs answers one reference question at a time. If your work is bulk decompilation of thousands of classes, or a long-lived session where you repeatedly jump between unrelated parts of the APK, the stateless model means paying extraction cost per query rather than amortising it through an index. There is also an operational constraint: the README does not document rollback, caching, or how repeated runs behave, so you should not assume that a second query against the same APK is free. And the benchmark claim rests on one 352MB commercial APK; nothing in the README establishes how the numbers scale down to small APKs or up to multi-gigabyte ones.
How ASC Differs from jadx and apktool
The natural comparison is jadx, the widely used decompiler that loads an APK, builds indexes, and presents a browsable project with search across the whole application. jadx's model is index-first: pay the preprocessing cost once, then navigate freely. ASC inverts that. It treats the compiled artifact as a read-only database and answers point queries against it, so the cost profile is per-query rather than per-session. The trade-off is explicit: you gain time-to-first-answer on large APKs and lose the persistent global model. apktool sits at a different layer, decoding resources and producing smali rather than reconstructing Java, so it is not a direct substitute for getclass. The other distinction the README draws is architectural rather than feature-based: ASC claims to use R8 optimizations as a decompiler primitive, relying on deterministic constant relocation and instruction deduplication to make cross-DEX searches cheap, and using Deflate-level probing to avoid inflating data it does not need. If your workflow already depends on jadx's GUI and whole-project search, ASC is a complement for fast targeted lookups, not a replacement.
Licence, Maintenance and Upgrade Cost
ASC is licensed under Apache-2.0, which permits commercial use, modification and redistribution provided you retain the licence and notices, and it includes a patent grant. That is permissive enough for internal tooling and for embedding in an agent pipeline. It is not a copyleft licence, so it does not force you to publish modifications. This is a description of the licence terms, not legal advice; if you redistribute ASC or a derivative, read the full text. On maintenance: the repository is not archived, and the last push was on 2026-09-13. There are no retrieved releases, so there is no tagged version to pin and no changelog to review; you would be tracking the main branch. That matters for upgrade cost. With no releases, there is no semantic versioning contract and no documented upgrade path, and the README does not describe a compatibility policy for the CLI flags or output formats. Python tooling of this kind also tends to depend on a specific interpreter version and a set of parsing libraries, none of which the README enumerates, so verifying the dependency set from the repository files is a first step before committing to it in a pipeline.
What to Confirm Before Putting ASC in an Agent Loop
The CLI shape is friendly to automation: subcommands, a class filter, fuzzy matching, threaded extraction, and file output. But an agent loop needs deterministic behaviour, and the README is silent on several points. It does not state the exit codes for a class that is absent or a reference that is not found, so error handling has to be built from observation rather than documentation. It does not describe output stability for findrefs, meaning you cannot assume the same query returns identically ordered results across runs. It does not document how the in-memory DEX reconstruction handles a class whose dependencies span multiple DEX files, beyond saying dependencies are extracted. The performance claims, 1.79 seconds for global cross reference search and 177 milliseconds for target class decompilation at 141MB of RAM, are tied to a single 352MB commercial APK, and the README does not explain how that APK was chosen or what the search targeted. Reproducing those numbers on your own sample, with your own class and reference queries, is the only way to know whether the on-demand model beats your current index-first workflow at your scale. If it does, the two-subcommand surface is small enough to wrap in a script the same day.
Editorial conclusion
ASC is worth adopting if your workflow is target-driven: you know a class, string, method or field and want it fast, from a CLI or an agent loop, without building a global index. It is the wrong tool if you need whole-APK call graph exports, batch decompilation of thousands of classes, or a GUI-first experience, because the documented surface is two subcommands, getclass and findrefs, and the README does not describe bulk modes, rollback, or caching. Before adopting, verify the Python version and dependency set from the repository, and reproduce the 352MB benchmark on your own APK, since the published numbers come from one commercial sample and the README does not document how the benchmark was configured.
Community notes