Fireタブレット向けFire OS 8
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がサポート対象デバイスに与える影響
- アプリ用の指紋認証UI
- Fireタブレットの自動バックアップ
- WakeLockの変更点
- サポート
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)に設定することもできます。
詳細については、以下を参照してください。
<uses-sdk>
- 各種のプラットフォームバージョンをサポートする
- Picking your
compileSdkVersion
,minSdkVersion
, andtargetSdkVersion
(英語のみ)
アプリ用の指紋認証UI
指紋を使用した認証
指紋を使用して認証するには、生体認証プロンプトの作成時に否定ボタンを設定します。
BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
promptInfo.setNegativeButtonText("キャンセル");
biometricPrompt.authenticate(promptInfo.build());
指紋とPINを使用するアプリ
指紋認証を行うときにオプションでデバイスPINを入力できるようにするには、生体認証プロンプトの作成時に、否定ボタンを削除し、setDeviceCredentialAllowed
をtrue
に設定します。
BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
promptInfo.setDeviceCredentialAllowed(true);
biometricPrompt.authenticate(promptInfo.build());
UIは次のようになります。
詳細については、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:allowBackup
をfalse
に設定します。詳細については、バックアップを有効または無効にするを参照してください。
Key-Valueバックアップから自動バックアップへの移行
以前にBackupAgent
をサブクラス化してマニフェスト(android:backupAgent
)で設定することでKey-Valueバックアップを実装済みの場合は、android:fullBackupOnly="true"
属性を<application/>
に追加します。
自動バックアップに切り替えるときは、既存のBackupAgent
を再処理するか、完全に削除してください。バックアップオプションの切り替えにより、アプリとの下位互換性が損なわれる可能性があるため、事前にそのような状況への対処法を計画しておいてください。
自動バックアップのテスト
Fireタブレットの自動バックアップ機能をテストするための大まかな手順は以下のとおりです。自動バックアップのテストに関するAOSPのドキュメントの詳細については、Androidのバックアップテストガイドを参照してください。
オプション1: Amazonのトランスポートを使用する
-
トランスポートが正しく設定されていることを確認します。
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
-
グローバル設定
force_auto_backup
を設定します。デバイスで自動バックアップをサポートするには、
force_auto_backup
フラグを設定します。adb shell settings put global force_auto_backup 1
-
自動バックアップを実行するための前提条件として、Key-Valueバックアップを実行します。これは最初に実行する必要があります。
adb shell bmgr backup @pm@ && adb shell bmgr run
-
パッケージをバックアップします。
adb shell bmgr backupnow <PACKAGE>
例:
adb shell bmgr backupnow com.example.app
完全バックアップを実行すると、次のようなログが表示されます。
I PFTBT : Full data backup pass finished.
注: 完全バックアップと自動バックアップは同じもので、これらの用語は同じ意味で使用されます。 -
復元トークンを問い合わせます。
復元トークンは、バックアップの実行を識別する一意のIDです。
例:
adb shell dumpsys backup | grep "Current:"
出力:
Current: 3
この例では、3が「復元トークン」です。
-
復元トークンをテストします。
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日