Fire OS 6搭載Fire TV対応アプリの開発について


Fire OS 6搭載Fire TV対応アプリの開発について

Fire OS 6で動作するAmazon Fire TVデバイスは、Android Nougatをベースにしています。ここに示すガイドラインに従って、アプリとFire OS 6との互換性を確認してください。

Fire OS 6で動作するデバイスとFire OS 5で動作するデバイスの違い

2018年のFire TVデバイス(Fire TV Stick 4K、Fire TV Edition(InsigniaおよびToshiba)、Fire TV Cubeなど)のほとんどは、Fire OS 6で動作します。ただし、旧モデルのFire TVデバイス(Fire TV Stick第1世代および第2世代、Fire TV第1世代および第2世代、Fire TV Edition(日本未対応))は、今後も(Lollipop、またはAndroid 5.1、レベル22、および一部のバックポートされたMarshmallowをベースにした)Fire OS 5で動作します。旧モデルのFire TVデバイスは、Fire OS 6にアップレベルされません。

Fire TVデバイスおよびバージョンの詳細については、Fire OSのバージョンを参照してください。

Android Nougatの動作の変更点と新機能

Android Nougatには、LollipopとMarshmallowから変更されている点がいくつかあります。Fire OS 6デバイス用のアプリを開発する際には、これらの変更点を考慮する必要があります。これらの変更点については、Android 7.0の変更点およびAndroid 6.0の変更点を参照してください。重要な変更点には、ランタイム時のパーミッションの確認、プライベートライブラリへのリンクなどがあります。

ランタイム時のパーミッションの確認

アプリに必要なNormalパーミッションおよびDangerousパーミッションについては、通例どおり、アプリのマニフェストで(uses-feature要素とuses-permission要素を使用して)宣言する必要があります。ただし、APIレベル23以上のデバイスでは、Androidのガイドラインに従ってランタイム時にパーミッションを確認する必要があります。Permissions overview(パーミッションの概要)実行時のパーミッションリクエストを参照してください。

ランタイム時のパーミッションの確認は、インストールとアップデートのプロセスを効率化し、さらにユーザーによるアプリの管理を強化するために、Marshmallow(APIレベル23)に導入された機能です。ランタイム時のパーミッション確認により、ユーザーは、プロンプトが表示されたときに個々のパーミッションを取り消すことができます。ユーザーがパーミッションを取り消すケースを管理する必要があります。

また、1つのバイナリが複数のデバイス(FireタブレットデバイスとAmazon Fire TVデバイスの両方)を対象としている場合、これらのデバイスに存在しない機能のパーミッションをマニフェストでリクエスト(たとえば、Fire TVアプリでジャイロスコープのパーミッションをリクエスト)しないようにしてください。詳細については、サポートされていないハードウェア機能を処理するを参照してください。

プライベートライブラリへのリンク

Android Nougatでは、アプリをNDK以外のライブラリまたはプライベートライブラリに動的にリンクさせることはできません。アプリのAPKに必要なライブラリが含まれているか、公開されているNDK APIを使用する必要があります。詳細については、Opening shared libraries directly from an APK(APKから直接共有ライブラリを開く)およびPrivate API(Enforced for API level >= 24)(プライベートAPI(APIレベル24以上に適用))を参照してください。

Fire OS 6とNougatの互換性

Fire OS 6ではAndroid Nougatの全機能がサポートされます。Fire OS 6でサポートされるNougatのテレビ用機能には、次のようなものがあります。

  • ピクチャーインピクチャー(PiP): アプリの別のエリアへの移動中に、画面の隅に動画をピニングできます。PiPウィンドウは、アプリの外部で使用することはできず、Fire OSのネイティブのユーザーインターフェイス要素をオーバーレイすることもできません。
  • コンテンツの録画: DVRと同様に、テレビのコンテンツを録画できます。
  • タイムシフトAPI: ライブコンテンツの一時停止、早戻し、早送りを可能にします。

これらの機能のコードに関する詳細と使用説明については、Androidドキュメントを参照してください。

Fire OS 6にはNougatとの同等性がありますが、GoogleのサービスはAmazon Fireデバイスでは使用できません。代わりに、必要なサービス(アプリ内課金など)に対応するアプリ・ゲームサービスSDKを使用する必要があります。詳細については、Fire TVとAndroid TVにおける開発の違いを参照してください。

