RIPDPI's own Compose conventions: ViewModel pattern, Route/Screen split, DataStore->StateFlow, RipDpiThemeTokens. Use for how this app does Compose, not generic Compose API questions (see compose).
日本語の概要は準備中です。原文の説明を表示しています。
Reference for Android VPN/proxy service lifecycle: runtime coordinators, status/telemetry flow, where to make changes. Use when touching service start/stop, handover, or coordinator code.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
The Android services are thin shells now. Real lifecycle behavior lives in runtime coordinators plus ServiceStatusReporter, not in a single global app-state singleton.
Service work in this repo usually touches one or more of:
ServiceStateStore status, events, and telemetryquick_v1 diagnostics probes after successful handoversServiceController.start(mode)
-> START_ACTION / STOP_ACTION intent
-> RipDpiVpnService or RipDpiProxyService
-> ProxyServiceRuntimeCoordinator / VpnServiceRuntimeCoordinator
-> ConnectionPolicyResolver
-> proxy / tunnel runtime start-stop-restart
-> ServiceStatusReporter
-> ServiceStateStore
| Component | Location | Role |
|---|---|---|
ServiceController / DefaultServiceController | core/service/.../ServiceManager.kt | App entry point for start/stop |
RipDpiVpnService | core/service/.../RipDpiVpnService.kt | Android VPN service shell |
RipDpiProxyService | core/service/.../RipDpiProxyService.kt | Android foreground proxy service shell |
BaseServiceRuntimeCoordinator | core/service/.../ServiceRuntimeCoordinator.kt | Shared mutex, lifecycle state machine, stop/start/handover flow |
ProxyServiceRuntimeCoordinator | core/service/.../ProxyServiceRuntimeCoordinator.kt | Proxy-mode runtime orchestration |
VpnServiceRuntimeCoordinator | core/service/.../VpnServiceRuntimeCoordinator.kt | VPN-mode proxy+tunnel orchestration, resolver refresh, DNS failover |
ServiceStatusReporter | core/service/.../ServiceStatusReporter.kt | Maps runtime changes into UI-facing status/events/telemetry |
ServiceStateStore | core/data/.../ServiceStateStore.kt | Shared StateFlow / SharedFlow store observed by the app |
ConnectionPolicyResolver | core/service/.../ConnectionPolicyResolver.kt | Resolves live or remembered policy for the current network |
NetworkHandoverMonitor | core/service/.../NetworkHandoverMonitor.kt | Detects actionable network changes |
ActiveConnectionPolicyStore | core/service/.../ActiveConnectionPolicyStore.kt | Persists active policy metadata for diagnostics and telemetry |
interface ServiceStateStore {
val status: StateFlow<Pair<AppStatus, Mode>>
val events: SharedFlow<ServiceEvent>
val telemetry: StateFlow<ServiceTelemetrySnapshot>
fun setStatus(status: AppStatus, mode: Mode)
fun emitFailed(sender: Sender, reason: FailureReason)
fun updateTelemetry(snapshot: ServiceTelemetrySnapshot)
}
Runtime code should usually write through ServiceStatusReporter. That keeps status, events, and telemetry consistent.
Start/stop logic is serialized inside the coordinator mutex:
suspend fun start() {
mutex.withLock {
val resolution = resolveInitialConnectionPolicy()
applyActiveConnectionPolicy(...)
startResolvedRuntime(...)
serviceRuntimeRegistry.register(session)
updateStatus(ServiceStatus.Connected)
startNetworkHandoverMonitoring()
startModeTelemetryUpdates()
}
}
The VPN coordinator adds:
VpnTunnelRuntime startup and shutdownVpnResolverRefreshPlannerVpnEncryptedDnsFailoverControllerThe proxy coordinator adds:
ProxyRuntimeSupervisor startup and shutdownonRevoke().ProxyServiceRuntimeCoordinator or VpnServiceRuntimeCoordinator for runtime orchestration.ServiceStatusReporter for UI-visible status, failure, or telemetry projection.ConnectionPolicyResolver, NetworkHandoverMonitor, or resolver refresh logic when the behavior depends on network context.ServiceTelemetrySnapshot and ServiceEvent as compatibility-sensitive contracts used by tests, diagnostics, and exports.| Mistake | Fix |
|---|---|
| Patching only the Android service shell | Most lifecycle logic lives in the coordinator layer now |
Writing directly to ServiceStateStore from arbitrary runtime code | Prefer ServiceStatusReporter so fields stay coherent |
| Ignoring the coordinator mutex or lifecycle state machine | Start/stop/handover paths must stay serialized |
| Forgetting remembered-policy or handover side effects | Service restarts affect policy replay, telemetry, and hidden diagnostics probes |
| Treating telemetry fields as disposable | ServiceTelemetrySnapshot is part of the repo’s compatibility surface |
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
RIPDPI's own Compose conventions: ViewModel pattern, Route/Screen split, DataStore->StateFlow, RipDpiThemeTokens. Use for how this app does Compose, not generic Compose API questions (see compose).
日本語の概要は準備中です。原文の説明を表示しています。
ADB-based RIPDPI device/emulator debugging: build/install/launch, logcat filtering, fixture port-forwarding, instrumented tests, crash/ANR triage. Use when debugging on a real device or emulator.
日本語の概要は準備中です。原文の説明を表示しています。
RIPDPI Appium launch-contract reference: start routes and permission/service/data presets. Use when a test launches to the wrong screen or a new automation route is added. General flakiness: appium-test-debug.
日本語の概要は準備中です。原文の説明を表示しています。
RIPDPI Appium test authoring: page objects, resource-id locators, assertions, wait tiers. Use when writing a new Appium test or page object, or adding coverage for a new screen.
日本語の概要は準備中です。原文の説明を表示しています。
RIPDPI Appium failure triage: flaky tests, locator/session/wait issues, screenshot and element-tree debugging. Use when an Appium test fails or is flaky.
日本語の概要は準備中です。原文の説明を表示しています。
Add or modify a GitHub Actions job. Use when editing a file under .github/workflows/. Not for running a workflow locally (local-ci-act) or release signing (release-signing).
日本語の概要は準備中です。原文の説明を表示しています。