Fire OS 8搭載Fire TV対応アプリの開発について
Fire OS 8には、Android 10(APIレベル29)とAndroid 11(APIレベル30)のアップデート内容が組み込まれています。ここでは、Fire OS 8向けにアプリを開発するうえで考慮すべき重要な変更点をいくつか紹介します。
- Fire OS 8搭載デバイスと旧Fire OS搭載デバイス
- Android 10のアップデート内容
- Android 11のアップデート内容
- Fire OS 8とAndroid 11の互換性
- Fire OS 8デバイスへのアプリのターゲット指定
- Fire OS 8デバイスにおけるアプリの互換性テスト
- minSdkVersionとtargetSdkVersionの設定
- minSdkVersionがサポート対象デバイスに与える影響
- WakeLockの変更点
- サポート
Fire OS 8搭載デバイスと旧Fire OS搭載デバイス
Fire OS 8には、Android 10(APIレベル29)とAndroid 11(APIレベル30)のアップデート内容が組み込まれています。古いバージョンのFire TVデバイスの中には、まだ以前のバージョンのFire OSで動作するものもあります。
Fire TVデバイスおよびバージョンの詳細については、Fire OSのバージョンを参照してください。
Android 10のアップデート内容
Android 10で開発者が知っておくべき重要な機能は以下のとおりです。詳細については、Android 10の機能とAPIを参照してください。
TLS 1.3のサポート(デフォルトで有効)
Fire OS 8では、TLS 1.3のサポートが追加され、すべてのTLS接続に対してデフォルトで有効になっています。アプリを更新して、TLS 1.3をサポートすることをお勧めします。以前のバージョンのTLSプロトコルを使用する必要がある場合は、以下を呼び出して、TLS 1.3が無効になっているSSLContext
を取得できます。
SSLContext.getInstance("TLSv1.2")
位置情報にアクセスするためのフォアグラウンドサービスタイプ
Fire OS 8(APIレベル29)以降をターゲットとするアプリでフォアグラウンドサービスの位置情報にアクセスする場合は、location
のフォアグラウンドサービスタイプを<service>
コンポーネントの属性として宣言します。
<manifest>
... <service ... *android:foregroundServiceType="location"* /></manifest>
フォアグラウンドサービスのタイプ | 各タイプを宣言する必要があるサービスのユースケースの例 |
---|---|
dataSync |
ネットワークからファイルをダウンロードする |
location |
ユーザーが開始したアクションを続行する |
mediaPlayback |
オーディオブック、ポッドキャスト、音楽を再生する |
mediaProjection |
デバイスのディスプレイに表示された動画を短時間録画する |
foregroundServiceType
は、ライブラリのマニフェストに追加する必要があります。
バックグラウンドでのデバイス位置情報へのアクセス
APIレベル29以上をターゲットとするアプリでは、バックグラウンドで位置情報にアクセスすることはできません。アプリがバックグラウンドで実行されているときに位置情報を受け取るには、アプリのマニフェストでACCESS_BACKGROUND_LOCATIONパーミッションを宣言する必要があります。
<manifest ... >
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
バックグラウンドからのアクティビティの開始に関する制限
Android 10以降では、バックグラウンドからアクティビティを開始できる状況に制限が設けられています。この動作変更は、ユーザー側の操作の中断を最小限にして、ユーザーが画面に表示されているアプリをよりよく制御できるようにするためのものです。アクティビティがユーザーの操作によって直接開始される限り、アプリがこの制限の影響を受けることはほぼありません。
高効率画像ファイル(HEIF)形式
Fire OS 8タブレットでは、HEIF画像形式がネイティブにサポートされるようになりました。アプリで静止画像を扱う場合は、HEIF形式のサポートを追加することを検討してください。JPEGファイル形式と比べて高画質なうえ、ファイルサイズも縮小できます。
Android 11のアップデート内容
APK署名スキームv2の必須化
Fire OS 8(APIレベル30)をターゲットとするアプリのうち、現在APK署名スキームv1でのみ署名されているアプリでは、APKに対して、今後APK署名スキームv2での署名も必要になります。Fire OS 8デバイスでは、APK署名スキームv1でのみ署名されているアプリを、ユーザーがインストールまたはアップデートすることはできません。旧バージョンのFire OSを搭載するデバイスをサポートするには、v1を使用した署名に加えて、v2以降を使用した署名もAPKに追加する必要があります。
APKで使用されている署名のバージョンは、apksigner
を使用して確認できます。
apksigner verify -v <APK名.apk>
ワンタイムパーミッション
Fire OS 8(APIレベル30)以降では、アプリが位置情報、マイク、カメラに関連するパーミッションをリクエストするたびに、ユーザーに表示されるパーミッションのダイアログにワンタイムパーミッション(今回のみ)というオプションが表示されます。ユーザーがダイアログでこのオプションを選択すると、アプリに一時的なパーミッションが付与されます。実行時のパーミッションの確認とリクエストに関するベストプラクティスに従って、必要なパーミッションが確実に付与されるようにしてください。
パッケージの公開設定
Fire OS 8(APIレベル30)をターゲットとするアプリでインストール済みアプリのリストを取得すると、リストがデフォルトでフィルタリングされます。インストール済みアプリの広範なリストにアクセスするには、アプリ側で、クエリや操作を直接行う必要のあるアプリに関する情報を指定できます。これは、Androidマニフェストに<queries>
要素を追加して実行できます。
<manifest package="com.yourapp.name">
…
<queries>
// 操作が必要なアプリのパッケージ名がわかっている場合
<package android:name="com.anotherapp.firstapp" />
<package android:name="com.someapp.secondapp" />
// 特定のインテントを持つすべてのアプリに対してクエリを実行する場合
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
…
</manifest>
フォアグラウンドサービスでのカメラやマイクへのアクセス
アプリがAPIレベル30以上をターゲットとしており、フォアグラウンドサービスでカメラまたはマイクにアクセスする場合は、camera
またはmicrophone
のフォアグラウンドサービスタイプをそれぞれ<service>
コンポーネントの属性として宣言する必要があります。
<manifest>
...
<service ...
android:foregroundServiceType="camera|microphone" />
</manifest>
圧縮されたリソースファイル
Android 11(APIレベル30)以上をターゲットとするアプリは、圧縮されたresources.arsc
ファイルが含まれている場合、またはこのファイルが4バイト境界にそろえられていない場合はインストールできません。エラーが発生した場合は、zipalignのログを調べて、resources.arsc
ファイルが圧縮されていないことを確認してください。
Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary]
動的インテントフィルター
インテントを受け取るには、アプリのマニフェストでインテントフィルターを定義して、アプリで受け取ることができるデータの種類を宣言する必要があります。これはAndroid 11で導入されたマニフェスト要素で、MIMEグループと呼ばれます。MIMEグループを使用するには、android:mimeGroup
属性を使用して、データ要素をアプリのマニフェストに含めます。
バックグラウンドからのカスタムトーストのブロック
バックグラウンドから送信されるカスタムビューを含むトーストがブロックされるようになりました。ただし、非推奨のsetView()ではなくToast.makeText()を使用すれば、テキストトーストは引き続き使用できます。
Fire OS 8とAndroid 11の互換性
Fire OS 8で実装されている機能はすべてAndroid 11と同等のものですが、Android 11のすべての機能がFire OS 8でも利用できるわけではありません。Android 11の機能には、まだ一部のFire OS 8デバイスでサポートされていないものもあります。
また、Fire OS 8の機能はAndroid 11と同等ですが、GoogleのサービスはAmazon Fireデバイスでは使用できません。代わりに、必要なサービス(アプリ内課金など)に対応するAmazon SDKを使用する必要があります。
Fire OS 8デバイスへのアプリのターゲット指定
ユーザーがアプリを実行するデバイスとしては、Fire OS 5、Fire OS 6、Fire OS 7、Fire OS 8が考えられます。デバイスのFire OSバージョンとアプリの互換性を最大限に高めるため、SDKレベルに基づいてターゲットデバイスを指定することをお勧めします。
Fire OS 8デバイスをターゲットに指定するには、コードでBuild.VERSION.SDK_INT
が30(Android 11のAPIレベル)以上になっているかどうかを確認してください。
詳細については、Androidドキュメントの各種のプラットフォームバージョンをサポートするも参照してください。
Fire OS 8デバイスにおけるアプリの互換性テスト
アプリとFire OS 8の互換性は、実際のデバイスに接続することでテストが可能です。
minSdkVersionとtargetSdkVersionの設定
minSdkVersion
は、該当するFire OSバージョンの最小APIレベルに設定します。
Fire OSのバージョン | minSdkVersion |
---|---|
Fire OS 5 | 22 |
Fire OS 7 | 28 |
Fire OS 8 | 30 |
targetSdkVersion
は、ターゲットとする最も高いAPIレベルに設定します。
最小APIレベル要件の詳細については、デバイスフィルタリングと互換性に記載の「Fire OSとAndroidのAPIレベル」を参照してください。
minSdkVersionがサポート対象デバイスに与える影響
アプリが正常に動作するために必要な最小SDKレベルは、アプリのマニフェスト(またはbuild.gradle
ファイル)内のminSdkVersion
属性で設定します(そのAPIレベルをサポートしていないデバイスでは、該当アプリのインストールはできません。詳細については、デバイスフィルタリングと互換性を参照してください)。
Fire OS 5デバイスはAPIレベル22(Lollipop 5.1)、Fire OS 8デバイスはAPIレベル30(Android 11)をベースにしています。minSdkVersion
を22に設定した場合、アプリが正常に動作するにはデバイスのAPIレベルが22以上であることが必要になります。
Androidではレベルに下位互換性があるため、minSdkVersion
を22に設定すると、より高いAPIレベル(30など)のデバイスにもアプリがインストール可能になります。APIレベル30には、通常、レベル1~30のすべてのAPIが含まれます(リリースのたびに前回のレベルに追加)。
しかし、Android 11(APIレベル30)のAPIを利用する場合、minSdkVersion
を22に設定すると、APIレベルが30ではないFire OS 5デバイスにアプリがインストールされてしまいます。そのため、防御的なコーディングを行う必要があります。デバイスのレベルを確認して、そのAPIレベルがサポートされていない場合は別のレベルにフォールバックするようなコード作成が必須となります。たとえば、以下のようなコードが考えられます。
if (Build.VERSION.SDK_INT >= 30) {
Log.v(TAG, "はい、これはAPIレベル30以上のデバイスです");
} else {
Log.v(TAG, "いいえ、これはAPIレベル30以上のデバイスではありません");
}
このコードは、デバイスのAPIレベルが30以上であるかどうかを確認します。APIレベルが30以上の場合、コードが実行されます。そうでない場合、else
ロジックでフォールバックします。
デフォルトでは、targetSdkVersion
が指定されていない場合、minSdkVersion
と同じ値が使用されます。targetSdkVersion
には、アプリのテストに使用した最も高いAPIレベルを設定することができます。Androidは、アプリがこの値に基づいてデバイスで適切に動作するようにします。
たとえば、targetSdkVersion
を25以上(Nougatのリリース)に設定すると、AndroidはNougatに含まれる実行時パーミッション確認機能を適用します。しかし、targetSdkVersion
が25未満(Nougatに実行時パーミッション確認機能が導入される前)の場合、Androidはこの動作をアプリに適用しません。
推奨はしませんが、Fire OS 8デバイスに古いアプリが表示されないようにする必要がある場合は、maxSdkVersion
をFire OS 7(APIレベル28)に設定することもできます。
詳細については、以下を参照してください。
<uses-sdk>
- 各種のプラットフォームバージョンをサポートする
- Picking your
compileSdkVersion
,minSdkVersion
, andtargetSdkVersion
(英語のみ)
WakeLockの変更点
フォーカスされている起動状態のアプリをユーザーが4時間操作しなかった場合、「まだ視聴していますか?」という確認メッセージが表示されます。ユーザーが確認しなかった場合は、ホーム画面に戻ります。詳細については、WakeLockの要件を参照してください。
この機能は [設定] でオフにできます。アプリがサイネージアプリの場合、この機能が適用されないようにするには、Amazonにお問い合わせください。
サポート
Fire OS 8でアプリに問題が見つかった場合は、Amazon Fire TVとFire TV Stickに関するフォーラムでその問題を報告してください。
Last updated: 2023年11月7日