MyFamilyTracker
Real-time family location sharing — Firebase Realtime DB for sub-second propagation, WorkManager + ForegroundService for OS-compliant background collection, geofencing via Google Maps API.
Amazon's Fire OS shares Android's codebase but diverges in ways that will surprise you. These are the specific behavioral differences — background restrictions, JavaScript timers, WebView versions, permission models — that break apps built for Android and deployed on Fire OS devices.
On this page
If you build Android apps, you probably know that Fire OS is "just Android." Amazon's OS for Fire TV and Fire tablets is forked from AOSP. Most Android code runs on it without modification.
Most.
After testing across Fire TV Stick Gen 2, Gen 3, Fire TV Cube, Fire Tablet HD 8, HD 10, and multiple Fire OS versions, I've catalogued the divergences that break production apps. None of them are in the official documentation. You find them the hard way.
Android's documentation describes
dozeFire OS 7 (Fire TV) background change that cost us 4 hours:
In Fire OS 7.x, Amazon tightened background process handling for apps not in Amazon's own ecosystem. A streaming/playback app we were maintaining — designed to run continuously in a signage context — started dying in the background on Fire OS 7 devices while surviving fine on Android 9.
The behavior: the app's
ForegroundServiceThe fix: Add
android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS// This works on Android. On Fire OS 7, you also need to
// guide users to Settings → Applications → [App] → Battery
// because the standard battery optimization API doesn't fully override
// Amazon's own management layer.
val intent = Intent().apply {
action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
data = Uri.parse("package:$packageName")
}
startActivity(intent)[!WARNING] Test your background service survival explicitly on Fire OS. Don't assume Android foreground service guarantees hold. Run a 4-hour soak test with the device idle.
Fire OS uses its own WebView implementation — based on Chromium, but a different version than what ships with Android on comparable hardware.
The specific regression we hit:
Content built on
requestAnimationFramerAFThis wasn't a hardware limitation. It was a WebView scheduler decision. Amazon's WebView throttles rAF in contexts it considers "background" even when the WebView is the foreground content.
setInterval and setTimeout drift:
On budget Fire TV hardware (not Fire TV Cube), JavaScript timers running
setInterval(fn, 1000)// More resilient than setInterval for long-running signage
function accurateTick() {
const now = Date.now();
const delay = 1000 - (now % 1000); // sync to wall clock
setTimeout(() => {
updateDisplay();
accurateTick(); // recursive with correction
}, delay);
}Fire OS apps go through the Amazon Appstore, not Google Play. This means:
Firebase on Fire OS:
Firebase SDK requires Google Play Services. On Fire TV and Fire Tablets, Google Play Services are not present. Firebase Crashlytics, Firebase Messaging (FCM), and Firebase Auth all fail silently without proper detection.
// Always check before initializing Firebase features
private fun isGooglePlayServicesAvailable(): Boolean {
return try {
val result = GoogleApiAvailability.getInstance()
.isGooglePlayServicesAvailable(this)
result == ConnectionResult.SUCCESS
} catch (e: Exception) {
false
}
}
// Fire OS detection
private fun isFireOS(): Boolean {
return Build.MANUFACTURER.equals("Amazon", ignoreCase = true)
}If your app relies on Firebase Messaging for remote commands (common in signage apps), you need a fallback: either Amazon's own SNS/SQS for push, or polling.
Camera and microphone permissions:
Fire tablets handle permission dialogs differently at the system level. Apps that request camera permission during a background startup (before any UI is visible) get auto-denied on Fire OS — not queued for when the UI appears, auto-denied. The standard Android approach of requesting permissions lazily breaks here.
Android devices running stock AOSP get security patches on Google's schedule. Fire OS devices get updates on Amazon's schedule — and Fire OS updates often include behavioral changes that aren't documented in the security patch notes.
Real incident:
A Fire OS over-the-air update pushed to a client's deployed fleet of 40 Fire TV Sticks overnight. The update changed how Fire OS handles
FLAG_KEEP_SCREEN_ONWe only knew because crash monitoring (which we'd set up to tag firmware version):
FirebaseCrashlytics.getInstance().apply {
setCustomKey("fire_os_version", Build.VERSION.RELEASE)
setCustomKey("amazon_firmware", Build.DISPLAY) // Amazon-specific build string
setCustomKey("device_model", Build.MODEL)
}The
Build.DISPLAYFire TV has a different home launcher than standard Android TV. Intent filters that work correctly for side-loading on Android may not surface your app correctly on Fire TV's launcher.
The CATEGORY_LEANBACK_LAUNCHER
Android TV and Fire TV both require
CATEGORY_LEANBACK_LAUNCHER<!-- Required for Fire TV launcher visibility -->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>Amazon's screensaver interruption:
Fire TV has an Amazon-controlled screensaver that activates based on idle detection. Even apps running in full kiosk mode with
FLAG_KEEP_SCREEN_ONThis is a known Fire OS behavior with no clean developer workaround. The options: use Amazon's device administrator profile to configure screensaver timeout (requires enterprise enrollment), or simulate periodic user interaction events via accessibility.
Fire TV devices use different GPU/decoder hardware across generations:
| Device | SoC | H.265 Support | 4K H.264 |
|---|---|---|---|
| Fire TV Stick Gen 2 | MT8695P | No | No |
| Fire TV Stick 4K | MT8695 | Yes | Yes |
| Fire TV Cube Gen 2 | Amlogic S922Z | Yes, 8K | Yes |
| Fire TV Stick 4K Max | MT8696 | Yes | Yes |
The trap: H.265 (HEVC) content that plays on 4K hardware fails completely on Gen 2 hardware. MediaCodec will throw
MediaCodec.CodecException// Check codec support before assuming HEVC is available
fun isHevcSupported(): Boolean {
return MediaCodecList(MediaCodecList.ALL_CODECS)
.codecInfos
.any { codec ->
!codec.isEncoder &&
codec.supportedTypes.any { it.equals("video/hevc", ignoreCase = true) }
}
}
// In your media player setup:
val videoMimeType = if (isHevcSupported()) "video/hevc" else "video/avc"If you're building for Fire OS:
setIntervalrequestAnimationFrameBuild.DISPLAYCATEGORY_LEANBACK_LAUNCHERFire OS is close enough to Android that most code works. The gaps are specific, undocumented, and only visible under real deployment conditions — which is exactly why they catch teams off guard.
Sudarshan Chaudhari
AI Systems Builder / Product Engineer
Bangkok, Thailand
Solo Android developer with 13+ years in QA, building Android apps, AI automation systems, and developer tools at SudarshanTechLabs.
Related Posts
Related Apps
Real-time family location sharing — Firebase Realtime DB for sub-second propagation, WorkManager + ForegroundService for OS-compliant background collection, geofencing via Google Maps API.
Building something? Available for Android dev and QA consulting.
Work with meComments — powered by Giscus