Support constrained satellite networks

For Android 16 and later, declare constrained-network support in the app manifest and make network behavior tolerate low bandwidth, high latency, and interruptions. The declaration makes an app eligible; it does not guarantee carrier support.

Required

1. Declare support in the manifest

Add the satellite data optimization property to the final app's <application> element. Use the exact package name as the value. This declaration belongs to the app manifest, not a library.

AndroidManifest.xml

<application
    android:label="@string/app_name">
    <meta-data
        android:name="android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"
        android:value="com.example.yourapp" />
</application>

Verify the declaration in the released APK before shipping.

If you build custom network requests

2. Handle constrained network requests

Apps with custom ConnectivityManager or NetworkRequest logic must not require an unconstrained network. Remove that requirement and branch from the transport and capabilities Android reports.

Kotlin

val request = NetworkRequest.Builder()
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)
    .build()

fun shouldOptimizeForSatellite(capabilities: NetworkCapabilities) =
    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE) ||
    !capabilities.hasCapability(
        NetworkCapabilities.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
    )

Keep payloads small, queue work, make retries resumable, and limit background transfers.

Optional / apps using FCM

3. Enable constrained FCM delivery

If your app uses Firebase Cloud Messaging, set the Android-specific flag on messages that should be delivered over a constrained network.

FCM message payload

{
  "message": {
    "token": "DEVICE_TOKEN",
    "data": { "sync": "requested" },
    "android": {
      "bandwidth_constrained_ok": true
    }
  }
}

Before release

4. Test on a constrained network

Use an Android 16 device or emulator configuration that exposes constrained-network behavior. Check payload size, timeouts, retries, queued work, and recovery after the connection disappears.

Canonical references