@leejungkiin/awkit 1.7.1 → 1.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/awk.js +576 -84
- package/core/CLAUDE.md +1 -1
- package/core/GEMINI.md +148 -167
- package/core/GEMINI.md.bak +149 -116
- package/core/skill-runtime-manifest.json +3 -0
- package/docs/Claude Fable 5.md +3826 -0
- package/docs/android_kotlin_system_instruction.md +210 -0
- package/docs/brainstorm_ponytail_integration.md +146 -0
- package/docs/brainstorm_smart_setup.md +113 -0
- package/docs/deep-research-report (1).md +293 -0
- package/docs/history/GEMINI.v1.md +135 -0
- package/docs/history/brainstorm_antigravity_unified_architecture.v1.md +105 -0
- package/docs/history/implementation_plan.v1.md +58 -0
- package/package.json +4 -1
- package/scripts/artifact-storage.js +130 -0
- package/scripts/automation-gate.js +35 -2
- package/scripts/claude-plan.js +76 -0
- package/scripts/dependency-manager.js +210 -0
- package/scripts/exec-rtk.js +11 -5
- package/scripts/i18n-helper.js +381 -0
- package/scripts/multi-model-pipeline.js +144 -0
- package/skill-packs/mobile-ios/pack.json +4 -2
- package/skill-packs/reverse-engineering/pack.json +1 -0
- package/skills/CATALOG.md +20 -0
- package/skills/GEMINI.md +9 -1
- package/skills/TRIGGER_INDEX.md +10 -0
- package/skills/ai-music/SKILL.md +275 -0
- package/skills/android-re-analyzer/SKILL.md +238 -0
- package/skills/android-re-analyzer/references/api-extraction-patterns.md +119 -0
- package/skills/android-re-analyzer/references/call-flow-analysis.md +176 -0
- package/skills/android-re-analyzer/references/fernflower-usage.md +115 -0
- package/skills/android-re-analyzer/references/jadx-usage.md +116 -0
- package/skills/android-re-analyzer/references/setup-guide.md +221 -0
- package/skills/android-re-analyzer/scripts/check-deps.sh +129 -0
- package/skills/android-re-analyzer/scripts/decompile.sh +375 -0
- package/skills/android-re-analyzer/scripts/find-api-calls.sh +118 -0
- package/skills/android-re-analyzer/scripts/install-dep.sh +448 -0
- package/skills/animal-island-ui-style/SKILL.md +1450 -0
- package/skills/app-store-review-agent/SKILL.md +164 -0
- package/skills/app-store-review-agent/references/guidelines/README.md +154 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/ai_apps.md +37 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/all_apps.md +50 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/crypto_finance.md +31 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/games.md +31 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/health_fitness.md +31 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/kids.md +27 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/macos.md +38 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/social_ugc.md +32 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/subscription_iap.md +34 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/vpn.md +18 -0
- package/skills/app-store-review-agent/references/rules/design/minimum_functionality.md +96 -0
- package/skills/app-store-review-agent/references/rules/design/sign_in_with_apple.md +54 -0
- package/skills/app-store-review-agent/references/rules/entitlements/unused_entitlements.md +83 -0
- package/skills/app-store-review-agent/references/rules/metadata/accurate_metadata.md +54 -0
- package/skills/app-store-review-agent/references/rules/metadata/apple_trademark.md +99 -0
- package/skills/app-store-review-agent/references/rules/metadata/china_storefront.md +72 -0
- package/skills/app-store-review-agent/references/rules/metadata/competitor_terms.md +56 -0
- package/skills/app-store-review-agent/references/rules/metadata/subscription_metadata.md +81 -0
- package/skills/app-store-review-agent/references/rules/privacy/privacy_manifest.md +84 -0
- package/skills/app-store-review-agent/references/rules/privacy/unnecessary_data.md +60 -0
- package/skills/app-store-review-agent/references/rules/subscription/misleading_pricing.md +63 -0
- package/skills/app-store-review-agent/references/rules/subscription/missing_tos_pp.md +54 -0
- package/skills/awf-ponytail/SKILL.md +91 -0
- package/skills/awf-ponytail-review/SKILL.md +67 -0
- package/skills/awf-session-restore/SKILL.md +3 -3
- package/skills/brainstorm-agent/SKILL.md +11 -2
- package/skills/brainstorm-agent/templates/brief-template.md +8 -0
- package/skills/claude-planner/SKILL.md +47 -0
- package/skills/code-review/SKILL.md +87 -0
- package/skills/expo-game-development/SKILL.md +163 -0
- package/skills/flutter/LICENSE.txt +202 -0
- package/skills/flutter/SKILL.md +127 -0
- package/skills/flutter-project-creater/LICENSE.txt +202 -0
- package/skills/flutter-project-creater/SKILL.md +106 -0
- package/skills/game-developer/SKILL.md +163 -0
- package/skills/game-developer/references/ecs-patterns.md +501 -0
- package/skills/game-developer/references/multiplayer-networking.md +475 -0
- package/skills/game-developer/references/performance-optimization.md +422 -0
- package/skills/game-developer/references/unity-patterns.md +271 -0
- package/skills/game-developer/references/unreal-cpp.md +352 -0
- package/skills/generate-gui-assets/SKILL.md +305 -0
- package/skills/generate-gui-assets/agents/openai.yaml +4 -0
- package/skills/generate-gui-assets/references/catalog-schema.md +58 -0
- package/skills/generate-gui-assets/references/extraction-techniques.md +21 -0
- package/skills/generate-gui-assets/references/prompt-patterns.md +58 -0
- package/skills/generate-gui-assets/scripts/__pycache__/clean_chroma_edges.cpython-311.pyc +0 -0
- package/skills/generate-gui-assets/scripts/build_gui_contact_sheet.py +51 -0
- package/skills/generate-gui-assets/scripts/clean_chroma_edges.py +262 -0
- package/skills/generate-gui-assets/scripts/copy_approved_icons.py +64 -0
- package/skills/generate-gui-assets/scripts/prepare_gui_asset_run.py +91 -0
- package/skills/generate-gui-assets/scripts/suggest_grid_options.py +63 -0
- package/skills/generate-gui-assets/scripts/validate_gui_catalog.py +50 -0
- package/skills/godot-game-development/SKILL.md +142 -0
- package/skills/hatch-pet/LICENSE.txt +201 -0
- package/skills/hatch-pet/SKILL.md +420 -0
- package/skills/hatch-pet/agents/openai.yaml +4 -0
- package/skills/hatch-pet/references/animation-rows.md +29 -0
- package/skills/hatch-pet/references/codex-pet-contract.md +35 -0
- package/skills/hatch-pet/references/qa-rubric.md +60 -0
- package/skills/hatch-pet/scripts/__pycache__/clean_chroma_edges.cpython-311.pyc +0 -0
- package/skills/hatch-pet/scripts/clean_chroma_edges.py +262 -0
- package/skills/hatch-pet/scripts/compose_atlas.py +150 -0
- package/skills/hatch-pet/scripts/derive_running_left_from_running_right.py +143 -0
- package/skills/hatch-pet/scripts/extract_strip_frames.py +323 -0
- package/skills/hatch-pet/scripts/finalize_pet_run.py +382 -0
- package/skills/hatch-pet/scripts/generate_pet_images.py +287 -0
- package/skills/hatch-pet/scripts/inspect_frames.py +246 -0
- package/skills/hatch-pet/scripts/make_contact_sheet.py +96 -0
- package/skills/hatch-pet/scripts/package_custom_pet.py +108 -0
- package/skills/hatch-pet/scripts/pet_job_status.py +117 -0
- package/skills/hatch-pet/scripts/prepare_pet_run.py +673 -0
- package/skills/hatch-pet/scripts/queue_pet_repairs.py +172 -0
- package/skills/hatch-pet/scripts/record_imagegen_result.py +250 -0
- package/skills/hatch-pet/scripts/render_animation_videos.py +134 -0
- package/skills/hatch-pet/scripts/render_animation_videos.sh +5 -0
- package/skills/hatch-pet/scripts/validate_atlas.py +139 -0
- package/skills/i18n-orchestrator/SKILL.md +37 -0
- package/skills/ios-simulator-skill/SKILL.md +390 -0
- package/skills/ios-simulator-skill/scripts/accessibility_audit.py +300 -0
- package/skills/ios-simulator-skill/scripts/app_launcher.py +326 -0
- package/skills/ios-simulator-skill/scripts/app_state_capture.py +400 -0
- package/skills/ios-simulator-skill/scripts/appearance.py +385 -0
- package/skills/ios-simulator-skill/scripts/build_and_test.py +348 -0
- package/skills/ios-simulator-skill/scripts/clipboard.py +103 -0
- package/skills/ios-simulator-skill/scripts/common/__init__.py +61 -0
- package/skills/ios-simulator-skill/scripts/common/cache_utils.py +289 -0
- package/skills/ios-simulator-skill/scripts/common/device_utils.py +462 -0
- package/skills/ios-simulator-skill/scripts/common/env_config.py +35 -0
- package/skills/ios-simulator-skill/scripts/common/hang_pipeline.py +862 -0
- package/skills/ios-simulator-skill/scripts/common/hang_sessions.py +490 -0
- package/skills/ios-simulator-skill/scripts/common/idb_utils.py +180 -0
- package/skills/ios-simulator-skill/scripts/common/screenshot_utils.py +338 -0
- package/skills/ios-simulator-skill/scripts/container.py +668 -0
- package/skills/ios-simulator-skill/scripts/gesture.py +394 -0
- package/skills/ios-simulator-skill/scripts/hang_watcher.py +1533 -0
- package/skills/ios-simulator-skill/scripts/keyboard.py +391 -0
- package/skills/ios-simulator-skill/scripts/localization_audit.py +483 -0
- package/skills/ios-simulator-skill/scripts/location.py +467 -0
- package/skills/ios-simulator-skill/scripts/log_monitor.py +493 -0
- package/skills/ios-simulator-skill/scripts/model_inspector.py +645 -0
- package/skills/ios-simulator-skill/scripts/navigator.py +461 -0
- package/skills/ios-simulator-skill/scripts/privacy_manager.py +310 -0
- package/skills/ios-simulator-skill/scripts/push_notification.py +240 -0
- package/skills/ios-simulator-skill/scripts/screen_mapper.py +296 -0
- package/skills/ios-simulator-skill/scripts/sim_health_check.sh +245 -0
- package/skills/ios-simulator-skill/scripts/sim_list.py +299 -0
- package/skills/ios-simulator-skill/scripts/simctl_boot.py +312 -0
- package/skills/ios-simulator-skill/scripts/simctl_create.py +316 -0
- package/skills/ios-simulator-skill/scripts/simctl_delete.py +357 -0
- package/skills/ios-simulator-skill/scripts/simctl_erase.py +351 -0
- package/skills/ios-simulator-skill/scripts/simctl_shutdown.py +290 -0
- package/skills/ios-simulator-skill/scripts/simulator_selector.py +375 -0
- package/skills/ios-simulator-skill/scripts/status_bar.py +250 -0
- package/skills/ios-simulator-skill/scripts/test_recorder.py +323 -0
- package/skills/ios-simulator-skill/scripts/visual_diff.py +235 -0
- package/skills/ios-simulator-skill/scripts/xcode/__init__.py +13 -0
- package/skills/ios-simulator-skill/scripts/xcode/builder.py +397 -0
- package/skills/ios-simulator-skill/scripts/xcode/cache.py +204 -0
- package/skills/ios-simulator-skill/scripts/xcode/config.py +178 -0
- package/skills/ios-simulator-skill/scripts/xcode/reporter.py +343 -0
- package/skills/ios-simulator-skill/scripts/xcode/xcresult.py +451 -0
- package/skills/ios-visual-qa-strategist/SKILL.md +111 -0
- package/skills/ios-visual-qa-strategist/agents/openai.yaml +4 -0
- package/skills/ios-visual-qa-strategist/references/ios-tool-selection.md +61 -0
- package/skills/ios-visual-qa-strategist/references/minimal-capture-policy.md +56 -0
- package/skills/ios-visual-qa-strategist/references/visual-reasoning-heuristics.md +53 -0
- package/skills/orchestrator/SKILL.md +0 -20
- package/skills/persistent-storage/SKILL.md +55 -0
- package/skills/short-maker/SKILL.md +23 -0
- package/skills/short-maker/scripts/effects.js +56 -0
- package/skills/short-maker/scripts/shortmaker-bridge.js +332 -0
- package/skills/short-maker/scripts/videomix.js +601 -0
- package/skills/short-maker/templates/hyperframes/cinematic-character.template.html +172 -0
- package/skills/short-maker/templates/hyperframes/index.template.html +194 -0
- package/skills/smali-to-kotlin/SKILL.md +128 -0
- package/skills/smali-to-kotlin/examples/getting-started/tech-stack.md +58 -0
- package/skills/smali-to-kotlin/examples/pipeline/data-ui-parity.md +118 -0
- package/skills/smali-to-kotlin/examples/pipeline/scanner-and-bootstrap.md +106 -0
- package/skills/smali-to-kotlin/library-patterns.md +189 -0
- package/skills/smali-to-kotlin/phase-0-discovery.md +128 -0
- package/skills/smali-to-kotlin/phase-1-architecture.md +166 -0
- package/skills/smali-to-kotlin/phase-2-blueprint-ui.md +347 -0
- package/skills/smali-to-kotlin/phase-2-blueprint.md +228 -0
- package/skills/smali-to-kotlin/phase-3-build.md +248 -0
- package/skills/smali-to-kotlin/phase-3-logic-build.md +268 -0
- package/skills/smali-to-kotlin/smali-reading-guide.md +310 -0
- package/skills/smali-to-kotlin/templates/app-map.md +101 -0
- package/skills/smali-to-kotlin/templates/architecture.md +142 -0
- package/skills/smali-to-kotlin/templates/blueprint.md +145 -0
- package/skills/spec-gate/SKILL.md +6 -2
- package/skills/symphony-enforcer/SKILL.md +8 -0
- package/skills/symphony-enforcer/examples/mindful-stop.md +2 -0
- package/skills/symphony-enforcer/examples/three-phase.md +16 -0
- package/skills/symphony-enforcer/examples/trigger-points.md +7 -1
- package/skills/unity-game-development/SKILL.md +231 -0
- package/skills/video-edit/SKILL.md +36 -0
- package/skills/video-edit/scripts/video_edit.py +324 -0
- package/templates/project-identity/android.json +2 -2
- package/templates/project-identity/backend-nestjs.json +2 -2
- package/templates/project-identity/expo.json +2 -2
- package/templates/project-identity/ios.json +2 -2
- package/templates/project-identity/web-nextjs.json +2 -2
- package/templates/setup-mapping.json +48 -0
- package/templates/specs/design-template.md +161 -71
- package/templates/specs/requirements-template.md +65 -133
- package/templates/specs/task-spec-template.xml +3 -0
- package/workflows/_uncategorized/critic.md +40 -0
- package/workflows/_uncategorized/git-rebase-flow.md +81 -0
- package/workflows/_uncategorized/image-gen.md +118 -0
- package/workflows/_uncategorized/multi-model-pipeline.md +60 -0
- package/workflows/_uncategorized/pixel-gen.md +86 -0
- package/workflows/_uncategorized/pixel-setup.md +90 -0
- package/workflows/_uncategorized/ponytail-review.md +59 -0
- package/workflows/_uncategorized/reverse-android-build.md +222 -0
- package/workflows/_uncategorized/reverse-android-design.md +139 -0
- package/workflows/_uncategorized/reverse-android-discover.md +150 -0
- package/workflows/_uncategorized/reverse-android-scan.md +158 -0
- package/workflows/_uncategorized/reverse-android.md +143 -0
- package/workflows/_uncategorized/reverse-ios-build.md +240 -0
- package/workflows/_uncategorized/reverse-ios-design.md +112 -0
- package/workflows/_uncategorized/reverse-ios-discover.md +120 -0
- package/workflows/_uncategorized/reverse-ios-scan.md +155 -0
- package/workflows/_uncategorized/reverse-ios.md +152 -0
- package/workflows/_uncategorized/safety-router.md +34 -0
- package/workflows/_uncategorized/teach.md +89 -0
- package/workflows/_uncategorized/verify-ui.md +53 -0
- package/workflows/_uncategorized/visualize-screenshots.md +34 -0
- package/workflows/ads/ads-analyst.md +201 -0
- package/workflows/ads/ads-audit.md +106 -0
- package/workflows/ads/ads-optimize.md +97 -0
- package/workflows/ads/ads-targeting.md +241 -0
- package/workflows/ads/adsExpert.md +160 -0
- package/workflows/ads/smali-ads-config.md +400 -0
- package/workflows/ads/smali-ads-flow.md +331 -0
- package/workflows/ads/smali-ads-interstitial.md +377 -0
- package/workflows/ads/smali-ads-native.md +382 -0
- package/workflows/context/teach.md +89 -0
- package/workflows/gitnexus.md +8 -8
- package/workflows/lifecycle/brainstorm.md +43 -0
- package/workflows/lifecycle/code.md +5 -0
- package/workflows/lifecycle/init.md +23 -5
- package/workflows/lifecycle/multi-model-pipeline.md +60 -0
- package/workflows/quality/ponytail-review.md +59 -0
- package/workflows/roles/critic.md +40 -0
- package/workflows/roles/safety-router.md +34 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Call Flow Analysis
|
|
2
|
+
|
|
3
|
+
Techniques for tracing execution flows in decompiled Android applications, from entry points down to network calls.
|
|
4
|
+
|
|
5
|
+
## 1. Start from AndroidManifest.xml
|
|
6
|
+
|
|
7
|
+
The manifest declares all entry points. After decompilation, find it at:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
<output-dir>/resources/AndroidManifest.xml
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Key elements to look for:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Activities (UI screens)
|
|
17
|
+
grep -n 'android:name=.*Activity' resources/AndroidManifest.xml
|
|
18
|
+
|
|
19
|
+
# Services (background work)
|
|
20
|
+
grep -n 'android:name=.*Service' resources/AndroidManifest.xml
|
|
21
|
+
|
|
22
|
+
# BroadcastReceivers
|
|
23
|
+
grep -n '<receiver' resources/AndroidManifest.xml
|
|
24
|
+
|
|
25
|
+
# ContentProviders
|
|
26
|
+
grep -n '<provider' resources/AndroidManifest.xml
|
|
27
|
+
|
|
28
|
+
# Launcher activity (main entry point)
|
|
29
|
+
grep -A5 'MAIN' resources/AndroidManifest.xml | grep 'android:name'
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 2. Follow the Android Lifecycle
|
|
33
|
+
|
|
34
|
+
Typical call chain from UI to network:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
Activity.onCreate()
|
|
38
|
+
→ setContentView(R.layout.activity_main)
|
|
39
|
+
→ findViewById() / View Binding
|
|
40
|
+
→ button.setOnClickListener()
|
|
41
|
+
→ onClick()
|
|
42
|
+
→ viewModel.doSomething()
|
|
43
|
+
→ repository.fetchData()
|
|
44
|
+
→ apiService.getEndpoint()
|
|
45
|
+
→ HTTP request
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Key lifecycle methods to search:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
grep -rn 'onCreate\|onResume\|onStart\|onViewCreated' sources/
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 3. Identify Click Handlers
|
|
55
|
+
|
|
56
|
+
User interactions trigger API calls. Common patterns:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# XML onClick
|
|
60
|
+
grep -rn 'setOnClickListener\|onClick\|OnClickListener' sources/
|
|
61
|
+
|
|
62
|
+
# Data Binding
|
|
63
|
+
grep -rn '@BindingAdapter\|android:onClick' sources/ resources/
|
|
64
|
+
|
|
65
|
+
# Navigation actions
|
|
66
|
+
grep -rn 'findNavController\|NavController\|navigate(' sources/
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 4. Application Class Initialization
|
|
70
|
+
|
|
71
|
+
The `Application` subclass initializes global singletons (HTTP clients, DI frameworks, analytics):
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Find Application subclass
|
|
75
|
+
grep -rn 'extends Application\|: Application()' sources/
|
|
76
|
+
|
|
77
|
+
# Check onCreate for initialization
|
|
78
|
+
# Then read the class to see what gets configured at startup
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Look for:
|
|
82
|
+
- Retrofit/OkHttp client setup
|
|
83
|
+
- Dagger/Hilt component initialization
|
|
84
|
+
- Firebase/analytics initialization
|
|
85
|
+
- Base URL configuration
|
|
86
|
+
|
|
87
|
+
## 5. Dependency Injection (Dagger / Hilt)
|
|
88
|
+
|
|
89
|
+
Modern Android apps use DI. Trace bindings to find implementations:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Hilt modules
|
|
93
|
+
grep -rn '@Module\|@InstallIn\|@Provides\|@Binds' sources/
|
|
94
|
+
|
|
95
|
+
# Hilt entry points
|
|
96
|
+
grep -rn '@HiltAndroidApp\|@AndroidEntryPoint\|@HiltViewModel' sources/
|
|
97
|
+
|
|
98
|
+
# Dagger components
|
|
99
|
+
grep -rn '@Component\|@Subcomponent' sources/
|
|
100
|
+
|
|
101
|
+
# Injected fields
|
|
102
|
+
grep -rn '@Inject' sources/
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
To trace a call flow through DI:
|
|
106
|
+
1. Find where an interface is used (e.g., `ApiService` injected into a repository)
|
|
107
|
+
2. Find the `@Provides` or `@Binds` method that creates the implementation
|
|
108
|
+
3. Follow the implementation to the actual HTTP call
|
|
109
|
+
|
|
110
|
+
## 6. Find Constants and Configuration
|
|
111
|
+
|
|
112
|
+
Hardcoded values are rarely obfuscated:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Base URLs
|
|
116
|
+
grep -rni 'BASE_URL\|API_URL\|SERVER_URL\|HOST' sources/
|
|
117
|
+
|
|
118
|
+
# API keys
|
|
119
|
+
grep -rni 'API_KEY\|CLIENT_ID\|APP_KEY\|SECRET' sources/
|
|
120
|
+
|
|
121
|
+
# BuildConfig values
|
|
122
|
+
grep -rn 'BuildConfig\.' sources/
|
|
123
|
+
|
|
124
|
+
# SharedPreferences keys (runtime config)
|
|
125
|
+
grep -rn 'getSharedPreferences\|getString(\|putString(' sources/
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## 7. Navigating Obfuscated Code
|
|
129
|
+
|
|
130
|
+
When code is obfuscated (ProGuard/R8):
|
|
131
|
+
|
|
132
|
+
### What gets obfuscated
|
|
133
|
+
- Class names → `a`, `b`, `c`
|
|
134
|
+
- Method names → `a()`, `b()`, `c()`
|
|
135
|
+
- Field names → `f1234a`, `f1235b`
|
|
136
|
+
|
|
137
|
+
### What does NOT get obfuscated
|
|
138
|
+
- **String literals** — URLs, keys, error messages remain readable
|
|
139
|
+
- **Android framework classes** — `Activity`, `Fragment`, `Intent` keep their names
|
|
140
|
+
- **Library public APIs** — Retrofit annotations, OkHttp builders retain names
|
|
141
|
+
- **AndroidManifest entries** — Activity/Service names must be real
|
|
142
|
+
|
|
143
|
+
### Strategy for obfuscated code
|
|
144
|
+
|
|
145
|
+
1. **Start from strings**: Search for URLs, error messages, and known constants
|
|
146
|
+
2. **Start from framework classes**: Activities and Fragments are named in the manifest
|
|
147
|
+
3. **Follow library calls**: Retrofit `@GET`/`@POST` annotations are readable even when the interface class name is obfuscated
|
|
148
|
+
4. **Use `--deobf`**: jadx can generate readable replacement names
|
|
149
|
+
5. **Cross-reference**: If `class a` calls `Retrofit.create(b.class)`, then `b` is a Retrofit service interface
|
|
150
|
+
|
|
151
|
+
## 8. Tracing a Complete Call Flow: Example
|
|
152
|
+
|
|
153
|
+
Goal: Find how login works in an obfuscated app.
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
1. grep for "login" in strings → find "auth/login" URL in class `c.a.b.d`
|
|
157
|
+
2. Class `c.a.b.d` has @POST("auth/login") → it's a Retrofit interface
|
|
158
|
+
3. grep for `c.a.b.d` usage → class `c.a.b.f` calls it (the repository)
|
|
159
|
+
4. grep for `c.a.b.f` usage → class `c.a.a.g` calls it (the ViewModel)
|
|
160
|
+
5. grep for `c.a.a.g` usage → `LoginActivity` has a field of this type
|
|
161
|
+
6. Read LoginActivity.onCreate() → sets click listener → calls ViewModel method
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Result: `LoginActivity → ViewModel → Repository → Retrofit @POST("auth/login")`
|
|
165
|
+
|
|
166
|
+
## 9. Tools and Commands Summary
|
|
167
|
+
|
|
168
|
+
| Goal | Command |
|
|
169
|
+
|---|---|
|
|
170
|
+
| Find entry points | `grep 'android:name' resources/AndroidManifest.xml` |
|
|
171
|
+
| Find lifecycle methods | `grep -rn 'onCreate\|onResume' sources/` |
|
|
172
|
+
| Find click handlers | `grep -rn 'setOnClickListener\|onClick' sources/` |
|
|
173
|
+
| Find DI bindings | `grep -rn '@Provides\|@Binds\|@Inject' sources/` |
|
|
174
|
+
| Find constants | `grep -rni 'BASE_URL\|API_KEY' sources/` |
|
|
175
|
+
| Find usages of a class | `grep -rn 'ClassName' sources/` |
|
|
176
|
+
| Follow a string | `grep -rn '"some text"' sources/` |
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Fernflower / Vineflower CLI Reference
|
|
2
|
+
|
|
3
|
+
Fernflower is the JetBrains analytical Java decompiler. [Vineflower](https://github.com/Vineflower/vineflower) is the actively maintained community fork with better output quality and published releases. They share the same CLI interface.
|
|
4
|
+
|
|
5
|
+
## When to Use Fernflower vs jadx
|
|
6
|
+
|
|
7
|
+
| Scenario | Recommended |
|
|
8
|
+
|---|---|
|
|
9
|
+
| APK with resources needed | jadx |
|
|
10
|
+
| Standard Java JAR/library | Fernflower |
|
|
11
|
+
| jadx output has warnings/errors on specific classes | Fernflower on those classes |
|
|
12
|
+
| Complex lambdas, generics, streams | Fernflower |
|
|
13
|
+
| Large APK (>50MB), quick overview | jadx |
|
|
14
|
+
| Obfuscated Android app | jadx first, Fernflower on problem areas |
|
|
15
|
+
| Both decompilers available | Use `--engine both` and compare |
|
|
16
|
+
|
|
17
|
+
## Basic Usage
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
java -jar fernflower.jar [options] <source>... <destination>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- `<source>` — JAR file, class file, or directory containing class files
|
|
24
|
+
- `<destination>` — output directory
|
|
25
|
+
|
|
26
|
+
For a JAR input, Fernflower produces a JAR in the destination containing `.java` source files. Extract it with `unzip` to browse the sources.
|
|
27
|
+
|
|
28
|
+
## Key Options
|
|
29
|
+
|
|
30
|
+
Options use the format `-<key>=<value>`. Boolean options: `1` = enabled, `0` = disabled.
|
|
31
|
+
|
|
32
|
+
| Option | Default | Description |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `-dgs=1` | 0 | Decompile generic signatures (recommended) |
|
|
35
|
+
| `-ren=1` | 0 | Rename obfuscated identifiers |
|
|
36
|
+
| `-mpm=60` | 0 | Max seconds per method — prevents hangs (recommended) |
|
|
37
|
+
| `-hes=0` | 1 | Show empty super() calls |
|
|
38
|
+
| `-hdc=0` | 1 | Show empty default constructors |
|
|
39
|
+
| `-udv=1` | 1 | Use debug variable names if available |
|
|
40
|
+
| `-ump=1` | 1 | Use debug parameter names if available |
|
|
41
|
+
| `-lit=1` | 0 | Output numeric literals as-is |
|
|
42
|
+
| `-asc=1` | 0 | Encode non-ASCII as unicode escapes |
|
|
43
|
+
| `-lac=1` | 0 | Decompile lambdas as anonymous classes |
|
|
44
|
+
| `-log=WARN` | INFO | Reduce output verbosity |
|
|
45
|
+
| `-e=<lib>` | — | Add library for context (not decompiled, improves type resolution) |
|
|
46
|
+
|
|
47
|
+
## Recommended Presets
|
|
48
|
+
|
|
49
|
+
### General use
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
java -jar fernflower.jar -dgs=1 -mpm=60 input.jar output/
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Obfuscated code
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
java -jar fernflower.jar -dgs=1 -ren=1 -mpm=60 input.jar output/
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Maximum detail
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
java -jar fernflower.jar -dgs=1 -hes=0 -hdc=0 -mpm=60 input.jar output/
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### With Android SDK context (better type resolution)
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
java -jar fernflower.jar -dgs=1 -mpm=60 -e=$ANDROID_HOME/platforms/android-34/android.jar input.jar output/
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Working with APK Files
|
|
74
|
+
|
|
75
|
+
Fernflower cannot read APK/DEX files directly. Use dex2jar first:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Step 1: Convert DEX to JAR
|
|
79
|
+
d2j-dex2jar -f -o app-converted.jar app.apk
|
|
80
|
+
|
|
81
|
+
# Step 2: Decompile with Fernflower
|
|
82
|
+
java -jar fernflower.jar -dgs=1 -mpm=60 app-converted.jar output/
|
|
83
|
+
|
|
84
|
+
# Step 3: Extract the resulting source JAR
|
|
85
|
+
unzip -o output/app-converted.jar -d output/sources/
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The `decompile.sh --engine fernflower` script automates these steps.
|
|
89
|
+
|
|
90
|
+
## Supported Input Formats
|
|
91
|
+
|
|
92
|
+
| Format | Direct support | Via dex2jar |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| `.jar` | Yes | — |
|
|
95
|
+
| `.class` | Yes | — |
|
|
96
|
+
| `.zip` (with classes) | Yes | — |
|
|
97
|
+
| `.apk` | No | Yes |
|
|
98
|
+
| `.dex` | No | Yes |
|
|
99
|
+
| `.aar` | No | Yes |
|
|
100
|
+
|
|
101
|
+
## Output Format
|
|
102
|
+
|
|
103
|
+
- **JAR input** → Produces `<destination>/<input-name>.jar` containing `.java` files
|
|
104
|
+
- **Class file input** → Produces `.java` files directly in the destination
|
|
105
|
+
- **No resource decoding** — Fernflower only produces Java source, never XML/resources
|
|
106
|
+
|
|
107
|
+
## Fernflower vs Vineflower
|
|
108
|
+
|
|
109
|
+
Vineflower is the recommended fork. Improvements over upstream Fernflower:
|
|
110
|
+
|
|
111
|
+
- Published releases on GitHub and Maven Central
|
|
112
|
+
- Better handling of modern Java (records, sealed classes, pattern matching)
|
|
113
|
+
- More accurate lambda and switch expression decompilation
|
|
114
|
+
- Active bug fixes and community maintenance
|
|
115
|
+
- Same CLI interface — drop-in replacement
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# jadx CLI Reference
|
|
2
|
+
|
|
3
|
+
## Basic Usage
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
jadx [options] <input-file>
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Input can be an `.apk`, `.jar`, `.aar`, `.dex`, or `.zip` file.
|
|
10
|
+
|
|
11
|
+
## Key Options
|
|
12
|
+
|
|
13
|
+
| Option | Description |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `-d <dir>` | Output directory for decompiled sources |
|
|
16
|
+
| `--deobf` | Enable deobfuscation — renames obfuscated classes/methods to readable names |
|
|
17
|
+
| `--show-bad-code` | Show partially decompiled code instead of error comments |
|
|
18
|
+
| `--no-res` | Skip resource decoding — faster when you only need code |
|
|
19
|
+
| `--no-src` | Skip source decompilation — only decode resources |
|
|
20
|
+
| `--export-gradle` | Generate a Gradle project structure (useful for importing into IDE) |
|
|
21
|
+
| `-e` | Same as `--export-gradle` |
|
|
22
|
+
| `--threads-count <N>` | Number of processing threads (default: CPU count) |
|
|
23
|
+
| `-Xmx<size>` | Set maximum Java heap (e.g., `-Xmx4g` for large APKs) |
|
|
24
|
+
|
|
25
|
+
## Decompiling Different File Types
|
|
26
|
+
|
|
27
|
+
### APK (Android Application Package)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
jadx -d output-dir app.apk
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Produces:
|
|
34
|
+
- `output-dir/sources/` — Decompiled Java source files
|
|
35
|
+
- `output-dir/resources/` — Decoded resources (AndroidManifest.xml, layouts, drawables, etc.)
|
|
36
|
+
|
|
37
|
+
### JAR (Java Archive)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
jadx -d output-dir library.jar
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Useful for analyzing third-party libraries bundled within an APK.
|
|
44
|
+
|
|
45
|
+
### AAR (Android Archive)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
jadx -d output-dir library.aar
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
AAR files contain both compiled code and Android resources. jadx handles them directly.
|
|
52
|
+
|
|
53
|
+
## Handling Obfuscated Code
|
|
54
|
+
|
|
55
|
+
Apps built with ProGuard or R8 produce obfuscated bytecode with single-letter class and method names.
|
|
56
|
+
|
|
57
|
+
### Strategies
|
|
58
|
+
|
|
59
|
+
1. **Use `--deobf`** to generate readable replacement names:
|
|
60
|
+
```bash
|
|
61
|
+
jadx --deobf -d output-dir app.apk
|
|
62
|
+
```
|
|
63
|
+
jadx creates a mapping file at `output-dir/deobf-mapping.txt` that maps original obfuscated names to generated names.
|
|
64
|
+
|
|
65
|
+
2. **Use the ProGuard mapping file** if available (sometimes shipped in the APK under `assets/` or obtainable from build artifacts):
|
|
66
|
+
```bash
|
|
67
|
+
jadx --deobf-map mapping.txt -d output-dir app.apk
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
3. **Focus on string constants and API calls** rather than class names when navigating obfuscated code. URL strings, annotation values, and library classes are not obfuscated.
|
|
71
|
+
|
|
72
|
+
## jadx-gui
|
|
73
|
+
|
|
74
|
+
For interactive exploration, use the GUI version:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
jadx-gui app.apk
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Features:
|
|
81
|
+
- Full-text search across all decompiled sources
|
|
82
|
+
- Click-through navigation (jump to definition)
|
|
83
|
+
- Deobfuscation with live renaming
|
|
84
|
+
- Smali view alongside Java
|
|
85
|
+
|
|
86
|
+
jadx-gui is included in the same distribution as the CLI tool.
|
|
87
|
+
|
|
88
|
+
## Common Workflows
|
|
89
|
+
|
|
90
|
+
### Code-only decompilation (fastest)
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
jadx --no-res --show-bad-code -d output app.apk
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Full decompilation with deobfuscation
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
jadx --deobf --show-bad-code -d output app.apk
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Export as Gradle project for IDE import
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
jadx -e -d output app.apk
|
|
106
|
+
# Then open output/ in Android Studio or IntelliJ
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Decompile a specific DEX from a multi-dex APK
|
|
110
|
+
|
|
111
|
+
Extract the APK (it's a ZIP), then target individual DEX files:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
unzip app.apk -d extracted/
|
|
115
|
+
jadx -d output extracted/classes2.dex
|
|
116
|
+
```
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Setup Guide: Dependencies for Android Reverse Engineering
|
|
2
|
+
|
|
3
|
+
## Java JDK 17+
|
|
4
|
+
|
|
5
|
+
jadx requires Java 17 or later.
|
|
6
|
+
|
|
7
|
+
### Ubuntu / Debian
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
sudo apt update
|
|
11
|
+
sudo apt install openjdk-17-jdk
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Fedora
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
sudo dnf install java-17-openjdk-devel
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Arch Linux
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
sudo pacman -S jdk17-openjdk
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### macOS (Homebrew)
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
brew install openjdk@17
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
After installation on macOS, follow the symlink instructions printed by Homebrew, or add to your shell profile:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Verify
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
java -version
|
|
42
|
+
# Should show version 17.x or higher
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## jadx
|
|
48
|
+
|
|
49
|
+
jadx is the Java decompiler used to convert APK/JAR/AAR files to readable Java source.
|
|
50
|
+
|
|
51
|
+
### Option 1: GitHub Releases (recommended)
|
|
52
|
+
|
|
53
|
+
1. Go to <https://github.com/skylot/jadx/releases/latest>
|
|
54
|
+
2. Download the `jadx-<version>.zip` file (not the source archive)
|
|
55
|
+
3. Extract and add to PATH:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
unzip jadx-*.zip -d ~/jadx
|
|
59
|
+
export PATH="$HOME/jadx/bin:$PATH"
|
|
60
|
+
# Add the export line to your ~/.bashrc or ~/.zshrc for persistence
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Option 2: Homebrew (macOS / Linux)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
brew install jadx
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Option 3: Build from source
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
git clone https://github.com/skylot/jadx.git
|
|
73
|
+
cd jadx
|
|
74
|
+
./gradlew dist
|
|
75
|
+
# Binaries will be in build/jadx/bin/
|
|
76
|
+
export PATH="$(pwd)/build/jadx/bin:$PATH"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Verify
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
jadx --version
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Fernflower / Vineflower (optional, recommended)
|
|
88
|
+
|
|
89
|
+
Fernflower is the JetBrains Java decompiler. It produces better output than jadx on complex Java constructs, lambdas, and generics. [Vineflower](https://github.com/Vineflower/vineflower) is the actively maintained community fork with published releases — prefer it over upstream Fernflower.
|
|
90
|
+
|
|
91
|
+
### Option 1: Vineflower from GitHub Releases (recommended)
|
|
92
|
+
|
|
93
|
+
1. Go to <https://github.com/Vineflower/vineflower/releases/latest>
|
|
94
|
+
2. Download `vineflower-<version>.jar`
|
|
95
|
+
3. Place it and set the environment variable:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
mkdir -p ~/vineflower
|
|
99
|
+
mv vineflower-*.jar ~/vineflower/vineflower.jar
|
|
100
|
+
export FERNFLOWER_JAR_PATH="$HOME/vineflower/vineflower.jar"
|
|
101
|
+
# Add the export to ~/.bashrc or ~/.zshrc for persistence
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Option 2: Build Fernflower from source
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
git clone https://github.com/JetBrains/fernflower.git
|
|
108
|
+
cd fernflower
|
|
109
|
+
./gradlew jar
|
|
110
|
+
# Produces: build/libs/fernflower.jar
|
|
111
|
+
export FERNFLOWER_JAR_PATH="$(pwd)/build/libs/fernflower.jar"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Option 3: Homebrew (Vineflower)
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
brew install vineflower
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Verify
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
java -jar "$FERNFLOWER_JAR_PATH" --version
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
> **Note**: Fernflower only works on JVM bytecode (JAR, class files). For APK/DEX files, you also need **dex2jar** (see below) as an intermediate conversion step.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## dex2jar (optional, needed for Fernflower on APK files)
|
|
131
|
+
|
|
132
|
+
Converts Android DEX bytecode to standard Java JAR files.
|
|
133
|
+
|
|
134
|
+
### GitHub Releases
|
|
135
|
+
|
|
136
|
+
1. Go to <https://github.com/pxb1988/dex2jar/releases/latest>
|
|
137
|
+
2. Download and extract:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
unzip dex-tools-*.zip -d ~/dex2jar
|
|
141
|
+
export PATH="$HOME/dex2jar:$PATH"
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Homebrew
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
brew install dex2jar
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Verify
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
d2j-dex2jar --help
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Usage
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# Convert APK (or DEX) to JAR
|
|
160
|
+
d2j-dex2jar -f -o output.jar app.apk
|
|
161
|
+
|
|
162
|
+
# Then decompile with Fernflower
|
|
163
|
+
java -jar vineflower.jar output.jar decompiled/
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Optional Tools
|
|
169
|
+
|
|
170
|
+
### apktool
|
|
171
|
+
|
|
172
|
+
Useful for decoding resources (XML layouts, drawables) that jadx sometimes handles poorly.
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# Ubuntu/Debian
|
|
176
|
+
sudo apt install apktool
|
|
177
|
+
|
|
178
|
+
# macOS
|
|
179
|
+
brew install apktool
|
|
180
|
+
|
|
181
|
+
# Manual: https://apktool.org/docs/install
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### adb (Android Debug Bridge)
|
|
185
|
+
|
|
186
|
+
Useful for pulling APKs directly from a connected Android device.
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# Ubuntu/Debian
|
|
190
|
+
sudo apt install adb
|
|
191
|
+
|
|
192
|
+
# macOS
|
|
193
|
+
brew install android-platform-tools
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Pull an APK from a device:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# List installed packages
|
|
200
|
+
adb shell pm list packages | grep <keyword>
|
|
201
|
+
|
|
202
|
+
# Get APK path
|
|
203
|
+
adb shell pm path com.example.app
|
|
204
|
+
|
|
205
|
+
# Pull the APK
|
|
206
|
+
adb pull /data/app/com.example.app-xxxx/base.apk ./app.apk
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Troubleshooting
|
|
212
|
+
|
|
213
|
+
| Problem | Solution |
|
|
214
|
+
|---|---|
|
|
215
|
+
| `jadx: command not found` | Ensure the jadx `bin/` directory is in your `$PATH` |
|
|
216
|
+
| `Error: Could not find or load main class` | Java is missing or wrong version — verify with `java -version` |
|
|
217
|
+
| jadx runs out of memory on large APKs | Increase heap: `jadx -Xmx4g -d output app.apk` or set `JAVA_OPTS="-Xmx4g"` |
|
|
218
|
+
| Decompiled code has many `// Error` comments | Try `--show-bad-code` to see partial output, or use `--deobf` for obfuscated apps |
|
|
219
|
+
| Fernflower hangs on a method | Use `-mpm=60` to set a 60-second timeout per method |
|
|
220
|
+
| Fernflower JAR not found | Set `FERNFLOWER_JAR_PATH` env variable to the full path of the JAR |
|
|
221
|
+
| dex2jar fails with `ZipException` | The APK may have a non-standard ZIP structure — try `jadx` instead |
|