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).
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.