Fire OS 16搭載Fire TV対応アプリの開発について
Fire OS 16はAPIレベル36をベースにしています。以下のセクションでは、Fire OS 16向けアプリを開発するうえで考慮すべき重要な変更点について説明します。以下のように標準のAndroidコンポーネントへの移行を行うと、互換性の問題が発生するリスクが軽減され、アプリを簡単に管理できるようになります。
- Fire OS 16デバイスと旧Fire OSデバイス
- Androidのアップデート内容
- Amazon SDKの更新
- アプリのターゲットをFire OS 16デバイスに指定する方法
- アプリのテスト
- minSdkVersionとtargetSdkVersionの設定
- minSdkVersionがサポート対象デバイスと下位互換性に与える影響
- サポート
- 関連トピック
Fire OS 16デバイスと旧Fire OSデバイス
Fire OS 16には、Android 15(APIレベル35)とAndroid 16(APIレベル36)のアップデート内容が組み込まれています。古いバージョンのFire TVデバイスの中には、まだ以前のバージョンのFire OSで動作するものもあります。
Fire TVデバイスおよびバージョンの詳細については、Fire OSのバージョンを参照してください。
Androidのアップデート内容
Android 16にアップグレードする際に知っておくべき重要な機能と動作の変更点は以下のとおりです。
ARTの内部APIの制限
Android 16では、Androidランタイム(ART)およびDalvikの内部クラス(sun.misc.Unsafe、dalvik.system.*、libcore.io.*)へのアクセスが制限されています。また、隠しフレームワークAPIへのリフレクションによるアクセスも制限されます。
解決策
アプリがこれらの内部APIを使用している場合は、以下を実行してください。
sun.misc.Unsafeをjava.lang.invoke.VarHandleまたはAtomicReferenceFieldUpdaterに置き換えます。dalvik.system.*を公開されているClassLoaderAPIに置き換えます。- 依存関係を確認します。サードパーティの多くの広告SDKと分析ライブラリは、これらの内部APIを使用しています。サードパーティ製SDKを最新バージョンに更新します。
エッジツーエッジ表示の強制適用
Android 15(API 35)では、SDK 35以降をターゲットとするアプリにエッジツーエッジレンダリングが適用されます。
Android 16(API 36)では、アプリにオプトアウトを許可していたwindowOptOutEdgeToEdgeEnforcementテーマ属性は完全に無視されます。以前にこの回避策を使用していたアプリでは、レイアウトが崩れます。
解決策
アプリでwindowOptOutEdgeToEdgeEnforcementを使用している場合は、以下を実行してください。
WindowInsetsCompatAPIを使用してインセットを適切に処理します。windowOptOutEdgeToEdgeEnforcementは、API 36では動作しないため、すべて削除します。- アプリのレイアウトをテストして、コンテンツが隠れていないことを確認します。
詳細については、エッジツーエッジのオプトアウトの廃止を参照してください。
TLS 1.0/1.1の削除
Android 15(API 35)以降では、TLS 1.0およびTLS 1.1プロトコルの使用は禁止されています。
解決策
アプリがTLS 1.0/1.1を使用している場合は、以下を実行してください。
- バックエンドサーバーがTLS 1.2以上に対応していることを確認します。
SSLContextまたはOkHttpクライアントのセットアップから、明示的なTLS 1.0/1.1の構成をすべて削除します。network_security_config.xmlで最小TLSバージョンが指定されている場合は、更新します。
16KBページサイズのサポート
Android 16では、16KBのメモリページサイズがサポートされるようになりました。アプリにネイティブ(NDK)ライブラリが含まれている場合は、それらのライブラリを16KBのページアライメントでコンパイルする必要があります。
解決策
アプリにネイティブライブラリが含まれている場合は、以下を実行してください。
-Wl,-z,max-page-size=16384を指定して、ネイティブライブラリを再ビルドします。objdump -p libYourLib.so | grep LOADを使用してアライメントを確認します。
ネイティブライブラリのアライメントが不適切なアプリは、16KBページサイズのカーネルを実行しているデバイスでクラッシュしたり、読み込めなかったりする可能性があります。
Android 16では、android:pageSizeCompatマニフェスト宣言がない、4KBアライメントのネイティブライブラリを含むアプリは、起動するたびに互換性に関する警告ダイアログがユーザーに表示され、互換性が低下したモードで実行されます。警告の表示を抑制して互換モードを回避するには、ネイティブライブラリを16KBアライメントで再コンパイルするか、マニフェストに以下を追加してください。
<application
android:pageSizeCompat="true"
... >
ローカルネットワークへのパーミッションが必要
Android 16では、ローカルネットワーク検出(mDNS、SSDP、NsdManager、マルチキャスト)を使用するアプリにNEARBY_WIFI_DEVICESパーミッションが必要です。
解決策
次のパーミッションを使用します。
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
このパーミッションがないと、デバイスの検出およびキャスト機能(Chromecast、スマートスピーカー、マルチルームオーディオ)は機能しません。
Dolby/DTSオーディオパススルーの無効化
Android 15(API 35)以降では、リソースの上限に達すると、システムはパススルーを使用してAudioTrackインスタンスを無効にするか、オーディオエンコーディング(Dolby AC3、E-AC3、DTS、TrueHD)をオフロードする場合があります。
解決策
アプリが上記のオーディオエンコーディングを使用している場合は、以下を実行してください。
- オーディオ出力が無効化されたことを検出するために、
AudioTrack.OnRoutingChangedListenerを登録します。 AudioTrackを再作成するか、デコード済みオーディオ出力にフォールバックすることで、無効化を適切に処理します。- HDMIパススルーのシナリオ(Dolby/DTSサラウンドサウンド)を徹底的にテストします。
BOOT_COMPLETEDの動作の変更
Android 15(API 35)以降では、「stopped」状態のアプリはBOOT_COMPLETEDブロードキャストを受信しません。アプリは、新しくインストールされた直後(まだ一度も起動されていない状態)またはユーザーが強制停止したときにstopped状態になります。
さらに、Android 15では、BOOT_COMPLETEDレシーバーを持つアプリが、起動時に制限付きフォアグラウンドサービスタイプ(メディア再生、データ同期、カメラ)を開始できないようにブロックされます。
解決策
BOOT_COMPLETEDレシーバーを確認し、制限付きフォアグラウンドサービスタイプを開始するものをすべて削除します。代わりにWorkManagerを使用します。
詳細については、パッケージの停止状態の変更を参照してください。
フォアグラウンドサービスタイプが必要
Android 14(API 34)以降、すべてのフォアグラウンドサービスはマニフェストでforegroundServiceTypeを宣言する必要があります。Fire OS 16では、サービスタイプなしでFOREGROUND_SERVICEパーミッションを宣言したアプリは、MissingForegroundServiceTypeExceptionが発生してクラッシュします。
解決策
次のサービスタイプを使用します。
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false" />
有効なタイプには、mediaPlayback、dataSync、location、camera、microphone、phoneCall、connectedDevice、mediaProjection、health、remoteMessaging、systemExempted、shortService、specialUseなどがあります。
予測型「戻る」ジェスチャーの強制適用
Android 16以降では、予測型「戻る」ジェスチャーがすべてのアプリに適用されます。非推奨になったonBackPressed()メソッドとKeyEvent.KEYCODE_BACKインターセプトは、戻るナビゲーションの動作を制御しません。
解決策
-
AndroidManifest.xmlの<application>タグで、android:enableOnBackInvokedCallback="true"を設定します。<!-- AndroidManifest.xml --> <application android:enableOnBackInvokedCallback="true" ... > -
すべての
onBackPressed()オーバーライドを、OnBackInvokedCallbackまたはJetpackのOnBackPressedCallbackAPIに置き換えます。getOnBackInvokedDispatcher().registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, () -> { // 戻るナビゲーションを処理します } );onBackInvokedDispatcher.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT ) { // 戻るナビゲーションを処理します }
onBackPressed()に引き続き依存するアプリは、Fire OS 16デバイスで戻るボタンのナビゲーション(Fire TVリモコンの戻るボタンを含む)が適切に動作しない可能性があります。targetSdkVersionの制約
Android 14(API 34)以降では、targetSdkVersionが23未満のアプリはインストールできません。アプリでこの対象APIレベルの最小要件を満たすことを必須とすることにより、ユーザーのセキュリティとプライバシーが強化されます。Fire OS 16では、以下の制限が適用されます。
targetSdkVersionが24未満のアプリは、インストールが完全にブロックされる可能性があります。targetSdkVersionが24~27のアプリは、互換性に関する警告を1回だけユーザーに表示します。
詳細については、Android 16との互換性を確認するを参照してください。
正確なアラームの制限
Android 14(API 34)以降、SCHEDULE_EXACT_ALARMは事前に付与されません。アプリは、正確なアラームをスケジュールする前に、実行時にcanScheduleExactAlarms()を確認する必要があります。
解決策
まずは以下のコード例を使用してください。
AlarmManager alarmManager = getSystemService(AlarmManager.class);
if (alarmManager.canScheduleExactAlarms()) {
// 正確なアラームをスケジュールします
} else {
// 不正確なアラームにフォールバックするか、パーミッションをリクエストします
}
val alarmManager = getSystemService(AlarmManager::class.java)
if (alarmManager.canScheduleExactAlarms()) {
// 正確なアラームをスケジュールします
} else {
// 不正確なアラームにフォールバックするか、パーミッションをリクエストします
}
RenderScriptの削除
Android 15(API 35)以降、RenderScriptランタイムは削除されました。RenderScriptライブラリ(librenderscript-toolkit.so、libRSSupport.so、librsjni.so)をバンドルするアプリは、Fire OS 16ではクラッシュします。
解決策
VulkanコンピューティングまたはRenderScript組み込み関数置換ツールキットを使用して、画像処理コードを移行します。詳細については、RenderScriptからの移行を参照してください。
JobSchedulerの割り当ての強制適用
Android 16では、JobSchedulerの実行時の割り当てがより厳密になりました。実行時間が長すぎるジョブや頻繁に実行されるジョブは、制限または停止される可能性があります。コード逆コンパイル分析によると、Fire TV対応アプリの91%(119個中108個)がJobSchedulerを使用しており、これらの割り当ての対象となっています。これは動作の変更であり、アプリがクラッシュすることはありませんが、バックグラウンドタスクの信頼性は時間の経過とともに低下する可能性があります。
詳細については、JobSchedulerの割り当ての最適化を参照してください。
アクセシビリティ通知の廃止
Android 16では、announceForAccessibility()とTYPE_ANNOUNCEMENTアクセシビリティイベントのサポートを終了しました。
解決策
アプリがこれらの廃止されたAPIを使用している場合は、以下を実行してください。
announceForAccessibility()をsetAccessibilityPaneTitle()またはandroid:accessibilityLiveRegion(ライブリージョンの場合)に置き換えます。TYPE_ANNOUNCEMENTイベントを、ペインタイトルを使用するTYPE_WINDOW_STATE_CHANGEDに置き換えます。
メディアプロジェクションに同意が必要
Android 15(API 35)以降、MediaProjection APIを使用するアプリでは、セッションごとにユーザーの同意を得る必要があります。以前に付与されたパーミッションは、セッションをまたいで保持されません。
解決策
アプリでMediaProjection APIを使用している場合は、以下を実行してください。
- 画面キャプチャまたは録画が開始されるたびに、
MediaProjectionパーミッションをリクエストします。 - ユーザーが同意を拒否した場合は適切に処理します。
Amazon SDKの更新
アプリにAmazon SDKが統合されている場合は、Fire OS 16と互換性のある最新バージョンを使用していることを確認します。
| SDK | ダウンロード |
|---|---|
| Appstore SDK(IAP、DRM、シンプルサインイン) | Fire OS向けの開発 |
| Appstore請求サービス対応SDK | アプリをスケーラブルに展開 |
| Amazon Device Messaging(ADM)SDK | Fire OS向けの開発 |
| A3L SDK(Authentication、Location、Messaging) | アプリをスケーラブルに展開 |
| Fire TV統合SDK(コンテンツパーソナライゼーション) | Fire TV SDK |
| Login with Amazon SDK | その他のSDKとリソース |
すべてのSDKの一覧については、SDKとサンプルを参照してください。
アプリのターゲットをFire OS 16デバイスに指定する方法
ユーザーは、Fire OS 5、Fire OS 6、Fire OS 7、Fire OS 8、Fire OS 14、Fire OS 16のいずれかが搭載されたデバイスでアプリを実行する可能性があります。デバイスのFire OSバージョンとアプリの互換性を最大限に高めるため、SDKレベルに基づいてターゲットデバイスを指定することをお勧めします。
Fire OS 16デバイスをターゲットに指定するには、コードでBuild.VERSION.SDK_INTが36(Android 16のAPIレベル)以上になっているかどうかを確認してください。
詳細については、プラットフォームの各種バージョンのサポートを参照してください。
アプリのテスト
Fire OS 16デバイスでアプリをテストする場合、Amazonアプリストア品質管理セントラルのライブデバイスインタラクション(LDI)を使用できます。LDIを使用すると、AmazonアプリストアのデバイスファームにあるFire OS 16デバイスにリモートでアクセスして、そのデバイスでテストを実行できます。LDIの詳細については、ライブデバイスインタラクションを参照してください。
さらに、アプリをクローズドベータテスト用に配布する場合は、ライブアプリテスト(LAT)を使用してFire OS 16デバイスをターゲットにすることができます。LATを始めるには、ライブアプリテストを始めるを参照してください。
minSdkVersionとtargetSdkVersionの設定
targetSdkVersionは、ターゲットとする最も高いAPIレベルに設定します。Fire OS 16デバイスの場合、Amazonでは、targetSdkVersionを36に設定することを要件としています。Fire OS 16デバイスでのアプリの互換性を保証するために、Fire OS 5、Fire OS 6、Fire OS 7、Fire OS 8、Fire OS 14を搭載している以前のFire TVデバイスで動作するアプリについては、targetSdkVersionを36にアップレベルする必要があります。
minSdkVersionを目的のAPIレベルに設定することで、以前のデバイスを引き続きサポートできます。
Fire OSのバージョンに基づいたAPIレベルを次の表に示します。
| Fire OSのバージョン | APIレベル |
|---|---|
| Fire OS 16 | 36 |
| Fire OS 14 | 34 |
| Fire OS 8 | 30 |
| Fire OS 7 | 28 |
| Fire OS 6 | 25 |
| Fire OS 5 | 22 |
詳細については、デバイスフィルタリングと互換性を参照してください。
minSdkVersionがサポート対象デバイスと下位互換性に与える影響
アプリが正常に動作するために必要な最小SDKレベルは、アプリのマニフェスト(またはbuild.gradleファイル)内のminSdkVersionで設定します。そのAPIレベルをサポートしていないデバイスでは、該当アプリのインストールはできません。詳細については、デバイスフィルタリングと互換性を参照してください。
Fire OS 5デバイスはAPIレベル22(Lollipop 5.1)、Fire OS 16デバイスはAPIレベル36(Android 16)をベースにしています。minSdkVersionを22に設定した場合、アプリが正常に動作するにはデバイスのAPIレベルが22以上であることが必要になります。
Androidではレベルに下位互換性があるため、minSdkVersionを22に設定すると、より高いAPIレベル(34など)のデバイスにもアプリがインストール可能になります。APIレベル34には、通常、レベル1~34のすべてのAPIが含まれます。リリースのたびに、前回のAPIレベルにレベルが追加されます。
しかし、Android 16(APIレベル36)のAPIを利用する場合、minSdkVersionを22に設定すると、APIレベルが34ではないFire OS 5デバイスにアプリがインストールされてしまいます。そのため、防御的なコーディングを行う必要があります。デバイスのAPIレベルを確認して、そのAPIレベルがサポートされていない場合は別のレベルにフォールバックするようなコード作成が必須となります。たとえば、以下のようなコードが考えられます。
if (Build.VERSION.SDK_INT >= 36) {
// Fire OS 16/Android 16固有のコード
} else {
// 以前のデバイス用のフォールバック
}
上のコード例では、デバイスのAPIレベルが36以上であるかどうかを確認しています。APIレベルが36以上の場合、コードが実行されます。それ以外の場合は、elseロジックでフォールバックします。
デフォルトでは、targetSdkVersionが指定されていない場合、minSdkVersionと同じ値がAndroidで使用されます。targetSdkVersionには、具体的にはアプリのテストに使用した最も高いAPIレベルを設定することができます。Androidは、アプリがこの値に基づいてデバイスで適切に動作するようにします。
推奨はしませんが、Fire OS 16デバイスに古いアプリが表示されないようにする必要がある場合は、maxSdkVersionをFire OS 14(APIレベル34)に設定することもできます。
詳細については、以下のリソースを参照してください。
<uses-sdk>- プラットフォームの各種バージョンのサポート
- Picking your
compileSdkVersion,minSdkVersion, andtargetSdkVersion(英語のみ)
サポート
Fire OS 16でアプリに問題が見つかった場合は、Amazon Fire TVとFire TV Stickに関するフォーラム(英語のみ)でその問題を報告してください。
関連トピック
Last updated: 2026年5月20日