Fire OS 5デバイスとFire OS 6デバイスをアプリの対象に指定

Fire OS 5とFire OS 6の機能の互換性を最大限に高めるには、状況に応じてデバイスを指定する必要があります。AFTNをBuild.Modelとして使用することで、Fire TV(第3世代)のデバイスを識別できます。ただし、より効率的な方法として、SDKレベルを指定する方法があります。コードで、Build.VERSION.SDK_INT25(NougatのAPIレベル)以上であり、Fire OS 6デバイスを指定しているかどうかを確認できます。詳細については、Fire TVデバイスを識別するを参照してください。また、異なるプラットフォームバージョンのサポートも参照してください。

新しいAmazon Fire TVデバイスでのアプリの互換性テスト

現時点では、実際のデバイスに接続しない限り、アプリとFire OS 6デバイスとの互換性をテストすることはできません。アプリテストサービスでは最小限の互換性テストしか行えないため、アプリにFire OS 6デバイスとの互換性があるかどうかはわかりません。ただし、標準のアプリ申請プロセスでアプリの申請を行った場合、申請を通過できない具体的な理由があれば、アプリストアチームがお知らせします。現時点では、最新のAmazon Fire TVデバイスと互換性のあるアプリは、新しいデバイスとも互換性があります。

アプリのマニフェストからuses-amzn-sdkを削除

Fire OS 5デバイスでもFire OS 6デバイスでも、アプリのマニフェストから<uses-amzn-sdk>というタグを削除する必要があります。このタグは、古いFire OS SDKアドオンに関連しています。AndroidManifest.xmlファイル内で、<uses-amzn-sdk>を宣言しているかどうかを確認してください。宣言している場合、このタグ(およびコードに含まれる依存関係)を削除します。Amazon Fire TVのアプリでは、<uses-amzn-sdk>タグは使用されなくなっています。

マニフェストにこのタグが残っている状態でもアプリはFire OS 6デバイスで動作しますが、削除することによって、今後の非互換性の発生を回避できます。古いFire OS SDKアドオンのコンポーネントはいずれも、Fireデバイス用アプリの開発には不要です。代わりに、標準のAndroid APIAmazonアプリ・ゲームサービスSDKを使用してください。

古いバージョンのUnityで開発されたゲームアプリ

古いバージョンのUnity(UnityPlayerNativeActivityがデフォルトのアクティビティとなっているUnity 4.5または4.6など)で開発されたゲームアプリがある場合、ゲームが初めてメモリに読み込まれると、読み込みが完了するまでゲーム画面が1~2秒間、何も表示されない真っ白な状態になることがあります。これは、アプリがメモリに読み込まれる(その後すべての処理が完了するのを待つ)間にAndroid Nがコールドスタートすることが原因です。この問題はFire OS 6に固有ではなく、すべてのNougatデバイスで発生します。

この問題を修正するには、最新バージョンのUnityにアップグレードします。アップグレードを選択できない場合は、UnityPlayerNativeActivityUnityPlayerActivity(Unity 5.0b12以降で使用可能)に変更して、Androidマニフェストファイルを更新してみてください。詳細については、UnityのマニュアルのAndroidマニフェストを参照してください。

メディアの再生でリソースとメモリを節約するためのベストプラクティス

Amazon Fire TV(第3世代)対応アプリのなかには、メディアの再生を適切に処理できないために不具合を発生するものがあります(この問題はFire OS 6とは無関係ですが、AmazonアプリおよびGoogleアプリの開発時のベストプラクティスとして参考にしてください)。 Amazon Fire TVのメディア再生に使用されるリソースはハードウェアベースで、メモリに限りがあるため、アプリ側には適切な動作が要求されます。使い終えたメディアリソースは確実に解放してください。

ビデオを再生するアプリは、再生を一時停止し、デコーダーなどの全メディアリソースをonPause()メソッド内ですぐに解放する必要があります。詳細については、Releasing the Media Player(MediaPlayerを解放する)およびMediaPlayer.release()を参照してください。

アプリが(<video>HTMLタグを使用して)AndroidのWebView経由でビデオを再生する場合、アプリが一時停止または停止しても、現時点では、ハードウェアメディアリソースはシステムによって解放されません。この問題を回避するには、onPause()メソッドとonStop()メソッドを実装する際にプロセスを強制的に終了して、これらのリソースを明示的に解放してください。

