開発者コンソール

Fireタブレット向けFire OS 8

Fireタブレット向けFire OS 8

Fire OS 8には、Android 10(APIレベル29)とAndroid 11(APIレベル30)のアップデート内容が組み込まれています。ここでは、Fire OS 8向けにアプリを開発するうえで考慮すべき重要な変更点をいくつか紹介します。

Fire OS 8搭載デバイスと旧Fire OS搭載デバイス

Fire OS 8には、Android 10(APIレベル29)とAndroid 11(APIレベル30)のアップデート内容が組み込まれています。古いバージョンのFireタブレットデバイスの中には、まだ以前のバージョンのFire OSで動作するものもあります。

Fireタブレットデバイスおよびバージョンの詳細については、Fireタブレットのデバイス仕様:概要を参照してください。

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")

アプリ内からの設定パネルの呼び出し

Android 10では、設定パネルが導入されました。これは、アプリのコンテキスト内でユーザーに設定を表示できるようにするAPIです。

Fire OS 8では、設定パネルAPIが追加されています。このAPIを使用すると、重要なシステム設定をアプリのコンテキストから直接表示できるようになります。ユーザーはアプリを終了することなく、音量、インターネット接続オプション、Wi-Fiコントロールなどのシステム設定にアクセスできます。

Settings.Panelには、次の定数を使用できます。

  • ACTION_INTERNET_CONNECTIVITY:インターネット接続に関する設定(機内モード、Wi-Fiなど)を表示します。
  • ACTION_WIFI:Wi-Fi設定のコントロールを表示します。これは、大量のアップロードやダウンロードを行うためにWi-Fi接続が必要なアプリに有効です。
  • ACTION_VOLUME:すべての音量ストリームの設定を表示します。

共有機能の改善

Fire OS 8では、共有機能に次のような改善が加えられています。

  • ショートカット共有APIがサポートされ、アプリで事前にダイレクトシェアターゲットを公開できるようになりました。アプリでダイレクトシェアAPIを使用している場合は、ChooserTargetServiceクラスがAPIレベル30で非推奨となっているため、ショートカット共有APIに移行する必要があります。AndroidXライブラリにあるShortcutManagerCompatクラスを使用してショートカット共有APIを組み込み、ChooserTargetServiceCompatを実装して下位互換性を確保してください。
  • ダイレクトシェアターゲットとして公開できるのは、動的ショートカットに限られます。詳細については、ダイレクトシェアターゲットを公開するを参照してください。

位置情報にアクセスするためのフォアグラウンドサービスタイプ

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 10では、システム全体のダークテーマが追加されています。アプリ用にカスタムのダークテーマを作成できるほか、新しいフォースダーク機能を有効にして、既存のテーマからダークバージョンが動的に作成されるようにすることもできます。

<style name="AppTheme" parent="Theme.AppCompat.DayNight">

詳細については、Android 10の機能とAPIを参照してください。

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)に設定することもできます。

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

アプリ用の指紋認証UI

指紋を使用した認証

指紋を使用して認証するには、生体認証プロンプトの作成時に否定ボタンを設定します。

BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
            promptInfo.setNegativeButtonText("キャンセル");
            biometricPrompt.authenticate(promptInfo.build());
生体認証ログインで表示される画面

指紋とPINを使用するアプリ

指紋認証を行うときにオプションでデバイスPINを入力できるようにするには、生体認証プロンプトの作成時に、否定ボタンを削除し、setDeviceCredentialAllowedtrueに設定します。

BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
            promptInfo.setDeviceCredentialAllowed(true);
            biometricPrompt.authenticate(promptInfo.build());

UIは次のようになります。

生体認証ログインのUIサンプル
生体認証ログインのPINのサンプル

詳細については、Androidデベロッパードキュメントを参照してください。

Fireタブレットの自動バックアップ

2023年5月31日以降、Amazon Fireタブレットでは、バックアップおよび復元を選択しているユーザーを対象に自動バックアップが有効になります。API 23以降をターゲットとするアプリでは、マニフェストで自動バックアップを明示的に無効にしていない限り、自動バックアップが自動的に適用されます。自動バックアップのデフォルト値はtrueですが、マニフェストで属性を明示的に設定することをお勧めします。

