Fireタブレット向けFire OS 6


Fireタブレット向けFire OS 6

Fire HD 8(2018年)タブレットには、Fire OS 6が搭載されています。ここに示すガイドラインに従って、Fire OS 6との互換性を確保できるようにアプリを準備してください。Fire OS 6はAndroid Nougat(Android 7.1.2、レベル25)をベースとしています。

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(英語のみ)およびPrivate API(Enforced for API level >= 24)(英語のみ)を参照してください。

Fire OS 6とNougatの互換性

Fire OS 6ではAndroid Nougatのすべての機能がサポートされます。Amazon FireタブレットではGoogleのサービスを使用しないでください。代わりに、必要なサービス(アプリ内課金など)に対応するAmazon Developer SDKを使用する必要があります。詳細については、Google Play BillingからAmazonアプリ内課金(IAP)v2.0への移行を参照してください。

注目すべき新機能として、次のような機能があります。

  • Adoptable Storage
  • Doze/アプリスタンバイ

Adoptable Storage

ユーザーはSDカードなどの外部ストレージデバイスを内部ストレージとして使用できます。外部ストレージデバイスを内部ストレージとして使用する場合、そのためのフォーマットと暗号化がそのデバイスに対して行われます。この機能により、ユーザーはアプリおよびアプリのプライベートデータの両方をストレージデバイス間で移動できます。Adoptable Storageを使用すると、アプリのデータディレクトリがランタイム時に外部ストレージ上で移動することがあります。

Doze/アプリスタンバイ

Dozeおよびアプリスタンバイは、バッテリーの持続時間を延ばすことを目的にした機能であり、ユーザーがデバイスをアクティブに使用していないときに、デバイスを強制的にスリープ状態にします。これにより、バックグラウンド処理やポーリングなどを実行するアプリに対する制約が追加されます。

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

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

マニフェストにこのタグが残っていてもアプリはFire OS 6デバイスで動作しますが、削除することによって、今後、非互換性に起因する問題の発生を回避できます。古いFire OS SDKアドオンのコンポーネントはいずれもFireデバイス対応アプリの開発には不要です。代わりに、標準のAndroid APIAmazon Developer 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マニフェストを参照してください。

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

Fire OS 5とFire OS 6の機能の互換性を最大限に高めるには、状況に応じて対象デバイスを指定する必要があります。コードで、Build.VERSION.SDK_INT25(NougatのAPIレベル)以上であり、Fire OS 6デバイスを指定しているかどうかを確認できます。異なるプラットフォームバージョンのサポートを参照してください。

minSdkVersionとtargetSdkVersionの設定

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

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

アプリのマニフェスト(またはbuild.gradleファイル)で、アプリが正常に動作するために必要な最小SDKレベルをminSdkVersion属性に設定します(この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に設定しても構いません。

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