public void onStop() {
   super.onStop();
   android.os.Process.killProcess(android.os.Process.myPid());
}

詳細については、以下を参照してください。

minSdkVersionとtargetSdkVersionの設定

一般的に、minSdkVersionは22以下に設定します(アプリに必要な最小APIレベルに設定)。そうすることで、すべてのAmazon Fire TVデバイス(Fire OS 5またはFire OS 6で動作)でアプリが使用可能になります。targetSdkVersionは、アプリのテストに使用した最も高いAPIレベルに設定します。

minSdkVersionがサポート対象デバイスに与える影響

アプリのマニフェスト(またはbuild.gradleファイル)で、minSdkVersion属性をアプリが正常に動作するために必要な最小SDKレベルに設定します(このAPIレベルをサポートしていないデバイスにはアプリをインストールできないようにする必要があります)。

Fire OS 5デバイスは、APIレベル22(Lollipop 5.1)をベースにしています。Fire OS 6デバイスは、APIレベル25(Nougat 7.1)をベースにしています。minSdkVersionを22に設定すると、アプリが正常に動作するにはデバイスのAPIレベルが22以上であることが必要になります。

Androidではレベルに下位互換性があるため、minSdkVersionを22に設定すると、より高いAPIレベル(25など)のデバイスにもアプリがインストールされます。APIレベル25には、通常、レベル1~25のすべてのAPIが含まれます(リリースごとに前回のレベルに追加)。

一方、NougatのAPI(APIレベル25)を使用する必要がある場合はどうでしょうか。minSdkVersionを22に設定すると、APIレベルが25ではないFire OS 5デバイスにもアプリがインストールされます。そのため、防御的なコーディングを行う必要があります。つまり、デバイスのレベルを確認して、そのAPIレベルがサポートされていない場合には別のレベルにフォールバックするように、コードを作成します。このコードは、たとえば次のようになります。

if (Build.VERSION.SDK_INT >= 25) {
 Log.v(TAG, "はい、これはAPIレベル25以上のデバイスです");
} else {
 Log.v(TAG, "いいえ、これはAPIレベル25以上のデバイスではありません");
}

このコードは、デバイスのAPIレベルが25以上であるかどうかを確認します。APIレベルが25以上の場合、コードが実行されます。そうでない場合、elseロジックでフォールバックします。

デフォルトでは、targetSdkVersionが指定されていない場合、minSdkVersionと同じ値が使用されます。targetSdkVersionには、アプリのテストに使用した最新のAPIレベルを設定できます。Androidは、この値に基づいて、アプリがこのレベルのデバイスで適切に動作するようにします。

たとえば、targetSdkVersionを23以上(Marshmallowのリリース)に設定すると、Androidは、Marshmallowに含まれるランタイムパーミッションの確認機能を適用します。しかし、targetSdkVersionが23未満(Marshmallowにランタイムパーミッションの確認機能が導入される前)の場合、Androidはこの動作をアプリに適用しません。

Fire OS 6デバイスでアプリをテストした後で、targetSdkVersionを25に設定する必要があります。

maxSdkVersion属性の使用は推奨されません。ただし、アプリをFire OS 5デバイスのみで使用可能にする場合は、maxSdkVersionを22に設定しても構いません。アプリをFire OS 6デバイスのみで使用可能にする場合は、minSdkVersionを25に設定しても構いません。

詳細については、以下を参照してください。

カスタムメディアプレーヤーのAV同期の問題

AV同期の問題とは、ビデオがオーディオと完全に同期していない(声と口の動きが合っていない)という問題のことです。標準のAndroid MediaPlayerでExoPlayerを使用している場合、AV同期の問題が発生することはありません。しかし、アプリに含まれるカスタム仕様のメディアプレーヤーを使用している場合、オーディオとビデオ(AV)の同期がわずかにずれることがあります(これはFire OS 6に限った問題ではありません。Fire OSデバイス用アプリの開発全般におけるベストプラクティスとして参考にしてください)。 オーディオとビデオの同期の問題を解消する方法の詳細については、[Androidアプリにおけるオーディオとビデオの同期][fire-tv/audio-video-synchronization]を参照してください。

サポート

Fire OS 6でアプリに問題が見つかった場合は、Amazon Fire TVとFire TV Stickのフォーラムで問題を報告してください。