本文へ移動
cccskills
無料GitHub で公開

service-lifecycle

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.

インストール方法を見る

含まれるファイル(1)

  • SKILL.md5.1 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Service Lifecycle

Overview

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:

  • start/stop orchestration
  • remembered-policy replay
  • handover-triggered restarts
  • active-policy signature tracking
  • ServiceStateStore status, events, and telemetry
  • hidden first-seen-network quick_v1 diagnostics probes after successful handovers

Architecture

ServiceController.start(mode)
  -> START_ACTION / STOP_ACTION intent
  -> RipDpiVpnService or RipDpiProxyService
  -> ProxyServiceRuntimeCoordinator / VpnServiceRuntimeCoordinator
  -> ConnectionPolicyResolver
  -> proxy / tunnel runtime start-stop-restart
  -> ServiceStatusReporter
  -> ServiceStateStore

Key Components

ComponentLocationRole
ServiceController / DefaultServiceControllercore/service/.../ServiceManager.ktApp entry point for start/stop
RipDpiVpnServicecore/service/.../RipDpiVpnService.ktAndroid VPN service shell
RipDpiProxyServicecore/service/.../RipDpiProxyService.ktAndroid foreground proxy service shell
BaseServiceRuntimeCoordinatorcore/service/.../ServiceRuntimeCoordinator.ktShared mutex, lifecycle state machine, stop/start/handover flow
ProxyServiceRuntimeCoordinatorcore/service/.../ProxyServiceRuntimeCoordinator.ktProxy-mode runtime orchestration
VpnServiceRuntimeCoordinatorcore/service/.../VpnServiceRuntimeCoordinator.ktVPN-mode proxy+tunnel orchestration, resolver refresh, DNS failover
ServiceStatusReportercore/service/.../ServiceStatusReporter.ktMaps runtime changes into UI-facing status/events/telemetry
ServiceStateStorecore/data/.../ServiceStateStore.ktShared StateFlow / SharedFlow store observed by the app
ConnectionPolicyResolvercore/service/.../ConnectionPolicyResolver.ktResolves live or remembered policy for the current network
NetworkHandoverMonitorcore/service/.../NetworkHandoverMonitor.ktDetects actionable network changes
ActiveConnectionPolicyStorecore/service/.../ActiveConnectionPolicyStore.ktPersists active policy metadata for diagnostics and telemetry

State Management

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.

Lifecycle Pattern

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 shutdown
  • resolver refresh via VpnResolverRefreshPlanner
  • encrypted-DNS recovery via VpnEncryptedDnsFailoverController

The proxy coordinator adds:

  • ProxyRuntimeSupervisor startup and shutdown
  • proxy telemetry polling
  • proxy exit handling and failure classification

Where To Make Changes

  1. Change Android service classes only for Android-framework concerns such as intents, foreground-service behavior, or onRevoke().
  2. Change ProxyServiceRuntimeCoordinator or VpnServiceRuntimeCoordinator for runtime orchestration.
  3. Change ServiceStatusReporter for UI-visible status, failure, or telemetry projection.
  4. Change ConnectionPolicyResolver, NetworkHandoverMonitor, or resolver refresh logic when the behavior depends on network context.
  5. Treat ServiceTelemetrySnapshot and ServiceEvent as compatibility-sensitive contracts used by tests, diagnostics, and exports.

Common Mistakes

MistakeFix
Patching only the Android service shellMost lifecycle logic lives in the coordinator layer now
Writing directly to ServiceStateStore from arbitrary runtime codePrefer ServiceStatusReporter so fields stay coherent
Ignoring the coordinator mutex or lifecycle state machineStart/stop/handover paths must stay serialized
Forgetting remembered-policy or handover side effectsService restarts affect policy replay, telemetry, and hidden diagnostics probes
Treating telemetry fields as disposableServiceTelemetrySnapshot 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).

日本語の概要は準備中です。原文の説明を表示しています。

po4yka/RIPDPI792026年10月13日 更新

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.

日本語の概要は準備中です。原文の説明を表示しています。

po4yka/RIPDPI792026年10月13日 更新

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.

日本語の概要は準備中です。原文の説明を表示しています。

po4yka/RIPDPI792026年10月13日 更新

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.

日本語の概要は準備中です。原文の説明を表示しています。

po4yka/RIPDPI792026年10月13日 更新

RIPDPI Appium failure triage: flaky tests, locator/session/wait issues, screenshot and element-tree debugging. Use when an Appium test fails or is flaky.

日本語の概要は準備中です。原文の説明を表示しています。

po4yka/RIPDPI792026年10月13日 更新

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).

日本語の概要は準備中です。原文の説明を表示しています。

po4yka/RIPDPI792026年10月13日 更新

po4yka のスキルをすべて見る

このスキルの問題を報告する