Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Decompile Android APK, XAPK, JAR, and AAR files using jadx or Fernflower/Vineflower. Reverse engineer Android apps, extract HTTP API endpoints, trace call flows from UI to network layer, and analyze runtime behavior with Frida, network capture, JNI/SO inspection, and signature generation. Use when the user wants to decompile, analyze, hook, inspect network traffic, bypass SSL pinning for analysis, locate crypto or signing logic, or follow call flows in Android packages.
.claude/skills/credittone-android-reverse-engineering/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 674% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 199% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 305% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 154% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 179% | 0% |
Decompile Android APK, XAPK, JAR, and AAR files using jadx and Fernflower/Vineflower, trace call flows through application code and libraries, produce structured documentation of extracted APIs, and escalate to runtime analysis only after static triage shows that it is needed. Two decompiler engines are supported: jadx for broad Android coverage and Fernflower/Vineflower for higher-quality output on complex Java code.
Do not jump straight into Frida, packet capture, or SO analysis. Start with JADX and identify:
Use dynamic analysis only to confirm or bridge gaps that static analysis cannot resolve.
IDA MCP provides static binary analysis (disassembly, decompilation, cross-references) for .so files. Do NOT suggest it blindly — check these conditions first:
Suggest IDA MCP when the user asks to:
Do NOT suggest IDA MCP when:
jni_method_trace.js to capture runtime decryption.jni_method_trace.js first to find which SO handles the logic.Quick check before suggesting: Use survey_binary on the SO. If the output shows only a handful of huge functions (> 10 KB each) instead of many small ones, the binary is obfuscated — skip IDA and suggest Frida.
This skill requires Java JDK 17+ and jadx to be installed. Fernflower/Vineflower, dex2jar, and rizin are optional but recommended for better decompilation quality and native .so analysis. Run the dependency checker to verify:
bashbash skills/android-reverse-engineering/scripts/check-deps.sh
On Windows (PowerShell):
powershell& "skills/android-reverse-engineering/scripts/check-deps.ps1"
If anything is missing, follow the installation instructions in skills/android-reverse-engineering/references/setup-guide.md.
Before decompiling, confirm that the required tools are available — and install any that are missing.
Action: Run the dependency check script.
bashbash skills/android-reverse-engineering/scripts/check-deps.sh
On Windows (PowerShell):
powershell& "skills/android-reverse-engineering/scripts/check-deps.ps1"
The output contains machine-readable lines:
INSTALL_REQUIRED:<dep> — must be installed before proceedingINSTALL_OPTIONAL:<dep> — recommended but not blockingIf required dependencies are missing (exit code 1), install them automatically:
bashbash skills/android-reverse-engineering/scripts/install-dep.sh <dep>
On Windows (PowerShell):
powershell& "skills/android-reverse-engineering/scripts/install-dep.ps1" <dep>
The install script detects the OS and package manager, then:
~/.local/share/, symlinks in ~/.local/bin/)Windows notes:
winget, then scoop, then choco%USERPROFILE%\.local\share\check-deps.ps1 and decompile.ps1 refresh PATH from the user environment, so newly installed tools can usually be found without restarting the terminalFor optional dependencies, ask the user if they want to install them. Vineflower and dex2jar are recommended for best results. Rizin is recommended when JNI or .so inspection is likely.
After installation, re-run check-deps.sh to confirm everything is in place. Do not proceed to Phase 2 until all required dependencies are OK.
Use the decompile wrapper script to process the target file. The script supports three engines: jadx, fernflower, and both.
Action: Choose the engine and run the decompile script. The script handles APK, XAPK, JAR, and AAR files.
bashbash skills/android-reverse-engineering/scripts/decompile.sh [OPTIONS] <file>
On Windows (PowerShell):
powershell& "skills/android-reverse-engineering/scripts/decompile.ps1" [OPTIONS] <file>
For XAPK files (ZIP bundles containing multiple APKs, used by APKPure and similar stores): the script automatically extracts the archive, identifies all APK files inside (base + split APKs), and decompiles each one into a separate subdirectory. The XAPK manifest is copied to the output for reference.
For split/bundled APK wrappers: if the outer APK produces very few Java files but contains base.apk and split_config.*.apk files inside its resources, the decompile script automatically detects that the outer APK is only a thin wrapper, re-decompiles base.apk into <output>/base/, skips config-only splits, and reports the real source location.
Options:
-o <dir> — Custom output directory (default: <filename>-decompiled)--deobf — Enable deobfuscation of names when readability matters more than runtime class fidelity--no-res — Skip resources, decompile code only (faster)--engine ENGINE — jadx (default), fernflower, or bothEngine selection strategy:
| Situation | Engine | |---|---| | First pass on any APK | jadx (fastest, handles resources; keep original runtime class names by default) | | JAR/AAR library analysis | fernflower (better Java output) | | jadx output has warnings/broken code | both (compare and pick best per class) | | Complex lambdas, generics, streams | fernflower | | Quick overview of a large APK | jadx --no-res | | You need Frida/JNI/unidbg/runtime class names | jadx without --deobf | | You only need readability for heavily obfuscated code | jadx --deobf |
When using --engine both, the outputs go into <output>/jadx/ and <output>/fernflower/ respectively, with a comparison summary at the end showing file counts and jadx warning counts. Review classes with jadx warnings in the Fernflower output for better code.
For APK files with Fernflower, the script automatically uses dex2jar as an intermediate step. dex2jar must be installed for this to work.
See skills/android-reverse-engineering/references/jadx-usage.md and skills/android-reverse-engineering/references/fernflower-usage.md for the full CLI references.
Navigate the decompiled output to understand the app's architecture.
Actions:
<output>/resources/AndroidManifest.xml:INTERNET, ACCESS_NETWORK_STATE)android:name on <application>)<output>/sources/:api, network, data, repository, service, retrofit, http — these are where API calls livePresenter classesViewModel classes and LiveData/StateFlowdomain, data, presentation packagesFollow execution paths from user-facing entry points down to network calls.
Actions:
onCreate() → view setup → click listeners@Module classes to understand which implementations are provided for which interfaces.--deobf whenever the next step may involve Frida, JNI FindClass, unidbg, or runtime class loading. --deobf can generate readable aliases that are useful for source navigation but are not guaranteed to exist at runtime.See skills/android-reverse-engineering/references/call-flow-analysis.md for detailed techniques and grep commands.
Find all API endpoints and produce structured documentation.
Action: Run the API search script for a broad sweep.
bashbash skills/android-reverse-engineering/scripts/find-api-calls.sh <output>/sources/
On Windows (PowerShell):
powershell& "skills/android-reverse-engineering/scripts/find-api-calls.ps1" <output>/sources/
Targeted searches:
bash# Only Retrofit bash skills/android-reverse-engineering/scripts/find-api-calls.sh <output>/sources/ --retrofit # Only hardcoded URLs bash skills/android-reverse-engineering/scripts/find-api-calls.sh <output>/sources/ --urls # Only auth patterns bash skills/android-reverse-engineering/scripts/find-api-calls.sh <output>/sources/ --auth
On Windows (PowerShell):
powershell# Only Retrofit & "skills/android-reverse-engineering/scripts/find-api-calls.ps1" <output>/sources/ -Retrofit # Only hardcoded URLs & "skills/android-reverse-engineering/scripts/find-api-calls.ps1" <output>/sources/ -Urls # Only auth patterns & "skills/android-reverse-engineering/scripts/find-api-calls.ps1" <output>/sources/ -Auth
Then, for each discovered endpoint, read the surrounding source code to extract:
Document each endpoint using this format:
markdown### `METHOD /path` - **Source**: `com.example.api.ApiService` (ApiService.java:42) - **Base URL**: `https://api.example.com/v1` - **Path params**: `id` (String) - **Query params**: `page` (int), `limit` (int) - **Headers**: `Authorization: Bearer <token>` - **Request body**: `{ "email": "string", "password": "string" }` - **Response**: `ApiResponse<User>` - **Called from**: `LoginActivity → LoginViewModel → UserRepository → ApiService`
See skills/android-reverse-engineering/references/api-extraction-patterns.md for library-specific search patterns and the full documentation template.
Use this phase only when static analysis is insufficient or the user explicitly asks for runtime work such as Frida hook, packet capture, SSL pinning investigation, or signature tracing.
Typical escalation cases:
native methods for signing, token generation, or encryptionRecommended order:
See:
skills/android-reverse-engineering/references/dynamic-analysis.mdskills/android-reverse-engineering/references/native-analysis.mdIf signing or crypto is delegated to JNI or .so code:
native declarations in decompiled JavaSystem.loadLibrary calls and identify the target SOFocus on answering these questions:
Preferred CLI for .so analysis:
rizin / rz-bin first when availablereadelf, nm, objdump, and strings if rizin is unavailableRecommended .so command set:
bash# Basic file identity file libfoo.so # ELF metadata, imports/exports, sections rz-bin -I libfoo.so rz-bin -s libfoo.so rz-bin -i libfoo.so rz-bin -E libfoo.so # Fast string triage rz-strings -a libfoo.so | rg 'http|https|Java_|JNI_OnLoad|RegisterNatives|encrypt|sign|ssl|socket' # Function list and disassembly rizin -qc "aaa; afl; q" libfoo.so rizin -qc "aaa; pdf @ sym.JNI_OnLoad; q" libfoo.so rizin -qc "aaa; pdr @ sym.JNI_OnLoad; q" libfoo.so
Useful fallbacks without rizin:
bashreadelf -d libfoo.so readelf -Ws libfoo.so nm -D libfoo.so | rg 'Java_|JNI_OnLoad|RegisterNatives' objdump -T libfoo.so objdump -d libfoo.so > libfoo.objdump.asm strings -a libfoo.so | rg 'http|https|Java_|JNI_OnLoad|RegisterNatives|encrypt|sign|ssl|socket'
Default .so workflow:
file and rz-bin -IJNI_OnLoad, Java_*, and crypto or socket APIsJNI_OnLoad first, then look for RegisterNatives targetsAt the end of the workflow, deliver:
skills/android-reverse-engineering/references/setup-guide.md — Installing Java, jadx, Fernflower/Vineflower, dex2jar, and optional toolsskills/android-reverse-engineering/references/jadx-usage.md — jadx CLI options and workflowsskills/android-reverse-engineering/references/fernflower-usage.md — Fernflower/Vineflower CLI options, when to use, APK workflowskills/android-reverse-engineering/references/api-extraction-patterns.md — Library-specific search patterns and documentation templateskills/android-reverse-engineering/references/call-flow-analysis.md — Techniques for tracing call flows in decompiled codeskills/android-reverse-engineering/references/dynamic-analysis.md — Frida, runtime request interception, SSL pinning triage, and packet capture workflowskills/android-reverse-engineering/references/native-analysis.md — JNI/SO inspection, native sign analysis, and when to escalate to unidbg| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 8,828 | 17,077 | +93% | 1 | 1 | 0% | 801 | 6,202 | +674% | 0 | 0 | — |
case-02 | fail→pass | 20,835 | 24,545 | +18% | 1 | 1 | 0% | 2,313 | 6,918 | +199% | 0 | 0 | — |
case-03 | fail→fail | 11,804 | 25,069 | +112% | 1 | 1 | 0% | 1,227 | 4,422 | +260% | 0 | 0 | — |
case-04 | pass→pass | 13,853 | 7,122 | -49% | 1 | 1 | 0% | 2,156 | 5,278 | +145% | 0 | 0 | — |
case-05 | pass→pass | 10,532 | 6,067 | -42% | 1 | 1 | 0% | 1,755 | 5,203 | +196% | 0 | 0 | — |
case-06 | pass→pass | 9,329 | 3,758 | -60% | 1 | 1 | 0% | 1,444 | 4,731 | +228% | 0 | 0 | — |
case-07 | fail→pass | 21,152 | 19,148 | -9% | 1 | 1 | 0% | 1,319 | 5,336 | +305% | 0 | 0 | — |
case-08 | fail→fail | 11,744 | 9,150 | -22% | 1 | 1 | 0% | 1,819 | 5,642 | +210% | 0 | 0 | — |
case-09 | pass→pass | 11,023 | 6,192 | -44% | 1 | 1 | 0% | 1,695 | 5,093 | +200% | 0 | 0 | — |
case-10 | pass→pass | 16,779 | 7,629 | -55% | 1 | 1 | 0% | 2,467 | 5,387 | +118% | 0 | 0 | — |
case-11 | fail→pass | 13,524 | 8,093 | -40% | 1 | 1 | 0% | 2,205 | 5,603 | +154% | 0 | 0 | — |
case-12 | pass→pass | 6,421 | 3,920 | -39% | 1 | 1 | 0% | 1,127 | 4,711 | +318% | 0 | 0 | — |
case-13 | fail→pass | 10,424 | 2,905 | -72% | 1 | 1 | 0% | 1,665 | 4,642 | +179% | 0 | 0 | — |
case-14 | pass→pass | 9,152 | 6,303 | -31% | 1 | 1 | 0% | 1,662 | 5,223 | +214% | 0 | 0 | — |
case-15 | pass→pass | 13,595 | 6,055 | -55% | 1 | 1 | 0% | 2,064 | 4,961 | +140% | 0 | 0 | — |
case-16 | pass→pass | 14,416 | 16,574 | +15% | 1 | 1 | 0% | 2,291 | 5,282 | +131% | 0 | 0 | — |
case-17 | pass→pass | 14,612 | 12,366 | -15% | 1 | 1 | 0% | 2,318 | 6,341 | +174% | 0 | 0 | — |
case-18 | fail→pass | 9,327 | 6,712 | -28% | 1 | 1 | 0% | 1,772 | 5,349 | +202% | 0 | 0 | — |
case-19 | pass→pass | 11,958 | 11,584 | -3% | 1 | 1 | 0% | 2,108 | 5,939 | +182% | 0 | 0 | — |
case-20 | pass→pass | 9,489 | 9,234 | -3% | 1 | 1 | 0% | 1,987 | 5,979 | +201% | 0 | 0 | — |
case-21 | pass→pass | 16,814 | 13,241 | -21% | 1 | 1 | 0% | 2,653 | 6,250 | +136% | 0 | 0 | — |
case-22 | pass→pass | 14,629 | 11,302 | -23% | 1 | 1 | 0% | 3,004 | 6,402 | +113% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +27 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.