원클릭으로
android-device-debug
Android device or emulator debugging, logs, instrumented tests, crashes, and network issues.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Android device or emulator debugging, logs, instrumented tests, crashes, and network issues.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Use this skill to generate well-branded interfaces and assets for RIPDPI (an Android-native, Compose-first VPN and DPI-bypass app), either for production or throwaway prototypes/mocks/etc. Contains essential design guidelines, colors, type, fonts, brand-ship icons, and an interactive UI kit of every public composable from the live ui/components tree.
Use when managing the Rust workspace, adding/removing crates, editing workspace dependencies, running cargo nextest/audit/deny, configuring Cargo profiles for Android cross-compilation, debugging Cargo.lock churn, migrating crate edition, or wiring Gradle to cargo via the ripdpi.android.rust-native plugin.
Use when modifying the diagnostics scan pipeline, ScanRequest/ScanReport types, ProbeTask families, ripdpi-monitor-engine / ripdpi-diagnostics-* crates, strategy-probe candidates, the diagnostics catalog (packs/profiles), wire-schema contracts between Rust and Kotlin, DIAGNOSTICS_ENGINE_SCHEMA_VERSION, golden contract tests, or adding a new probe type / profile. Triggers on diagnostics scans, strategy probes, automatic audit, dpi-detector profiles, or anything in core/diagnostics or native/rust/crates/ripdpi-monitor-*.
Android-specific Rust build, verification, and packaging — per-target 16 KiB page alignment, size-optimized release profile, ELF symbol allowlist, .so size budgets, NDK 29 specifics. Use when modifying .cargo/config.toml for Android targets, the workspace [profile.release] / [profile.android-jni] block, or when verifying a built .so before release.
Telemetry and observability discipline for the RIPDPI Android Rust stack — control-plane vs data-plane logging, bounded flume event queues, atomic counters, snapshot polling, readiness callbacks, and deterministic JSON contracts. Use when authoring or modifying telemetry emission code, the bounded event ring, the Kotlin-side telemetry consumer, or any per-packet logging.
Custom detekt rules, DI/privacy/suppression guardrails, detekt.yml configuration, and false-positive triage.
| name | android-device-debug |
| description | Android device or emulator debugging, logs, instrumented tests, crashes, and network issues. |
ADB-based debugging for the RIPDPI app on physical devices and emulators. No third-party tools -- uses only adb, Gradle, and existing repo scripts.
Full test stack documentation: docs/testing.md. Do not duplicate it here -- read it when you need runner details, CI lanes, or fixture locations.
adb devices -l # list connected devices/emulators
adb wait-for-device # block until a device is available
Multi-device disambiguation:
export ANDROID_SERIAL=<serial> # all subsequent adb commands target this device
adb -s <serial> <command> # one-off targeting
# Physical device (ARM)
./gradlew assembleDebug -Pripdpi.localNativeAbis=arm64-v8a
# Emulator (x86_64 -- fast path)
./gradlew assembleDebug -Pripdpi.localNativeAbis=x86_64
adb install -r app/build/outputs/apk/debug/app-debug.apk
Source of truth: app/src/main/kotlin/com/poyka/ripdpi/automation/AutomationLaunchContract.kt
adb shell am start -n com.poyka.ripdpi/.activities.MainActivity \
--ez com.poyka.ripdpi.automation.ENABLED true \
--ez com.poyka.ripdpi.automation.RESET_STATE true \
--ez com.poyka.ripdpi.automation.DISABLE_MOTION true \
--es com.poyka.ripdpi.automation.START_ROUTE home \
--es com.poyka.ripdpi.automation.PERMISSION_PRESET granted \
--es com.poyka.ripdpi.automation.SERVICE_PRESET idle \
--es com.poyka.ripdpi.automation.DATA_PRESET clean_home
Deep link equivalent:
adb shell am start -a android.intent.action.VIEW \
-d "ripdpi-debug://automation/launch?enabled=true&reset_state=true&start_route=home"
| Extra | Values |
|---|---|
PERMISSION_PRESET | granted, notifications_missing, vpn_missing, battery_review |
SERVICE_PRESET | idle, connected_proxy, connected_vpn, live |
DATA_PRESET | clean_home, settings_ready, diagnostics_demo |
START_ROUTE | onboarding, home, config, diagnostics, history, logs, settings, mode_editor, dns_settings, advanced_settings, biometric_prompt, app_customization, about, data_transparency |
Route source of truth: app/src/main/kotlin/com/poyka/ripdpi/ui/navigation/Route.kt
Native logcat tags (from Rust source):
| Tag | Source |
|---|---|
ripdpi-native | Proxy engine + diagnostics (ripdpi-android crate) |
ripdpi-tunnel-native | VPN tunnel (ripdpi-tunnel-android crate) |
# Native layer only
adb logcat -s ripdpi-native:V ripdpi-tunnel-native:V
# App process only (all tags)
adb logcat --pid=$(adb shell pidof com.poyka.ripdpi)
# Broad filter
adb logcat | grep -i ripdpi
# Crash buffer
adb logcat -b crash -d
# Clear buffer, then reproduce and capture
adb logcat -c
# ... reproduce the issue ...
adb logcat -d > android-logcat.txt
The fixture exposes TCP/UDP/TLS echo, DNS responders, DoH, SOCKS5 relay, and fault injection.
# Start fixture on host
bash scripts/ci/start-local-network-fixture.sh
# Forward ports to device
adb reverse tcp:46090 tcp:46090 # control/health
adb reverse tcp:46001 tcp:46001 # TCP echo
adb reverse tcp:46003 tcp:46003 # TLS echo
adb reverse tcp:46053 tcp:46053 # DNS
adb reverse tcp:46054 tcp:46054 # DNS secondary
# Verify
curl -fsS http://127.0.0.1:46090/health
curl -fsS http://127.0.0.1:46090/manifest | jq .
adb reverse --list
Stop: bash scripts/ci/stop-local-network-fixture.sh
For physical devices set RIPDPI_FIXTURE_ANDROID_HOST=127.0.0.1 before starting the fixture.
# Full suite
./gradlew :app:connectedDebugAndroidTest -Pripdpi.localNativeAbis=arm64-v8a
# Integration tests only
./gradlew :app:connectedDebugAndroidTest -Pripdpi.localNativeAbis=arm64-v8a \
-Pandroid.testInstrumentationRunnerArguments.package=com.poyka.ripdpi.integration
# E2E tests only
./gradlew :app:connectedDebugAndroidTest -Pripdpi.localNativeAbis=arm64-v8a \
-Pandroid.testInstrumentationRunnerArguments.package=com.poyka.ripdpi.e2e
# Single test class
./gradlew :app:connectedDebugAndroidTest -Pripdpi.localNativeAbis=arm64-v8a \
-Pandroid.testInstrumentationRunnerArguments.class=com.poyka.ripdpi.e2e.NativeTelemetryGoldenSmokeTest
# Maestro smoke flows
bash scripts/ci/run-maestro-smoke.sh
# Coverage report
./gradlew :app:createDebugAndroidTestCoverageReport -Pripdpi.localNativeAbis=x86_64
Use -Pripdpi.localNativeAbis=x86_64 for emulator, arm64-v8a for physical device.
# Screenshot
adb exec-out screencap -p > screenshot.png
# Screen recording (Ctrl+C to stop, max 3 min)
adb shell screenrecord /sdcard/recording.mp4
adb pull /sdcard/recording.mp4 .
adb shell rm /sdcard/recording.mp4
# Package info (permissions, components, version)
adb shell dumpsys package com.poyka.ripdpi
# Running services
adb shell dumpsys activity services com.poyka.ripdpi
# VPN and network state
adb shell dumpsys connectivity
# DataStore / shared prefs
adb shell run-as com.poyka.ripdpi ls shared_prefs/
# App ops (battery optimization, etc.)
adb shell cmd appops get com.poyka.ripdpi
# Force stop
adb shell am force-stop com.poyka.ripdpi
# Clear all app data
adb shell pm clear com.poyka.ripdpi
# Check VPN tunnel interface
adb shell ip addr show tun0
# Routing table (all tables -- VPN creates its own)
adb shell ip route show table all
# Listening sockets (proxy port)
adb shell ss -tlnp
# Active reverse forwards
adb reverse --list
# Remove all reverse forwards
adb reverse --remove-all
# DNS resolution
adb shell nslookup example.com
adb logcat -b crash -d
adb shell dumpsys dropbox --print | grep -A 20 data_app_crash
# Tombstone summary
adb logcat -s DEBUG:E
# Full tombstone files (may need root)
adb shell ls /data/tombstones/
# Complete bug report
adb bugreport bugreport.zip
Symbolicate with NDK addr2line:
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/*/bin/llvm-addr2line \
-e native/rust/target/<triple>/debug/libripdpi.so <address>
Debug .so files with symbols are under native/rust/target/<triple>/debug/. The stripped copies in core/engine/build/generated/jniLibs/ lack symbols.
# Main thread state
adb shell dumpsys activity processes com.poyka.ripdpi
# ANR traces (may need root)
adb pull /data/anr/traces.txt
Common RIPDPI ANR cause: JNI call blocking the main thread. The proxy jniStart is intentionally blocking -- see native-jni-development skill.
CI uses API 34, x86_64, google_apis, default profile. Match for CI parity.
# List existing AVDs
emulator -list-avds
# Download system image (if needed)
sdkmanager "system-images;android-34;google_apis;x86_64"
# Create CI-parity AVD
avdmanager create avd -n ripdpi-debug \
-k "system-images;android-34;google_apis;x86_64" -d default
# Start with GUI
emulator -avd ripdpi-debug -gpu host
# Start headless (CI style)
emulator -avd ripdpi-debug -no-window -noaudio -no-boot-anim -gpu swiftshader_indirect
# Cold boot (no snapshot)
emulator -avd ripdpi-debug -no-snapshot-load
# Delete AVD
avdmanager delete avd -n ripdpi-debug
| Task | Command |
|---|---|
| List devices | adb devices -l |
| Install debug APK | adb install -r app/build/outputs/apk/debug/app-debug.apk |
| Launch app (clean) | adb shell am start -n com.poyka.ripdpi/.activities.MainActivity --ez com.poyka.ripdpi.automation.ENABLED true --ez com.poyka.ripdpi.automation.RESET_STATE true |
| Native logs | adb logcat -s ripdpi-native:V ripdpi-tunnel-native:V |
| Screenshot | adb exec-out screencap -p > screenshot.png |
| Forward fixture ports | adb reverse tcp:46090 tcp:46090 (repeat for 46001, 46003, 46053, 46054) |
| Run integration tests | ./gradlew :app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.package=com.poyka.ripdpi.integration |
| Force stop | adb shell am force-stop com.poyka.ripdpi |
| VPN interface check | adb shell ip addr show tun0 |
| Crash logs | adb logcat -b crash -d |
native-profiling -- CPU flamegraphs with simpleperf, HWASan memory debugging, offline symbolicationnetwork-traffic-debug -- mitmproxy SOCKS5 inspection, tcpdump on TUN, PCAPdroid, log correlationnative-jni-development -- Build pipeline, JNI exports, lifecycle rules