Skip to content
cccskills
FreePublished on 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.

The English summary is being prepared. Showing the original description.

See how to install

Files included (1)

  • SKILL.md5.1 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

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

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

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

The English summary is being prepared. Showing the original description.

po4yka/RIPDPI81Updated Oct 20, 2026

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.

The English summary is being prepared. Showing the original description.

po4yka/RIPDPI81Updated Oct 20, 2026

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.

The English summary is being prepared. Showing the original description.

po4yka/RIPDPI81Updated Oct 20, 2026

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.

The English summary is being prepared. Showing the original description.

po4yka/RIPDPI81Updated Oct 20, 2026

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

The English summary is being prepared. Showing the original description.

po4yka/RIPDPI81Updated Oct 20, 2026

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

The English summary is being prepared. Showing the original description.

po4yka/RIPDPI81Updated Oct 20, 2026

See all skills by po4yka

Report a problem with this skill