بنقرة واحدة
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