自動バックアップの詳細

  • Key-Valueバックアップ用のカスタムバックアップおよび復元ロジックの記述は不要になりましたが、引き続きサポートされています。
  • この機能は、API 23以降をターゲットとしている(targetSdkVersion)アプリに対してFire OS 7以降で実行されます。
  • アプリデータは、無料で自動的にAWS S3にバックアップされます。
  • 特に指定がない限り、アプリのプライベートディレクトリにあるデータベース、共有の環境設定、そのほかのコンテンツを含め、アプリキャッシュを除くすべてのデータファイルが自動的にバックアップされます。
  • 各ユーザーのバックアップ容量は、1デバイス、1アプリあたり25MBに制限されています。この制限を超えると、アプリのデータはバックアップされなくなりますが、制限に達するまでのバックアップは引き続き復元できます。
  • バックアップされるデータには、医療保険の携行性と責任に関する法律(HIPAA)で定義されている「保護対象医療情報」や、連邦取引委員会の健康侵害通知規則で定義されている「PHRを識別可能な医療情報」など、エンドユーザーの機密データが含まれないようにしてください。また、セキュリティ上の理由から、パスワードトークンや認証情報もバックアップから除外してください。

詳細については、Androidの自動バックアップに関するドキュメントを参照してください。

アプリのバックアップ

自動バックアップでは、API 23以上をターゲットとしてFire OS 7以降で実行されているアプリが自動的にバックアップされます。BackupAgentを実装する必要はありません。自動バックアップ(android:allowbackup)のデフォルト値はtrueですが、次に示すようにマニフェストでブール値を明示的に設定することをお勧めします。

<manifest ... >
...

	<application android:allowBackup="true" ... >
...
</application>
</manifest>

デフォルトでは、アプリのデータディレクトリにあるすべてのファイル(キャッシュファイルを除く)がバックアップされます。

データのサブセットのバックアップ

Androidでは、アプリ開発者はXMLファイルスキーマを変更すれば、バックアップするファイルをカスタマイズできます。このファイルのパターンを使用して、ファイルを含めるか除外するかを選択します。バックアップされるデータには、医療保険の携行性と責任に関する法律(HIPAA)で定義されている「保護対象医療情報」や、連邦取引委員会の健康侵害通知規則で定義されている「PHRを識別可能な医療情報」など、エンドユーザーの機密データが含まれないようにしてください。また、セキュリティ上の理由から、パスワードトークンや認証情報もバックアップから除外してください。共有の環境設定など(英語のみ)、暗号化されたデータファイルがある場合、新しいデバイスに移行したときに機能しないことがあります。これらも除外することをお勧めします。

バックアップするデータをより細かく制御する必要がある場合、またはonRestoreFinished()onQuotaExceeded()などのバックアップイベントをリッスンする必要がある場合は、BackupAgentの実装を検討してください。

自動バックアップの無効化

自動バックアップを無効にする場合は、アプリのマニフェストファイルでandroid:allowBackupfalseに設定します。詳細については、バックアップを有効または無効にするを参照してください。

Key-Valueバックアップから自動バックアップへの移行

以前にBackupAgentをサブクラス化してマニフェスト(android:backupAgent)で設定することでKey-Valueバックアップを実装済みの場合は、android:fullBackupOnly="true"属性を<application/>に追加します。

自動バックアップに切り替えるときは、既存のBackupAgentを再処理するか、完全に削除してください。バックアップオプションの切り替えにより、アプリとの下位互換性が損なわれる可能性があるため、事前にそのような状況への対処法を計画しておいてください。

自動バックアップのテスト

Fireタブレットの自動バックアップ機能をテストするための大まかな手順は以下のとおりです。自動バックアップのテストに関するAOSPのドキュメントの詳細については、Androidのバックアップテストガイドを参照してください。

