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で動作するデバイスの違い

Amazon Fire TV (第3世代) は、Android Nougat (Android 7.1.2、レベル 25) をベースにした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へのアップレベルは行われません。

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

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

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

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

ランタイム時のパーミッションの確認は、インストールとアップデートのプロセスを合理化し、さらにユーザーによるアプリの制御性を向上するために、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のテレビ用機能には、次のようなものがあります。

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

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

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デバイスを識別する][fire-tv/identify-amazon-fire-tv-devices]を参照してください。また、Supporting Different Platform Versions(異なるプラットフォームバージョンをサポートする)も参照してください。

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

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

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

Fire OS 5デバイスとFire OS 6デバイスは両方とも、アプリのマニフェストから<uses-amzn-sdk>というタグを1つ削除する必要があります。このタグは、古い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レベルに設定します。

ここでは、これらの設定について詳しく説明します。アプリのマニフェスト(または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のフォーラムで問題を報告してください。