オプション1: Amazonのトランスポートを使用する

  1. トランスポートが正しく設定されていることを確認します。

     adb shell bmgr list transports
    

    ログの結果は次のようになります。

     * com.amazon.device.backup/.transport.BackupTransportService
     com.android.localtransport/.LocalTransport
    

    Amazonのバックアップトランスポートに設定されていない場合は、コマンドラインで設定できます。

     adb shell bmgr transport com.amazon.device.backup/.transport.BackupTransportService
    
  2. グローバル設定force_auto_backupを設定します。

    デバイスで自動バックアップをサポートするには、force_auto_backupフラグを設定します。

     adb shell settings put global force_auto_backup 1
    
  3. 自動バックアップを実行するための前提条件として、Key-Valueバックアップを実行します。これは最初に実行する必要があります。

     adb shell bmgr backup @pm@ && adb shell bmgr run
    
  4. パッケージをバックアップします。

     adb shell bmgr backupnow <PACKAGE>
    

    例:

     adb shell bmgr backupnow com.example.app
    

    完全バックアップを実行すると、次のようなログが表示されます。

     I PFTBT   : Full data backup pass finished.
    
  5. 復元トークンを問い合わせます。

    復元トークンは、バックアップの実行を識別する一意のIDです。

    例:

     adb shell dumpsys backup | grep "Current:"
    

    出力:

     Current:   3
    

    この例では、3が「復元トークン」です。

  6. 復元トークンをテストします。

     adb shell bmgr restore <token> <PACKAGE>
    

    例:

     adb shell bmgr restore 3 com.example.app
    

    復元が正常に完了した場合は、次のログが出力されます。

     I BackupManagerService: Restore complete.
    

データを削除してみて、復元が機能するかどうかを確認することもできます。アプリをアンインストールした後に再インストールしてから、バックアップデータが復元されるかどうかを確認します。

すべての手順を適切に実行すると、アプリに変更を加えることができ、以前にバックアップしたデータと共に変更が復元されます。問題が発生した場合は、下記のトラブルシューティングの手順を参照してください。

オプション2: ローカルトランスポートを使用する

データをローカルでテストするには、AOSPのローカルトランスポートを使用します。この方法ではデータはサーバーにバックアップされませんが、どのデータがバックアップされ、アプリに復元されるかをテストできます。Androidのバックアップのテストに関するガイドには、ローカルトランスポートを使用するための情報が含まれています。大まかな手順は上記と同じです。唯一の違いは、トランスポートをAmazonのトランスポートではなく、AOSPのローカルトランスポートに設定することです。

adb shell bmgr transport com.android.localtransport/.LocalTransport
バックアップトランスポートについて

バックアップトランスポートは、デバイスバックアップデータをサーバーからアップロードおよびダウンロードするロジックを処理します。Amazonの場合、バックアップトランスポートは、データをAWS S3にバックアップするロジックを処理します。

すべてのトランスポートのリストを取得する方法

すべてのトランスポートのリストは次のコマンドで取得できます。

adb shell bmgr list transports

トラブルシューティング

バックアップが有効にならない

ログに次の結果が表示される場合:

Backup finished with result: Backup is not allowed
Unable to run backup

これは、デバイスでバックアップが有効になっていないことを意味します。この問題を修正するには、[設定] > [デバイスオプション] > [バックアップと復元] の順にクリックし、[バックアップと復元]オンにします。これでバックアップの再実行を試みます。

トランスポートが却下される

まず、Fireタブレットが最新バージョンであることを確認してください。ログに次のように表示される場合:

Package <PACKAGE NAME> with result: Transport rejected package because it wasn't able to process it at the time

これには複数の原因が考えられますが、ほとんどの場合、スロットリングが原因です。パッケージは1日に1回のみバックアップできます。スロットリング制限を下げるには、次のコマンドを実行します。

adb shell settings put secure overridden_backup_throttle_delay_ms <delay in milliseconds>

例:

adb shell settings put secure overridden_backup_throttle_delay_ms 1000

タブレットでスロットリング制限を既に下げている場合、このエラーは、バックアップするデータがないことを意味している可能性があります。バックアップするデータがアプリに設定されているかどうかを確認してください。任意のバックアップデータを取得するには、次のコマンドを実行します。

adb shell
cd /storage/emulated/0/Android/data/<your package name>/files

次に、テストファイルを作成します。

touch test.txt
echo "some test data" >> test.txt
パッケージが見つからない

ログに次の結果が表示される場合:

Package <PACKAGE NAME> with result: Package not found

パッケージがデバイスにインストールされているかどうかを確認します。

WakeLockの変更点

サポート

Fire OS 8でアプリに問題が見つかった場合は、Fireタブレットに関するフォーラムでその問題を報告してください。


Last updated: 2023年5月12日