目次
1. はじめに
このドキュメントでは、デバイスが Android 5.1 との互換性を維持するために満たさなければならない要件を列挙しています。
「しなければならない」、「してはならない」、「要求される」、「するものとする」、「しないものとする」、「すべきである」、「すべきではない」、「推奨される」、「しても構わない」、「任意」の使用は、RFC2119 [参考資料、1] で規定されている IETF 標準に従います。
このドキュメントで使用する「デバイス実装者」または「実装者」とは、Android 5.1 を搭載したハードウェア / ソフトウェア ソリューションを開発する人または組織を指します。「デバイス実装」または「実装」とは、そのように開発されたハードウェア / ソフトウェア ソリューションを指します。
Android 5.1 と互換性があると見なされるには、デバイス実装で、この互換性定義に示された要件(参照により盛り込まれたドキュメントを含む)を満たさなければなりません。
この定義、またはセクション 10 に記載されているソフトウェア テストが、言及されていない、曖昧である、または不完全である場合、既存の実装との互換性を確保することはデバイス実装者の責任です。
このため、Android オープンソース プロジェクト [参考資料、2] は Android のリファレンス実装であり、優先実装です。デバイス実装者は可能な限り、Android オープンソース プロジェクトから入手できる「アップストリーム」のソースコードに基づいて実装することが強く推奨されます。一部のコンポーネントは仮に別の実装に置き換えることもできますが、ソフトウェア テストの合格が非常に困難になるため、そのような行為は行わないことが強く推奨されます。互換性テストスイートなどを含む標準的な Android 実装との完全な動作互換性を確保することは、実装者の責任です。なお、このドキュメントでは特定のコンポーネントの置き換えと変更が明示的に禁止されています。
セクション 14 に記載されている参考資料の多くは、Android SDK から直接的または間接的に派生したものであり、その SDK のドキュメントに記載された情報と機能的にまったく同じです。この互換性定義または互換性テストスイートと SDK ドキュメントの間に相違がある場合、SDK ドキュメントが正式なものであるとみなされます。セクション 14 のリファレンスに記載されている技術的な詳細情報はすべて、この互換性定義の一部とみなされます。
2. デバイスタイプ
Android オープンソース プロジェクトはさまざまなデバイスタイプとフォーム ファクタの実装で使用されてきましたが、アーキテクチャと互換性要件については、その多くの要素がハンドヘルド デバイス向けに最適化されていました。Android 5.0 以降、Android オープンソース プロジェクトは、このセクションに記載されているような幅広いデバイスタイプに対応することを目指しています。
Android ハンドヘルド デバイスとは、MP3 プレーヤー、スマートフォン、タブレットなど、通常は手に持って使用する Android デバイス実装を指します。Android ハンドヘルド デバイス実装には、以下の要件が適用されます。
- タッチスクリーンがデバイスに埋め込まれていなければなりません。
- バッテリーなど、持ち運びを可能にする電源がなければなりません。
Android テレビデバイスとは、約 10 フィート離れた場所にいるユーザーがデジタル メディア、映画、ゲーム、アプリ、ライブテレビを楽しむためのエンターテイメント インターフェースである Android デバイス実装を指します(「鑑賞モード」または「10 フィート ユーザー インターフェース」)。Android テレビデバイスには、以下の要件が適用されます。
- 埋め込み画面があるか、VGA、HDMI、ディスプレイ用ワイヤレス ポートなどの動画出力ポートを含まなければなりません。
- 機能 android.software.leanback と android.hardware.type.television [参考資料、3] を宣言しなければなりません。
Android スマートウォッチ デバイスとは、身体(通常は手首)に装着することを目的とした Android デバイス実装を指します。Android スマートウォッチ デバイスには、以下の要件が適用されます。
- 画面の対角長が物理的に 1.1 から 2.5 インチでなければなりません。
- 機能 android.hardware.type.watch を宣言しなければなりません。
- uiMode = UI_MODE_TYPE_WATCH [参考資料、4] をサポートしなければなりません。
Android Automotive 実装とは、システムやインフォテインメント機能の一部または全部について、オペレーティング システムとして Android を搭載した車両ヘッドユニットを指します。Android Automotive 実装は、uiMode = UI_MODE_TYPE_CAR [参考資料、111] をサポートしなければなりません。
上記いずれのデバイスタイプにも当てはまらない Android デバイス実装はすべて、Android 5.1 互換となるにはこのドキュメントに記載されている要件をすべて満たさなければなりません。ただし、上記の特定の Android デバイスタイプにのみ適用することが明記されている要件は除きます。
2.1 デバイス構成
ここでは、デバイスタイプごとのハードウェア構成の主な違いの概要を示します(空のセルは「しても構わない」を表します)。この表ですべての構成を網羅しているわけではありません。詳しくは該当するハードウェアのセクションをご覧ください。
カテゴリ | 機能 | セクション | ハンドヘルド | テレビ | スマートウォッチ | 自動車 | その他 |
---|---|---|---|---|---|---|---|
入力 | D-pad | 7.2.2. タップ以外のナビゲーション | しなければならない | ||||
タッチスクリーン | 7.2.4. タッチスクリーン入力 | しなければならない | しなければならない | すべきである | |||
マイク | 7.8.1. マイク | しなければならない | すべきである | しなければならない | しなければならない | すべきである | |
センサー | 加速度計 | 7.3.1 加速度計 | すべきである | すべきである | すべきである | ||
GPS | 7.3.3. GPS | すべきである | すべきである | ||||
接続 | Wi-Fi | 7.4.2. IEEE 802.11 | すべきである | しなければならない | すべきである | すべきである | |
Wi-Fi Direct | 7.4.2.1. Wi-Fi Direct | すべきである | すべきである | すべきである | |||
Bluetooth | 7.4.3. Bluetooth | すべきである | しなければならない | 必須 | しなければならない | すべきである | |
Bluetooth Low Energy | 7.4.3. Bluetooth | すべきである | しなければならない | すべきである | すべきである | すべきである | |
USB ペリフェラル / ホストモード | 7.7. USB | すべきである | すべきである | すべきである | |||
出力 | スピーカー、オーディオ出力ポート | 7.8.2. オーディオ出力 | しなければならない | 必須 | 必須 | しなければならない |
3. ソフトウェア
3.1. マネージド API の互換性
Dalvik バイトコードによるマネージド実行環境は、Android アプリを実行する際の主要手段です。Android アプリケーション プログラミング インターフェース(API)は、マネージド ランタイム環境で動作するアプリに公開される Andoid プラットフォーム インターフェースのセットです。デバイス実装は、Android SDK [参考資料、5] で公開されているドキュメント化された API、またはアップストリームの Android ソースコードにおいて @SystemApi マーカーで装飾されている API について、すべてのドキュメント化された動作も含めて、完全な実装を提供しなければなりません。
デバイス実装は、この互換性定義で特に許可される場合を除き、マネージド API の省略、API インターフェースまたは署名の変更、ドキュメント化された動作からの逸脱、NoOps の組み込みを行ってはなりません。
この互換性定義では、Android に API が含まれている一部のタイプのハードウェアについては、デバイス実装で省略することを許可しています。そのような場合であっても、API が存在し、かつ妥当な動作をしなければなりません。このシナリオに固有の要件については、セクション 7 をご覧ください。
3.2. ソフト API の互換性
セクション 3.1 のマネージド API に加えて、Android には、アプリのコンパイル時には適用できない、Android アプリのインテントや権限などの形式で、重要なランタイム専用の「ソフト」API も含まれています。
3.2.1. 権限
デバイス実装者は、権限に関するリファレンス ページ [参考資料、6] に記載されているすべての権限定数をサポートし、適用しなければなりません。なお、セクション 9 に、Android セキュリティ モデルに関連する追加の要件を記載しています。
3.2.2. ビルド パラメータ
Android API には、現在のデバイスを記述するための android.os.Build クラス [参考資料、7] の定数がいくつか含まれています。デバイス実装間で一貫した意味のある値を提供するために、デバイス実装が従わなければならない、これらの値の形式に関する追加の制限を下表に示します。
パラメータ | 詳細 |
---|---|
VERSION.RELEASE | 現在実行している Android システムのバージョン(人が読める形式)。このフィールドには、[参考資料、8] で定義されている文字列値のいずれかを指定しなければなりません。 |
VERSION.SDK | 現在実行している Android システムのバージョン(サードパーティ アプリのコードからアクセスできる形式)。Android 5.1 の場合、このフィールドには整数値 22 を指定しなければなりません。 |
VERSION.SDK_INT | 現在実行している Android システムのバージョン(サードパーティ アプリのコードからアクセスできる形式)。Android 5.1 の場合、このフィールドには整数値 22 を指定しなければなりません。 |
VERSION.INCREMENTAL | 現在実行している Android システムの特定のビルドを指定する、デバイス実装者が選択した値(人が読める形式)。この値は、エンドユーザーが利用できる別のビルドに再利用してはなりません。このフィールドは主に、ビルドの生成に使用されたビルド番号またはソース管理変更 ID を示すために使用します。このフィールドの具体的な形式についての要件はありませんが、null または空の文字列("")であってはなりません。 |
BOARD | デバイスで使用される特定の内部ハードウェアを識別する、デバイス実装者が選択した値(人が読める形式)。このフィールドは、デバイスに電力を供給するボードの特定のリビジョンを示すために使用できます。このフィールドの値は、7 ビット ASCII としてエンコード可能であって、正規表現「^[a-zA-Z0-9_-]+$」に一致しなければなりません。 |
BRAND | エンドユーザーが知っているデバイスに関連付けられたブランド名を反映する値。人が読める形式でなければならず、デバイスのメーカーまたはデバイスを販売する会社のブランドを表すべきです。このフィールドの値は、7 ビット ASCII としてエンコード可能であって、正規表現「^[a-zA-Z0-9_-]+$」に一致しなければなりません。 |
SUPPORTED_ABIS | ネイティブ コードの命令セット(CPU タイプ + ABI 規則)の名前。セクション 3.3 ネイティブ API の互換性をご覧ください。 |
SUPPORTED_32_BIT_ABIS | ネイティブ コードの命令セット(CPU タイプ + ABI 規則)の名前。セクション 3.3 ネイティブ API の互換性をご覧ください。 |
SUPPORTED_64_BIT_ABIS | ネイティブ コードの 2 番目の命令セット(CPU タイプ + ABI 規則)の名前。セクション 3.3 ネイティブ API の互換性をご覧ください。 |
CPU_ABI | ネイティブ コードの命令セット(CPU タイプ + ABI 規則)の名前。セクション 3.3 ネイティブ API の互換性をご覧ください。 |
CPU_ABI2 | ネイティブ コードの 2 番目の命令セット(CPU タイプ + ABI 規則)の名前。セクション 3.3 ネイティブ API の互換性をご覧ください。 |
DEVICE | ハードウェア機能の構成とデバイスの工業デザインを識別する開発名またはコードネームを含む、デバイス実装者が選択した値。このフィールドの値は、7 ビット ASCII としてエンコード可能であって、正規表現「^[a-zA-Z0-9_-]+$」に一致しなければなりません。 |
FINGERPRINT | このビルドを一意に識別する文字列。人が読める程度の形式にすべきです。次のテンプレートに従わなければなりません。
$(BRAND)/$(PRODUCT)/$(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS) 例: acme/myproduct/mydevice:5.1/LMYXX/3359:userdebug/test-keys フィンガープリントには空白文字を含んではなりません。上記のテンプレートに含まれる他のフィールドに空白文字がある場合は、ビルドのフィンガープリントでアンダースコア(_)などの別の文字に置き換えなければなりません。このフィールドの値は 7 ビット ASCII としてエンコード可能でなければなりません。 |
HARDWARE | ハードウェアの名前(カーネル コマンドラインまたは /proc から)。合理的な程度に人が読める形式にすべきです。このフィールドの値は、7 ビット ASCII としてエンコード可能であって、正規表現「^[a-zA-Z0-9_-]+$」に一致しなければなりません。 |
HOST | ビルドが構築されたホストを一意に識別する文字列(人が読める形式)。このフィールドの具体的な形式についての要件はありませんが、null または空の文字列("")であってはなりません。 |
ID | 特定のリリースを参照するためにデバイス実装者が選択する識別子(人が読める形式)。このフィールドは android.os.Build.VERSION.INCREMENTAL と同じにすることができますが、エンドユーザーがソフトウェア ビルドを区別できるよう十分な程度に意味のある値にすべきです。このフィールドの値は、7 ビット ASCII としてエンコード可能であって、正規表現「^[a-zA-Z0-9._-]+$」に一致しなければなりません。 |
MANUFACTURER | 製品の相手先ブランド製品製造企業(OEM)の商号。このフィールドの具体的な形式についての要件はありませんが、null または空の文字列("")であってはなりません。 |
MODEL | エンドユーザーが知っているデバイスの名前を含む、デバイス実装者が選択した値。これは、デバイスが市販されエンドユーザーに販売される際の名前と同じにするべきです。このフィールドの具体的な形式についての要件はありませんが、null または空の文字列("")であってはなりません。 |
PRODUCT | 特定の製品(SKU)の開発名またはコードネームを含む、デバイス実装者が選択した値。同じブランド内で一意でなければなりません。人が読める形式でなければなりませんが、必ずしもエンドユーザーに表示することを意図したものではありません。このフィールドの値は、7 ビット ASCII としてエンコード可能であって、正規表現「^[a-zA-Z0-9_-]+$」に一致しなければなりません。 |
SERIAL | ハードウェア シリアル番号であり、使用可能なものでなければなりません。このフィールドの値は、7 ビット ASCII としてエンコード可能であって、正規表現「^([a-zA-Z0-9]{6,20})$」に一致しなければなりません。 |
TAGS | ビルドをさらに区別する、デバイス実装者が選択したタグのカンマ区切りのリスト。このフィールドには、典型的な 3 つの Android プラットフォーム署名設定(release-keys、dev-keys、test-keys)に対応する値のいずれかを指定しなければなりません。 |
TIME | ビルドが作成されたときのタイムスタンプを表す値。 |
TYPE | ビルドのランタイム構成を指定する、デバイス実装者が選択した値。このフィールドには、典型的な 3 つの Android ランタイム構成(user、userdebug、eng)に対応する値のいずれかを指定しなければなりません。 |
USER | ビルドを生成したユーザー(または自動ユーザー)の名前またはユーザー ID。このフィールドの具体的な形式についての要件はありませんが、null または空の文字列("")であってはなりません。 |
3.2.3. インテントの互換性
デバイス実装では、以下の各セクションに記載されているように、Android の疎結合インテント システムを尊重しなければなりません。「尊重する」とは、デバイス実装者が、一致するインテント フィルタを指定し、指定されたインテント パターンごとに正しい動作をバインドして実装する Android アクティビティまたはサービスを提供しなければならないことを意味します。
3.2.3.1. コアアプリのインテント
Android インテントによって、アプリ コンポーネントは他の Android コンポーネントの機能をリクエストできます。Android のアップストリーム プロジェクトには、コア Android アプリとみなされるアプリのリストがあります。これらのアプリは、一般的なアクションを実行する複数のインテント パターンを実装します。コア Android アプリを次に示します。
- 卓上時計
- ブラウザ
- カレンダー
- 連絡先
- ギャラリー
- グローバル検索
- ランチャー
- 音楽
- 設定
デバイス実装は、必要に応じてコア Android アプリを含むべきですが、これらのコア Android アプリのすべての「パブリック」Activity または Service コンポーネントによって定義される、同じインテント パターンを実装するコンポーネントを含まなければなりません。なお、Activity または Service コンポーネントは、android:exported 属性が存在しないか、値が true の場合、「パブリック」とみなされます。
3.2.3.2. インテントのオーバーライド
Android は拡張可能なプラットフォームであるため、デバイス実装は、セクション 3.2.3.1 で参照されている各インテント パターンをサードパーティ アプリでオーバーライドできるようにしなければなりません。アップストリームの Android オープンソース実装では、デフォルトでこれが可能です。デバイス実装者は、システムアプリがこれらのインテント パターンを使用することに対し特別な権限を付与したり、サードパーティ アプリがこれらのパターンにバインドすることや、それらの制御を引き受けることを妨げたりしてはなりません。これによって禁止される行為には、たとえば、同じインテント パターンを処理する複数のアプリの中からユーザーが特定のアプリを選択することを許可する「選択的」ユーザー インターフェースを無効にすることが含まれますが、これに限定されません。
ただし、デフォルト アクティビティがデータ URI に対してより具体的なフィルタを提供する場合、デバイス実装は具体的な URI パターン(例: http://play.google.com)用のデフォルト アクティビティを提供しても構いません。たとえば、データ URI「http://www.android.com」を指定するインテント フィルタは、「http://」に対するブラウザ フィルタよりも具体的です。デバイス実装は、ユーザーに対し、インテントのデフォルト アクティビティを変更するユーザー インターフェースを提供しなければなりません。
3.2.3.3. インテントの名前空間
デバイス実装は、android.* 名前空間または com.android.* 名前空間に、ACTION、CATEGORY、または他のキー文字列を使用して、新しいインテントまたはブロードキャスト インテント パターンを尊重する Android コンポーネントを含んではなりません。デバイス実装者は、別の組織に属するパッケージ スペースに、ACTION、CATEGORY、または他のキー文字列を使用して、新しいインテントまたはブロードキャスト インテント パターンを尊重する Android コンポーネントを含めてはなりません。デバイス実装者は、セクション 3.2.3.1 に記載されているコアアプリで使用されるインテント パターンのいずれについても変更または拡張してはなりません。デバイス実装は、組織に明確に関連付けられた名前空間を使用するインテント パターンを含んでも構いません。この制約は、セクション 3.6 の Java 言語クラスに指定された制約と同様のものです。
3.2.3.4. ブロードキャスト インテント
サードパーティ アプリは、特定のインテントをブロードキャストしてハードウェアまたはソフトウェア環境の変更を通知する際、プラットフォームに依存します。Android 互換デバイスは、該当するシステム イベントに応じてパブリック ブロードキャスト インテントをブロードキャストしなければなりません。ブロードキャスト インテントについては、SDK ドキュメントに記載されています。
3.2.3.5. デフォルト アプリの設定
Android には、ホーム画面や SMS などのデフォルト アプリをユーザーが簡単に選択できるようにする設定があります。そのような状態が合理的な場合、デバイス実装は、同様の設定メニューを提供しなければならず、SDK ドキュメントに記載されているインテント フィルタ パターンや API メソッドと下記のように互換性がなければなりません。
デバイス実装は:
- デバイス実装が android.software.home_screen をレポートする場合、android.settings.HOME_SETTINGS インテントを尊重して、ホーム画面用のデフォルト アプリの設定メニューを表示しなければなりません [参考資料、10]。
- デバイス実装が android.hardware.telephony をレポートする場合、android.provider.Telephony.ACTION_CHANGE_DEFAULT インテントを呼び出してデフォルトの SMS アプリを変更するダイアログを表示する設定メニューを提供しなければなりません [参考資料、9]。
- デバイス実装が android.hardware.nfc.hce をレポートする場合、android.settings.NFC_PAYMENT_SETTINGS インテントを尊重して、タップ&ペイ用のデフォルト アプリの設定メニューを表示しなければなりません [参考資料、10]。
3.3. ネイティブ API の互換性
3.3.1. アプリケーション バイナリ インターフェース
マネージド Dalvik バイトコードは、アプリの .apk ファイルで提供されるネイティブ コードを、該当するデバイス ハードウェア アーキテクチャ向けにコンパイルされた ELF .so ファイルとして呼び出すことができます。ネイティブ コードは基となるプロセッサ技術に大きく依存するため、Android では、Android NDK に多数のアプリケーション バイナリ インターフェース(ABI)が定義されています。下記のように、デバイス実装は 1 つ以上の定義済み ABI と互換性がなければならず、Android NDK との互換性を実装しなければなりません。
デバイス実装が Android ABI をサポートする場合は、以下の要件が適用されます。
- 標準の Java Native Interface(JNI)セマンティクスを使用して、ネイティブ コードを呼び出すためにマネージド環境で動作するコードのサポートを含まなければなりません。
- 以下のリストにある各必須ライブラリと、ソース互換(すなわちヘッダー互換)かつバイナリ互換(ABI 向け)でなければなりません。
- 64 ビット ABI がサポートされている場合は、同等の 32 ビット ABI をサポートしなければなりません。
- android.os.Build.SUPPORTED_ABIS、android.os.Build.SUPPORTED_32_BIT_ABIS、android.os.Build.SUPPORTED_64_BIT_ABIS パラメータ(優先度の高い順に並べられた ABI のカンマ区切りリスト)を介して、デバイスがサポートするネイティブ アプリケーション バイナリ インターフェース(ABI)を正確にレポートしなければなりません。
- 上記のパラメータを介して、docs/ ディレクトリにある最新バージョンの Android NDK「NDK Programmer's Guide | ABI Management」に文書化されている ABI のみをレポートしなければなりません。
- アップストリームの Android オープンソース プロジェクトで入手可能なソースコードとヘッダー ファイルを使用してビルドすべきです。
ネイティブ コードを含むアプリで、次のネイティブ コード API が利用可能でなければなりません。
- libc(C ライブラリ)
- libm(math ライブラリ)
- C++ の最小限のサポート
- JNI インターフェース
- liblog(Android ロギング)
- libz(Zlib 圧縮)
- libdl(ダイナミック リンカー)
- libGLESv1_CM.so(OpenGL ES 1.x)
- libGLESv2.so(OpenGL ES 2.0)
- libGLESv3.so(OpenGL ES 3.x)
- libEGL.so(ネイティブ OpenGL サーフェス管理)
- libjnigraphics.so
- libOpenSLES.so(OpenSL ES 1.0.1 オーディオ サポート)
- libOpenMAXAL.so(OpenMAX AL 1.0.1 サポート)
- libandroid.so(ネイティブ Android アクティビティ サポート)
- libmediandk.so(ネイティブ メディア API サポート)
- 以下で説明する OpenGL のサポート
Android NDK の今後のリリースで、追加の ABI のサポートが導入される可能性があります。デバイス実装は、既存の定義済み ABI と互換性がない場合、いかなる ABI のサポートもレポートしてはなりません。
なお、デバイス実装は libGLESv3.so を含まなければならず、libGLESv2.so への symlink(シンボリック リンク)を持たなければなりません。さらに、NDK リリース android-21 で規定されているように、OpenGL ES 3.1 と Android 拡張機能パック [参考資料、11] の関数シンボルをすべてエクスポートしなければなりません。すべてのシンボルが存在しなければなりませんが、完全に実装する必要があるのは、デバイスが実際にサポートする OpenGL ES バージョンと拡張機能に対応する関数のみです。
ネイティブ コードの互換性は難しい問題です。したがって、デバイス実装者は、アップストリームの Android オープンソース プロジェクトの上記のライブラリの実装を使用することが極めて強く推奨されます。
3.3.2. 32 ビット ARM ネイティブ コードの互換性
ARMv8 アーキテクチャでは複数の CPU オペレーションが非推奨になっており、その中には既存のネイティブ コードで使用されているものもあります。64 ビット ARM デバイスの場合、以下の非推奨のオペレーションが、ネイティブ CPU サポートまたはソフトウェア エミュレーションのいずれかを通じて、32 ビット ネイティブ ARM コードで引き続き使用可能でなければなりません。
- SWP 命令と SWPB 命令
- SETEND 命令
- CP15ISB、CP15DSB、CP15DMB バリア オペレーション
以前のバージョンの Android NDK では、/proc/cpuinfo を使用して 32 ビット ARM ネイティブ コードから CPU 機能を検出していました。この NDK を使用してビルドされたアプリとの互換性を維持するため、/proc/cpuinfo が 32 ビット ARM アプリによって読み取られる場合、デバイスは /proc/cpuinfo に以下の行を含まなければなりません。
- 「Features: 」の後に、デバイスがサポートするオプションの ARMv7 CPU 機能のリストが続く行。
- 「CPU architecture: 」の後に、デバイスのサポート対象 ARM アーキテクチャの最大バージョンを示す整数(例: ARMv8 デバイスの場合は「8」)が続く行。
上記の要件は、/proc/cpuinfo が 32 ビット ARM アプリによって読み取られる場合にのみ適用されます。/proc/cpuinfo が 64 ビット ARM アプリまたは非 ARM アプリによって読み取られる場合、デバイスは /proc/cpuinfo を変更すべきではありません。
3.4. ウェブの互換性
3.4.1. WebView の互換性
Android スマートウォッチ デバイスは android.webkit.Webview API の完全な実装を提供しても構いませんが、他のすべてのデバイス実装はそれを提供しなければなりません。
プラットフォーム機能 android.software.webview は、android.webkit.WebView API の完全な実装を提供するすべてのデバイスでレポートされなければならず、この API の完全な実装のないデバイスでレポートされてはなりません。Android オープンソース実装は、Chromium プロジェクトのコードを使用して android.webkit.WebView [参考資料、12] を実装しています。ウェブ レンダリング システムの包括的なテストスイートを開発することは現実的でないため、デバイス実装者は、WebView 実装で Chromium の特定のアップストリーム ビルドを使用しなければなりません。具体的には次のとおりです。
- デバイスの android.webkit.WebView の実装は、Android 5.1 用のアップストリームの Android オープンソース プロジェクトの Chromium ビルドをベースとしていなければなりません。このビルドには、WebView [参考資料、13] の特定の機能セットとセキュリティ修正が含まれています。
- WebView がレポートするユーザー エージェント文字列は、次の形式でなければなりません。
Mozilla/5.0 (Linux; Android $(VERSION); $(MODEL) Build/$(BUILD)$(WEBVIEW)) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 $(CHROMIUM_VER) Mobile Safari/537.36
- $(VERSION) 文字列の値は、android.os.Build.VERSION.RELEASE の値と同じでなければなりません。
- $(WEBVIEW) 文字列は省略しても構いませんが、省略しない場合は、WebView であることを示す「; wv」でなければなりません。
- $(MODEL) 文字列の値は、android.os.Build.MODEL の値と同じでなければなりません。
- $(BUILD) 文字列の値は、android.os.Build.ID の値と同じでなければなりません。
- $(CHROMIUM_VER) 文字列の値は、アップストリームの Android オープンソース プロジェクトの Chromium バージョンでなければなりません。
- デバイス実装は、ユーザー エージェント文字列で Mobile を省略しても構いません。
WebView コンポーネントは、可能な限り多くの HTML5 機能をサポートすべきであり、機能をサポートする場合、HTML5 仕様 [参考資料、14] に準拠すべきです。
3.4.2. ブラウザの互換性
Android テレビ、Android スマートウォッチ、Android Automotive の実装はブラウザアプリを省略しても構いませんが、セクション 3.2.3.1 に記載されているようにパブリック インテント パターンをサポートしなければなりません。他のすべてのタイプのデバイス実装は、ユーザーの一般的なウェブ ブラウジング用のスタンドアロン ブラウザアプリを含まなければなりません。
スタンドアロン ブラウザは、WebKit 以外のブラウザ テクノロジーをベースにするものであっても構いません。ただし、代替ブラウザアプリを使用する場合でも、サードパーティ アプリに提供する android.webkit.WebView コンポーネントは、セクション 3.4.1 に記載されているように、WebKit をベースにするものでなければなりません。
実装は、スタンドアロン ブラウザアプリでカスタムのユーザー エージェント文字列を送信しても構いません。
スタンドアロン ブラウザアプリは(アップストリームの WebKit ブラウザアプリとサードパーティの代替アプリのどちらをベースとしているかにかかわらず)、可能な限り HTML5 [参考資料、14] をサポートすべきです。デバイス実装は、少なくとも HTML5 に関連する以下の API をそれぞれサポートしなければなりません。
さらに、デバイス実装は、HTML5/W3C の webstorage API [参考資料、18] をサポートしなければならず、HTML5/W3C の IndexedDB API [参考資料、19] をサポートすべきです。なお、ウェブ開発標準化団体が webstorage よりも IndexedDB を優先するようになっているため、今後の Android バージョンでは、IndexedDB が必須コンポーネントになると見込まれます。
3.5. API 動作の互換性
各 API タイプ(マネージド、ソフト、ネイティブ、ウェブ)の動作は、アップストリームの Android オープンソース プロジェクト [参考資料、2] の優先実装と一貫性がなければなりません。互換性の具体的な内容は次のとおりです。
- デバイスは、標準的なインテントの動作またはセマンティクスを変更してはなりません。
- デバイスは、特定の種類のシステム コンポーネント(Service、Activity、ContentProvider など)のライフサイクルまたはライフサイクル セマンティクスを変更してはなりません。
- デバイスは、標準的な権限のセマンティクスを変更してはなりません。
上記のリストはすべてを網羅しているわけではありません。互換性テストスイート(CTS)は、動作の互換性についてプラットフォームの大部分をテストしますが、すべてではありません。Android オープンソース プロジェクトとの動作の互換性を確保することは、実装者の責任です。このため、デバイス実装者は、システムの重要な部分を再実装するのではなく、可能であれば Android オープンソース プロジェクトを介して入手可能なソースコードを使用すべきです。
3.6. API 名前空間
Android は、Java プログラミング言語で定義されたパッケージとクラスの名前空間規則に従います。サードパーティ アプリとの互換性を確保するために、デバイス実装者は、次のパッケージ名前空間に対して禁止されている変更(下記参照)を行ってはなりません。
- java.*
- javax.*
- sun.*
- android.*
- com.android.*
次のような変更は禁止されています。
- デバイス実装は、メソッド シグネチャかクラス シグネチャを変更することで、またはクラスかクラス フィールドを削除することで、Android プラットフォームで一般公開されている API を変更してはなりません。
- デバイス実装者は API の基盤となる実装を変更しても構いませんが、そのような変更は、一般公開されている API の所定の動作と Java 言語シグネチャに影響を及ぼしてはなりません。
- デバイス実装者は、一般公開されている要素(クラスまたはインターフェース、既存のクラスまたはインターフェースのフィールドまたはメソッドなど)を上記の API に追加してはなりません。
「一般公開されている要素」とは、アップストリームの Android ソースコードで使用されているような「@hide」マーカーで装飾されていない構成要素です。つまり、デバイス実装者は、上記の名前空間で新しい API を公開したり、既存の API を変更したりしてはなりません。デバイス実装者は内部のみの変更を行っても構いませんが、そのような変更をアドバタイズしたり、別の方法でデベロッパーに公開したりしてはなりません。
デバイス実装者はカスタム API を追加しても構いませんが、そのような API は別の組織が所有または参照している名前空間内に存在してはなりません。たとえば、デバイス実装者は com.google.* またはこれと類似した名前空間に API を追加してはなりません。これを行えるのは Google のみです。同様に、Google は他社の名前空間に API を追加してはなりません。さらに、デバイス実装が標準の Android 名前空間の外部にあるカスタム API を含んでいる場合、そのような API は Android 共有ライブラリにパッケージ化しなければなりません。これは、そのような API を(<uses-library> メカニズムを介して)明示的に使用するアプリのみが、それらの API によるメモリ使用量増加の影響を受けるようにするためです。
デバイス実装者が上記パッケージ名前空間のいずれかの改善(既存の API に便利な新機能を追加する、新しい API を追加するなど)を提案する場合、実装者は source.android.com にアクセスし、サイトに記載されている情報に従って、変更とコードに貢献するプロセスを開始すべきです。
なお、上記の制限は、Java プログラミング言語の標準的な API 命名規則に対応しています。このセクションは、この互換性定義に含めることでそれらの規則を補強し、拘束力を持たせることのみを目的としています。
3.7. ランタイムの互換性
デバイス実装は、完全な Dalvik Executable(DEX)形式、Dalvik バイトコード仕様、セマンティクス [参考資料、20] をサポートしなければなりません。デバイス実装者は、Dalvik Executable 形式のリファレンス アップストリーム実装であり、リファレンス実装のパッケージ管理システムでもある ART を使用すべきです。
デバイス実装は、アップストリームの Android プラットフォームに合わせて、以下の表に示すようにメモリが割り当てられるように Dalvik ランタイムを構成しなければなりません(画面サイズと画面密度の定義については、セクション 7.1.1 をご覧ください)。
なお、下記のメモリ値は最小値とみなされ、デバイス実装はアプリごとにより多くのメモリを割り当てても構いません。
画面レイアウト | 画面密度 | 最小アプリメモリ |
---|---|---|
小 / 標準 | 120 dpi(ldpi) | 32 MB |
160 dpi(mdpi) | ||
213 dpi(tvdpi) | 48 MB | |
240 dpi(hdpi) | ||
280 dpi(280dpi) | ||
320 dpi(xhdpi) | 80 MB | |
400 dpi(400dpi) | 96 MB | |
480 dpi(xxhdpi) | 128 MB | |
560 dpi(560dpi) | 192 MB | |
640 dpi(xxxhdpi) | 256 MB | |
大 | 120 dpi(ldpi) | 32 MB |
160 dpi(mdpi) | 48 MB | |
213 dpi(tvdpi) | 80 MB | |
240 dpi(hdpi) | ||
280 dpi(280dpi) | 96 MB | |
320 dpi(xhdpi) | 128 MB | |
400 dpi(400dpi) | 192 MB | |
480 dpi(xxhdpi) | 256 MB | |
560 dpi(560dpi) | 384 MB | |
640 dpi(xxxhdpi) | 512 MB | |
特大 | 120 dpi(ldpi) | 48 MB |
160 dpi(mdpi) | 80 MB | |
213 dpi(tvdpi) | 96 MB | |
240 dpi(hdpi) | ||
280 dpi(280dpi) | 144 MB | |
320 dpi(xhdpi) | 192 MB | |
400 dpi(400dpi) | 288 MB | |
480 dpi(xxhdpi) | 384 MB | |
560 dpi(560dpi) | 576 MB | |
640 dpi(xxxhdpi) | 768 MB |
3.8. ユーザー インターフェースの互換性
3.8.1. ランチャー(ホーム画面)
Android はランチャー アプリ(ホーム画面)を含んでおり、デバイス ランチャー(ホーム画面)を置き換えるサードパーティ アプリをサポートしています。サードパーティ アプリにデバイスのホーム画面の置き換えを許可するデバイス実装は、プラットフォーム機能 android.software.home_screen を宣言しなければなりません。
3.8.2. ウィジェット
ウィジェットはすべての Android デバイス実装で任意ですが、Android ハンドヘルド デバイスではサポートすべきです。
Android では、アプリがエンドユーザーに「AppWidget」[参考資料、21] を公開できるようにするコンポーネント タイプとそれに対応する API およびライフサイクルを定義しています。この機能は、ハンドヘルド デバイス実装でサポートすることが強く推奨されます。ホーム画面へのウィジェットの埋め込みをサポートするデバイス実装は、以下の要件を満たすとともに、プラットフォーム機能 android.software.app_widgets のサポートを宣言しなければなりません。
- デバイスのランチャーは、AppWidget の組み込みのサポートを含まなければならず、ランチャー内で直接 AppWidget を追加、構成、表示、削除するユーザー インターフェース アフォーダンスを公開しなければなりません。
- デバイス実装は、標準グリッドサイズで 4 x 4 のウィジェットをレンダリングできなければなりません。詳細については、Android SDK ドキュメントのアプリ ウィジェットのデザイン ガイドライン [参考資料、21] をご覧ください。
- ロック画面のサポートを含むデバイス実装は、ロック画面でアプリ ウィジェットをサポートしても構いません。
3.8.3. 通知
Android には、デベロッパーがデバイスのハードウェア機能とソフトウェア機能を使用して重要なイベントをユーザーに通知 [参考資料、22] するための API が含まれています。
一部の API は、アプリがハードウェア(具体的にはサウンド、バイブレーション、ライト)を使用して通知を実行したりユーザーの注意を引いたりすることを可能にします。デバイス実装は、SDK ドキュメントに記載されているように、デバイス実装ハードウェアで可能な範囲で、ハードウェア機能を使用する通知をサポートしなければなりません。たとえば、デバイス実装がバイブレーターを含む場合、バイブレーション API を正しく実装しなければなりません。デバイス実装にハードウェアがない場合は、対応する API を NoOps として実装しなければなりません。この動作の詳細についてはセクション 7 をご覧ください。
さらに、実装は、API [参考資料、23] またはステータスバー / システムバーのアイコン スタイル ガイド [参考資料、24] で提供されるすべてのリソース(アイコンやアニメーション ファイルなど)を正しくレンダリングしなければなりませんが、Android テレビデバイスの場合は通知を表示しない可能性もあります。デバイス実装者は、通知について、リファレンス Android オープンソース実装で提供されているものと異なる代替ユーザー エクスペリエンスを提供しても構いません。ただし、そのような代替通知システムは、上記のように既存の通知リソースをサポートしなければなりません。
Android は、次のような各種の通知をサポートしています。
- リッチ通知。進行中の通知を確認するためのインタラクティブなビュー。
- ヘッドアップ通知。現在のアプリから移動することなく、操作または閉じることができるインタラクティブなビュー。
- ロック画面通知。ロック画面に表示される通知。表示するかどうかをきめ細かく制御できます。
Android デバイス実装は、そのような通知が表示される際に、リッチ通知とヘッドアップ通知を適切に実行しなければならず、Android API ドキュメント [参考資料、25] に記載されているようにタイトル / 名前、アイコン、テキストを含まなければなりません。
Android には、通知リスナー サービス API が含まれています。これらの API は、通知がポストされたか更新されたときにアプリがすべての通知のコピーを受け取ることを可能にします(ユーザーが明示的に有効にした場合)。デバイス実装は、ユーザーが有効にしたインストール済みのすべてのリスナー サービス(Notification オブジェクトにアタッチされているすべてのメタデータを含む)に対して通知全体を正確かつ迅速に送信しなければなりません。
3.8.4. 検索
Android には、デベロッパーがアプリに検索を組み込んでアプリのデータをグローバル システム検索に公開するための API [参考資料、26] が含まれています。一般に、この機能はシステム全体にわたる単一のユーザー インターフェースで構成されており、ユーザーがクエリを入力し、その入力に対して候補を示して結果を表示できるようになっています。Android API を使用すると、デベロッパーは、このインターフェースを再利用して独自のアプリ内で検索を提供でき、共通のグローバル検索ユーザー インターフェースに結果を供給できます。
Android デバイス実装は、ユーザー入力に応じてリアルタイムで検索候補を表示できるような、システム全体にわたる単一の共有検索ユーザー インターフェースであるグローバル検索を含むべきです。デバイス実装は、デベロッパーがこのユーザー インターフェースを再利用して自身のアプリ内で検索を提供できるようにする API を実装すべきです。グローバル検索インターフェースを実装するデバイス実装は、サードパーティ アプリがグローバル検索モードで実行されているときに検索候補を検索ボックスに追加できるようにする API を実装しなければなりません。この機能を利用するサードパーティ アプリがインストールされていない場合は、デフォルトの動作として、ウェブ検索エンジンの検索結果と検索候補を表示すべきです。
3.8.5. トースト
アプリは、「トースト」API を使用して、短時間で消える短い非モーダル文字列をエンドユーザーに表示できます [参考資料、27]。デバイス実装は、アプリからエンドユーザーへのトーストを、なんらかの目立つ方法で表示しなければなりません。
3.8.6. テーマ
Android は、アプリがアクティビティまたはアプリの全体にわたってスタイルを適用するためのメカニズムとして「テーマ」を提供します。
Android には、アプリ デベロッパーが Android SDK で定義されている Holo テーマのデザインにマッチさせる場合に使用する定義済みスタイルのセットとして、「Holo」テーマ ファミリーがあります [参考資料、28]。デバイス実装は、アプリに対して公開されている Holo テーマ属性を一切変更してはなりません [参考資料、29]。
Android には、アプリ デベロッパーが幅広い Android デバイスタイプでデザインテーマのデザインにマッチさせる場合に使用する定義済みスタイルのセットとして、「Material」テーマ ファミリーがあります。デバイス実装は「Material」テーマ ファミリーをサポートしなければならず、アプリに公開される Material テーマ属性またはそのアセットのいずれについても変更してはなりません [参考資料、30]。
Android には、アプリ デベロッパーがデバイス実装者によって定義されたデバイステーマのデザインにマッチさせる場合に使用する定義済みスタイルのセットとして、「Device Default」テーマ ファミリーも用意されています。デバイス実装は、アプリに公開される Device Default テーマ属性を変更しても構いません [参考資料、29]。
Android では、半透明のシステムバーを使用した新しい種々のテーマがサポートされています。これにより、アプリ デベロッパーは、ステータスバーとナビゲーション バーの裏にあるエリアをアプリ コンテンツで満たすことができます。この構成でデベロッパー エクスペリエンスに一貫性を持たせるには、さまざまなデバイス実装でステータスバーのアイコン スタイルを維持することが重要です。そのため、Android デバイス実装は、アイコンが問題のあるステータスを示している場合を除き、システム ステータス アイコン(信号強度やバッテリー残量など)とシステムが発行する通知には、白色を使用しなければなりません [参考資料、29]。
3.8.7. ライブ壁紙
Android では、アプリがエンドユーザーに 1 つ以上の「ライブ壁紙」を公開できるようにするためのコンポーネント タイプと、対応する API およびライフサイクルを定義しています [参考資料、31]。ライブ壁紙とは、壁紙として他のアプリの背後に表示される、入力機能が制限されたアニメーション、パターン、またはそれらと類似した画像のことです。
ハードウェアは、他のアプリに悪影響を及ぼさず、妥当なフレームレートで、機能に制限なくすべてのライブ壁紙を実行できる場合、ライブ壁紙を確実に実行できるとみなされます。ハードウェアの制限によって、壁紙やアプリがクラッシュする、誤動作する、CPU やバッテリー電力を過剰に使用する、または許容できない低フレームレートで実行される場合、ハードウェアはライブ壁紙を実行できないとみなされます。たとえば、一部のライブ壁紙は、OpenGL 2.0 または 3.x コンテキストを使用してコンテンツをレンダリングすることがあります。複数の OpenGL コンテキストをサポートしていないハードウェアでは、OpenGL コンテキストを使用するライブ壁紙が、OpenGL コンテキストを使用する別のアプリと競合する可能性があるため、ライブ壁紙を確実には実行できません。
上記のようにライブ壁紙を確実に実行できるデバイス実装はライブ壁紙を実装するべきであり、実装する場合はプラットフォーム機能フラグ android.software.live_wallpaper を報告しなければなりません。
3.8.8. アクティビティの切り替え
履歴機能のナビゲーション キーは任意であるため、概要画面の実装要件は、Android テレビデバイスと Android スマートウォッチ デバイスでは任意です。
アップストリームの Android ソースコードには、概要画面 [参考資料、32] が含まれます。これは、タスクの切り替えのためのシステムレベルのユーザー インターフェースです。ユーザーが最後にアプリを離れたときのアプリのグラフィック状態のサムネイル画像を使用して、最近アクセスしたアクティビティやタスクを表示することにも使われます。セクション 7.2.3 で詳述するように、履歴機能のナビゲーション キーを含むデバイス実装は、インターフェースを変更しても構いませんが、以下の要件を満たさなければなりません。
- 一緒に移動するグループとして関連する履歴を表示しなければなりません。
- 少なくとも 20 件までのアクティビティ表示をサポートしなければなりません。
- 少なくとも同時に 4 つのアクティビティのタイトルを表示すべきです。
- ハイライトの色、アイコン、最近の画面タイトルを表示すべきです。
- 画面固定動作 [参考資料、33] を実装し、機能を切り替えるための設定メニューをユーザーに提供しなければなりません。
- 閉じるアフォーダンス(「x」)を表示すべきですが、ユーザーが画面を操作するまで遅らせても構いません。
デバイス実装は、概要画面にアップストリームの Android ユーザー インターフェース(またはそれに似たサムネイルベースのインターフェース)を使用することが強く推奨されます。
3.8.9. 入力管理
Android は、入力管理と、サードパーティのインプット メソッド エディタをサポートしています [参考資料、34]。ユーザーがデバイスでサードパーティの入力方法を使用できるようにするデバイス実装は、Android SDK ドキュメントで定義されているとおり、プラットフォーム機能 android.software.input_methods を宣言し、IME API をサポートしなければなりません。
android.software.input_methods 機能を宣言するデバイス実装は、ユーザーによるアクセスが可能な、サードパーティの入力方法を追加および構成するメカニズムを提供しなければなりません。デバイス実装は、android.settings.INPUT_METHOD_SETTINGS インテントに応じて設定インターフェースを表示しなければなりません。
3.8.10. ロック画面のメディア コントロール
Remote Control Client API のサポートは Android 5.0 で終了し、ロック画面に表示される再生コントロールとメディアアプリを統合できるメディア通知テンプレートに置き換えられました [参考資料、35]。ロック画面をサポートするデバイス実装は、Android Automotive 実装またはスマートウォッチ実装でない限り、メディア通知テンプレートを含め、ロック画面通知を表示しなければなりません。
3.8.11. Dreams
Android は、Dreams [参考資料、36] というインタラクティブなスクリーンセーバーをサポートしています。Dreams を使用すると、電源に接続されているデバイスがアイドル状態のとき、または卓上ホルダーにドッキングされているとき、ユーザーがアプリを操作できます。Android スマートウォッチ デバイスは Dreams を実装しても構いませんが、他のタイプのデバイス実装は Dreams のサポートを含み、android.settings.DREAM_SETTINGS インテントに応じてユーザーが Dreams を構成する設定オプションを提供するべきです。
3.8.12. 位置情報
デバイスに位置座標を提供できるハードウェア センサー(GPS など)がある場合は、設定内の位置情報メニューに位置情報モードを表示しなければなりません [参考資料、37]。
3.8.13. Unicode とフォント
Android は、カラー絵文字をサポートしています。Android デバイス実装に IME が含まれる場合、デバイスは、Unicode 6.1 [参考資料、38] で規定された絵文字について、入力方法をユーザーに提供すべきです。すべてのデバイスは、こうした絵文字をカラーグリフでレンダリングできなければなりません。
Android は、さまざまなウェイトの Roboto 2 フォント(sans-serif-thin、sans-serif-light、sans-serif-medium、sans-serif-black、sans-serif-condensed、sans-serif-condensed-light)をサポートしています。それらすべてが、デバイスで利用可能な言語、ラテン文字、ギリシャ文字、キリル文字の Unicode 7.0 の全範囲(ラテン文字拡張 A、B、C、D を含む)、および Unicode 7.0 の通貨記号ブロックのすべてのグリフについて含まれていなければなりません。
3.9. デバイス管理
Android には、Android Device Administration API を通じて、セキュリティ対応アプリがシステムレベルでデバイス管理機能(パスワード ポリシーの適用、リモートワイプの実施など)を実行できる機能があります [参考資料、39]。デバイス実装は、DevicePolicyManager クラス [参考資料、40] の実装を提供しなければなりません。PIN(数値)またはパスワード(英数字)に基づくロック画面のサポートを含むデバイス実装は、Android SDK ドキュメントで規定されているデバイス管理ポリシー [参考資料、39] をすべてサポートし、プラットフォーム機能 android.software.device_admin をレポートしなければなりません。
デバイス実装には、デバイス管理機能を実行するプリインストール アプリがあっても構いませんが、このアプリは、デフォルトのデバイス オーナーのアプリ [参考資料、41] として、すぐに使えるように設定されていてはなりません。
3.10. ユーザー補助
Android は、障がいのあるユーザーがより簡単にデバイスを操作できるようにするためのユーザー補助レイヤを提供します。また、ユーザー補助サービスの実装によってユーザーとシステム イベントのコールバックを受信し、テキスト読み上げ、触覚フィードバック、トラックボール / D-pad ナビゲーションなどの代替フィードバック メカニズムを生成できるプラットフォーム API を提供します [参考資料、42]。
デバイス実装には以下の要件が適用されます。
- Android Automotive 実装は、デフォルトの Android 実装と整合する Android ユーザー補助フレームワークの実装を提供すべきです。
- デバイス実装(Android Automotive を除く)は、デフォルトの Android 実装と整合する Android ユーザー補助フレームワークの実装を提供しなければなりません。
- デバイス実装(Android Automotive を除く)は、android.accessibilityservice API [参考資料、43] を介してサードパーティのユーザー補助サービス実装をサポートしなければなりません。
- デバイス実装(Android Automotive を除く)は、デフォルトの Android 実装と整合する方法で AccessibilityEvent を生成し、それらのイベントをすべての登録済みの AccessibilityService 実装に配信しなければなりません。
- デバイス実装(オーディオ出力がない Android Automotive デバイスと Android スマートウォッチ デバイスを除く)は、ユーザーによるアクセスが可能な、ユーザー補助サービスを有効または無効にするメカニズムを提供しなければならず、android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS インテントに応じてこのインターフェースを表示しなければなりません。
さらに、デバイス実装は、デバイスでユーザー補助サービスの実装を提供すべきであり、ユーザーがデバイスのセットアップ中にユーザー補助サービスを有効にするメカニズムを提供すべきです。ユーザー補助サービスのオープンソース実装は、Eyes Free プロジェクト [参考資料、44] から入手できます。
3.11. テキスト読み上げ
Android には、アプリがテキスト読み上げ(TTS)サービスを利用できるようにし、サービス プロバイダが TTS サービスの実装を提供できるようにする API があります [参考資料、45]。機能 android.hardware.audio.output をレポートするデバイス実装は、Android TTS フレームワークに関連する次の要件を満たさなければなりません。
Android Automotive の実装には、以下の要件が適用されます。
- Android TTS フレームワーク API をサポートしなければなりません。
- サードパーティ TTS エンジンのインストールをサポートしても構いません。サポートする場合、パートナーは、システムレベルで使用する TTS エンジンをユーザーが選択できる、ユーザーによるアクセスが可能なインターフェースを提供しなければなりません。
その他のすべてのデバイス実装には、以下の要件が適用されます。
- Android TTS フレームワーク API をサポートしなければならず、デバイスで利用できる言語をサポートする TTS エンジンを含むべきです。なお、アップストリームの Android オープンソース ソフトウェアには、フル機能の TTS エンジン実装が含まれています。
- サードパーティ TTS エンジンのインストールをサポートしなければなりません。
- システムレベルで使用する TTS エンジンをユーザーが選択できる、ユーザーによるアクセスが可能なインターフェースを提供しなければなりません。
3.12. テレビ入力フレームワーク
Android テレビ入力フレームワーク(TIF)により、Android テレビデバイスへのライブ コンテンツの配信が簡単になります。TIF は、Android テレビデバイスをコントロールする入力モジュールを作成するための標準 API を提供します。Android テレビデバイス実装は、テレビ入力フレームワーク [参考資料、46] をサポートしなければなりません。
TIF をサポートするデバイス実装は、プラットフォーム機能 android.software.live_tv を宣言しなければなりません。
4. アプリ パッケージの互換性
デバイス実装は、公式の Android SDK [参考資料、47] に含まれる「aapt」ツールによって生成された Android「.apk」ファイルをインストールして実行しなければなりません。
デバイス実装は、.apk [参考資料、48]、Android マニフェスト [参考資料、49]、Dalvik バイトコード [参考資料、20]、RenderScript バイトコードのいずれの形式も、他の互換デバイスで該当ファイルを正しくインストールおよび実行できなくなるような方法で拡張してはなりません。
5. マルチメディアの互換性
5.1. メディア コーデック
デバイス実装は、このドキュメントで明示的に許可されている場合を除き、Android SDK ドキュメントで規定されているコアメディア形式 [参考資料、50] をサポートしなければなりません。具体的には、デバイス実装は、以下の表で規定され、MediaCodecList [参考資料、112] を介してレポートされるメディア形式、エンコーダ、デコーダ、ファイル形式、コンテナ形式をサポートしなければなりません。またデバイス実装は、CamcorderProfile [参考資料、113] でレポートされるすべてのプロファイルをデコードできなければなりません。以下のコーデックはすべて、Android オープンソース プロジェクトの推奨 Android 実装でソフトウェア実装として提供されています。
Google とオープン ハンドセット アライアンスのいずれも、これらのコーデックがサードパーティの特許の制約を受けないとは表明していないことにご注意ください。オープンソース ソフトウェアまたはシェアウェアを含め、このソースコードをハードウェアまたはソフトウェア製品で使用する場合は、このコードの実装に、関連する特許権者からの特許ライセンスが必要になることがあります。
5.1.1. オーディオ コーデック
形式 / コーデック | エンコーダ | デコーダ | 詳細 | サポートされているファイル形式 / コンテナ形式 |
---|---|---|---|---|
MPEG-4 AAC プロファイル
(AAC LC) |
必須1 | 必須 | 標準サンプリング レート 8~48 kHz のモノラル / ステレオ / 5.0 / 5.1 コンテンツをサポート2。 |
|
MPEG-4 HE AAC プロファイル(AAC+) | 必須1(Android 4.1 以降) |
必須 | 標準サンプリング レート 16~48 kHz のモノラル / ステレオ / 5.0 / 5.1 コンテンツをサポート2。 | |
MPEG-4 HE AACv2
プロファイル(Enhanced AAC+) |
必須 | 標準サンプリング レート 16~48 kHz のモノラル / ステレオ / 5.0 / 5.1 コンテンツをサポート2。 | ||
AAC-ELD(Enhanced Low Delay AAC) | 必須1
(Android 4.1 以降) |
必須
(Android 4.1 以降) |
標準サンプリング レート 16~48 kHz のモノラル / ステレオ コンテンツをサポート。 | |
AMR-NB | 必須3 | 必須3 | 8 kHz でサンプリングされた 4.75~12.2 kbps。 | 3GPP(.3gp) |
AMR-WB | 必須3 | 必須3 | 16 kHz でサンプリングされた、6.60~23.85 kbps の 9 種類のレート。 | |
FLAC | 必須 (Android 3.1 以降) |
モノラル / ステレオ(マルチチャンネルはサポート対象外)。サンプルレートは最大 48 kHz(ただし、出力が 44.1 kHz のデバイスでは、48 kHz から 44.1 kHz のダウンサンプラーにローパス フィルタが含まれないため、最大 44.1 kHz を推奨)。16 ビットを推奨(24 ビットにはディザが適用されない) | FLAC(.flac)のみ | |
MP3 | 必須 | モノラル / ステレオの 8~320 Kbps 固定ビットレート(CBR)または可変ビットレート(VBR) | MP3(.mp3) | |
MIDI | 必須 | MIDI タイプ 0 と 1。DLS バージョン 1 と 2。XMF と Mobile XMF。着信音形式 RTTTL/RTX、OTA、iMelody をサポート |
|
|
Vorbis | 必須 |
|
||
PCM(WAVE) | 必須4 (Android 4.1 以降) |
必須 | 16 ビットのリニア PCM(最大レートはハードウェアの上限値)。デバイスは、Raw PCM 録音のサンプリング レートとして 8,000、11,025、16,000、44,100 Hz の周波数をサポートしなければなりません。 | WAVE(.wav) |
Opus | 必須 (Android 5.0 以降) |
Matroska(.mkv) |
1 android.hardware.microphone を定義するデバイス実装では必須ですが、Android スマートウォッチ デバイス実装では任意です。
2 5.0 / 5.1 コンテンツのダウンミックスのみが必須です。2 チャンネルを超える録画またはレンダリングは任意です。
3 Android ハンドヘルド デバイス実装では必須です。
4 android.hardware.microphone を定義するデバイス実装(Android スマートウォッチ デバイス実装を含む)では必須です。
5.1.2. 画像コーデック
形式 / コーデック | エンコーダ | デコーダ | 詳細 | サポートされているファイル形式 / コンテナ形式 |
---|---|---|---|---|
JPEG | 必須 | 必須 | ベースラインとプログレッシブ | JPEG(.jpg) |
GIF | 必須 | GIF(.gif) | ||
PNG | 必須 | 必須 | PNG(.png) | |
BMP | 必須 | BMP(.bmp) | ||
WebP | 必須 | 必須 | WebP(.webp) |
5.1.3. 動画コーデック
Android スマートウォッチ デバイス実装では、動画コーデックは任意です。
形式 / コーデック | エンコーダ | デコーダ | 詳細 | サポートされているファイル形式 / コンテナ形式 |
---|---|---|---|---|
H.263 | 必須1 | 必須2 |
|
|
H.264 AVC | 必須2 | 必須2 | 詳細についてはセクション 5.2 と 5.3 をご覧ください |
|
H.265 HEVC | 必須5 | 詳細についてはセクション 5.3 をご覧ください | MPEG-4(.mp4) | |
MPEG-4 SP | 必須2 | 3GPP(.3gp) | ||
VP83 | 必須2
(Android 4.3 以降) |
必須2
(Android 2.3.3 以降) |
詳細についてはセクション 5.2 と 5.3 をご覧ください |
|
VP9 | 必須2 (Android 4.4 以降) |
詳細についてはセクション 5.3 をご覧ください |
|
1 カメラ ハードウェアを含み、android.hardware.camera または android.hardware.camera.front を定義するデバイス実装では必須です。
2 Android スマートウォッチ デバイス以外のデバイス実装では必須です。
3 ウェブ動画ストリーミング サービスとビデオ会議サービスの品質を許容可能なものにするために、デバイス実装は、[参考資料、51] の要件を満たすハードウェア VP8 コーデックを使用すべきです。
4 デバイス実装は、Matroska WebM ファイルの書き込みをサポートすべきです。
5 Android Automotive で強く推奨され、Android スマートウォッチでは任意であり、他のすべての種類のデバイスで必須です。
5.2. 動画のエンコード
Android スマートウォッチ デバイス実装では、動画コーデックは任意です。
H.264 コーデックをサポートする Android デバイス実装は、ベースライン プロファイル レベル 3 と以下の SD(標準画質)動画エンコード プロファイルをサポートしなければならず、メイン プロファイル レベル 4 と以下の HD(高画質)動画エンコード プロファイルをサポートすべきです。Android テレビデバイスは、HD 1080p 動画を 30 fps でエンコードすることが強く推奨されます。
SD(低画質) | SD(高画質) | HD 720p1 | HD 1080p1 | |
---|---|---|---|---|
動画の解像度 | 320 x 240 px | 720 x 480 px | 1,280 x 720 px | 1,920 x 1,080 px |
動画のフレームレート | 20 fps | 30 fps | 30 fps | 30 fps |
動画のビットレート | 384 Kbps | 2 Mbps | 4 Mbps | 10 Mbps |
1 ハードウェアでサポートされている場合。ただし、Android テレビデバイスでは強く推奨されます。
VP8 コーデックをサポートする Android デバイス実装は、SD 動画エンコード プロファイルをサポートしなければならず、以下の HD(高画質)動画エンコード プロファイルをサポートすべきです。
SD(低画質) | SD(高画質) | HD 720p1 | HD 1080p1 | |
---|---|---|---|---|
動画の解像度 | 320 x 180 ピクセル | 640 x 360 ピクセル | 1,280 x 720 ピクセル | 1,920 x 1,080 px |
動画のフレームレート | 30 fps | 30 fps | 30 fps | 30 fps |
動画のビットレート | 800 Kbps | 2 Mbps | 4 Mbps | 10 Mbps |
1 ハードウェアでサポートされている場合。
5.3. 動画のデコード
Android スマートウォッチ デバイス実装では、動画コーデックは任意です。
デバイス実装は、標準的な Android API を通じて、デベロッパーに公開されるすべての VP8、VP9、H.264、H.265 コーデックの同じストリーム内での動的な動画解像度の切り替えをサポートしなければなりません。
H.264 デコーダを備えた Android デバイス実装は、ベースライン プロファイル レベル 3 と以下の SD 動画デコード プロファイルをサポートしなければならず、HD デコード プロファイルをサポートすべきです。Android テレビデバイスは、ハイ プロファイル レベル 4.2 と HD 1080p デコード プロファイルをサポートしなければなりません。
SD(低画質) | SD(高画質) | HD 720p1 | HD 1080p1 | |
---|---|---|---|---|
動画の解像度 | 320 x 240 px | 720 x 480 px | 1,280 x 720 px | 1,920 x 1,080 px |
動画のフレームレート | 30 fps | 30 fps | 30 fps / 60 fps2 | 30 fps / 60 fps2 |
動画のビットレート | 800 Kbps | 2 Mbps | 8 Mbps | 20 Mbps |
1 Android テレビデバイス実装では必須ですが、その他のデバイスタイプでは、ハードウェアでサポートされている場合にのみ必須です。
2 Android テレビデバイス実装では必須です。
セクション 5.1.3 に記載されている VP8 コーデックをサポートする場合、Android デバイス実装は、次の SD デコード プロファイルをサポートしなければならず、HD デコード プロファイルをサポートすべきです。Android テレビデバイスは、HD 1080p デコード プロファイルをサポートしなければなりません。
SD(低画質) | SD(高画質) | HD 720p1 | HD 1080p1 | |
---|---|---|---|---|
動画の解像度 | 320 x 180 ピクセル | 640 x 360 ピクセル | 1,280 x 720 ピクセル | 1,920 x 1,080 px |
動画のフレームレート | 30 fps | 30 fps | 30 fps / 60 fps2 | 30 / 60 fps2 |
動画のビットレート | 800 Kbps | 2 Mbps | 8 Mbps | 20 Mbps |
1 Android テレビデバイス実装では必須ですが、その他のデバイスタイプでは、ハードウェアでサポートされている場合にのみ必須です。
2 Android テレビデバイス実装では必須です。
セクション 5.1.3 に記載されている VP9 コーデックをサポートする場合、Android デバイス実装は、次の SD 動画デコード プロファイルをサポートしなければならず、HD デコード プロファイルをサポートすべきです。Android テレビデバイスは、HD 1080p デコード プロファイルをサポートすることが強く推奨され、UHD デコード プロファイルをサポートすべきです。UHD 動画デコード プロファイルがサポートされている場合は、8 ビット色深度をサポートしなければなりません。
SD(低画質) | SD(高画質) | HD 720p 1 | HD 1080p 2 | UHD 2 | |
---|---|---|---|---|---|
動画の解像度 | 320 x 180 ピクセル | 640 x 360 ピクセル | 1,280 x 720 ピクセル | 1,920 x 1,080 px | 3,840 x 2,160 px |
動画のフレームレート | 30 fps | 30 fps | 30 fps | 30 fps | 30 fps |
動画のビットレート | 600 Kbps | 1.6 Mbps | 4 Mbps | 10 Mbps | 20 Mbps |
1 Android テレビデバイス実装では必須ですが、その他のデバイスタイプでは、ハードウェアでサポートされている場合にのみ必須です。
2 ハードウェアでサポートされている場合、Android テレビデバイス実装に強く推奨されます。
セクション 5.1.3 に記載されている H.265 コーデックをサポートする場合、Android デバイス実装は、メイン プロファイル レベル 3 メインティアと次の SD 動画デコード プロファイルをサポートしなければならず、HD デコード プロファイルをサポートすべきです。Android テレビデバイスは、メイン 10 レベル 5 メインティア プロファイルと UHD デコード プロファイルをサポートすべきです。Android テレビデバイスは、HD 1080p デコード プロファイルをサポートすることが強く推奨されます。HD 1080p デコード プロファイルがサポートされている場合は、メイン プロファイル レベル 4.1 メインティアをサポートしなければなりません。
SD(低画質) | SD(高画質) | HD 720p 1 | HD 1080p 2 | UHD 2 | |
---|---|---|---|---|---|
動画の解像度 | 352 x 288 px | 640 x 360 ピクセル | 1,280 x 720 ピクセル | 1,920 x 1,080 px | 3,840 x 2,160 px |
動画のフレームレート | 30 fps | 30 fps | 30 fps | 30 fps | 30 fps |
動画のビットレート | 600 Kbps | 1.6 Mbps | 4 Mbps | 10 Mbps | 20 Mbps |
1 Android テレビデバイス実装では必須ですが、その他のデバイスタイプでは、ハードウェアでサポートされている場合にのみ必須です。
2 ハードウェアでサポートされている場合、Android テレビデバイス実装に強く推奨されます。
5.4. 録音
このセクションで概説している要件の一部は、Android 4.3 以降では「すべきである」と記載されていますが、今後のバージョンの互換性定義では「しなければならない」に変更される予定です。既存と新規の Android デバイスは、「すべきである」と記載されている要件を満たすことが強く推奨されます。満たさなかった場合、今後のバージョンにアップグレードした際に、Android の互換性が得られなくなります。
5.4.1. 未加工オーディオのキャプチャ
android.hardware.microphone を宣言するデバイス実装は、次の特性を持つ未加工オーディオ コンテンツをキャプチャできるようにしなければなりません。
- 形式: リニア PCM、16 ビット
- サンプリング レート: 8,000、11,025、16,000、44,100
- チャンネル: モノラル
android.hardware.microphone を宣言するデバイス実装は、次の特性を持つ未加工オーディオ コンテンツをキャプチャできるようにすべきです。
- 形式: リニア PCM、16 ビット
- サンプリング レート: 22,050、48,000
- チャンネル: ステレオ
5.4.2. 音声認識用のキャプチャ
上記の録音仕様に加えて、アプリが android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION 音源を使用してオーディオ ストリームの録音を開始したときは、以下の要件が適用されます。
- デバイスは、ほぼ平坦な振幅周波数特性(具体的には ±3 dB、100 Hz~4,000 Hz)を示すべきです。
- オーディオ入力感度は、1,000 Hz で音圧レベル(SPL)90 dB の音源が 16 ビットサンプルで RMS 2,500 になるように設定すべきです。
- PCM 振幅レベルは、マイクでの 90 dB SPL から少なくとも 30 dB(-18 dB~+12 dB)の範囲で入力 SPL の変化を線形的にトラッキングすべきです。
- 高調波ひずみの合計は、マイクにおける 90 dB SPL の入力レベルで 1 KHz に対して 1% 未満であるべきです。
- ノイズ リダクション処理が存在する場合は、無効にしなければなりません。
- 自動ゲイン コントロールが存在する場合は、無効にしなければなりません。
プラットフォームが音声認識用に調整されたノイズ サプレッション技術をサポートしている場合、その効果は android.media.audiofx.NoiseSuppressor API から制御できなければなりません。さらに、ノイズ サプレッサーのエフェクト記述子の UUID フィールドでは、ノイズ サプレッション技術の各実装を一意に識別しなければなりません。
5.4.3. 再生のリルート用のキャプチャ
android.media.MediaRecorder.AudioSource クラスには REMOTE_SUBMIX 音源が含まれています。android.hardware.audio.output を宣言するデバイスは、アプリが android.media.AudioRecord API を使用してこの音源から録音を行うときに、下記を除くすべての音声ストリームのミックスをキャプチャできるように、REMOTE_SUBMIX 音源を適切に実装しなければなりません。
- STREAM_RING
- STREAM_ALARM
- STREAM_NOTIFICATION
5.5. オーディオの再生
android.hardware.audio.output を宣言するデバイス実装は、このセクションの要件を満たさなければなりません。
5.5.1. 未加工オーディオの再生
デバイスは、次の特性を持つ未加工オーディオ コンテンツを再生できるようにしなければなりません。
- 形式: リニア PCM、16 ビット
- サンプリング レート: 8,000、11,025、16,000、22,050、32,000、44,100
- チャンネル: モノラル、ステレオ
デバイスは、次の特性を持つ未加工オーディオ コンテンツを再生できるようにすべきです。
- サンプリング レート: 24,000、48,000
5.5.2. オーディオ エフェクト
Android は、デバイス実装にオーディオ エフェクト用の API [参考資料、52] を提供します。機能 android.hardware.audio.output を宣言するデバイス実装は:
- AudioEffect サブクラス Equalizer および LoudnessEnhancer を通じて制御できる EFFECT_TYPE_EQUALIZER と EFFECT_TYPE_LOUDNESS_ENHANCER の実装をサポートしなければなりません。
- Visualizer クラスを通じて制御できるビジュアライザ API 実装をサポートしなければなりません。
- AudioEffect サブクラス BassBoost、EnvironmentalReverb、PresetReverb、Virtualizer を通じて制御できる EFFECT_TYPE_BASS_BOOST、EFFECT_TYPE_ENV_REVERB、EFFECT_TYPE_PRESET_REVERB、EFFECT_TYPE_VIRTUALIZER の実装をサポートすべきです。
5.5.3. オーディオ出力の音量
Android テレビデバイス実装は、圧縮オーディオ パススルー出力(デバイスでオーディオ デコードが行われない)を除き、サポート対象の出力で、システムのマスター ボリュームとデジタル オーディオ出力ボリュームの減衰のサポートを含まなければなりません。
5.6. オーディオ レイテンシ
オーディオ レイテンシとは、オーディオ信号がシステムを通過する際に発生する遅延時間のことです。アプリのクラスの多くで、リアルタイムのサウンド エフェクトを実現するには、レイテンシが短くなっている必要があります。
このセクションでは、次の定義を使用します。
- 出力レイテンシ。アプリが PCM 符号化データフレームを書き込んでから、対応するサウンドが外部のリスナーに聞こえるかトランスデューサで検知されるまでの間隔。
- コールド出力レイテンシ。リクエストの前にオーディオ出力システムがアイドル状態で電源がオフになっていたときの、最初のフレームの出力レイテンシ。
- 連続出力レイテンシ。デバイスがオーディオを再生した後の、後続フレームの出力レイテンシ。
- 入力レイテンシ。外部のサウンドがデバイスに渡されてから、アプリが対応する PCM 符号化データフレームを読み取るまでの間隔。
- コールド入力レイテンシ。リクエストの前にオーディオ入力システムがアイドル状態で電源がオフになっていたときの、欠損入力時間と最初のフレームの入力レイテンシの合計。
- 連続入力レイテンシ。デバイスがオーディオをキャプチャしている間の、後続フレームの入力レイテンシ。
- コールド出力ジッター。コールド出力レイテンシ値の、個々の測定値間のばらつき。
- コールド入力ジッター。コールド入力レイテンシ値の、個々の測定値間のばらつき。
- 連続ラウンドトリップ レイテンシ。連続入力レイテンシ、連続出力レイテンシ、5 ミリ秒の合計。
- OpenSL ES PCM バッファキュー API。Android NDK 内にある PCM 関連の OpenSL ES API のセット。NDK_root/docs/opensles/index.html をご覧ください。
android.hardware.audio.output を宣言するデバイス実装は、下記のオーディオ出力の要件を満たすか上回るべきです。
- コールド出力レイテンシが 100 ミリ秒以下
- 連続出力レイテンシが 45 ミリ秒以下
- コールド出力ジッターを最小限に抑える
デバイス実装は、OpenSL ES PCM バッファキュー API を使用する際の初期キャリブレーションの後でこのセクションの要件を満たす場合、少なくとも 1 つのサポートされているオーディオ出力デバイスの連続出力レイテンシとコールド出力レイテンシについて、android.content.pm.PackageManager クラス [参考資料、53] により機能 android.hardware.audio.low-latency をレポートすることで、低レイテンシ オーディオのサポートをレポートしても構いません。逆に、上記の要件を満たさない場合、デバイス実装は低レイテンシ オーディオのサポートをレポートしてはなりません。
android.hardware.microphone を含むデバイス実装は、下記の入力オーディオの要件を満たすべきです。
- コールド入力レイテンシが 100 ミリ秒以下
- 連続入力レイテンシが 30 ミリ秒以下
- 50 ミリ秒以下の連続ラウンドトリップ レイテンシ
- コールド入力ジッターを最小限に抑える
5.7. ネットワーク プロトコル
デバイスは、Android SDK ドキュメント [参考資料、50] で規定されているとおり、オーディオと動画を再生するためにメディア ネットワーク プロトコルをサポートしなければなりません。具体的には、デバイスは次のメディア ネットワーク プロトコルをサポートしなければなりません。
- RTSP(RTP、SDP)
- HTTP(S) プログレッシブ ストリーミング
- HTTP(S) ライブ ストリーミング ドラフト プロトコル、バージョン 3 [参考資料、54]
5.8. セキュア メディア
セキュアな動画出力をサポートし、セキュア サーフェスをサポートできるデバイス実装は、Display.FLAG_SECURE のサポートを宣言しなければなりません。Display.FLAG_SECURE のサポートを宣言するデバイス実装は、ワイヤレス ディスプレイ プロトコルをサポートする場合、Miracast ワイヤレス ディスプレイ用の HDCP 2.x 以降などの暗号強度の高いメカニズムでリンクを保護しなければなりません。同様に、有線外部ディスプレイをサポートする場合、デバイス実装は HDCP 1.2 以降をサポートしなければなりません。Android テレビデバイス実装は、4K 解像度をサポートするデバイスの場合は HDCP 2.2、それより解像度が低いデバイスの場合は HDCP 1.4 以降をサポートしなければなりません。アップストリームの Android オープンソース実装には、この要件を満たすワイヤレス(Miracast)ディスプレイと有線(HDMI)ディスプレイのサポートが含まれています。
6. デベロッパー ツール、開発者向けオプションの互換性
6.1. デベロッパー ツール
デバイス実装は、Android SDK で提供されている Android デベロッパー ツールをサポートしなければなりません。Android 互換デバイスは、以下のものと互換性がなければなりません。
- Android Debug Bridge(adb)[参考資料、55]
デバイス実装は、Android SDK ドキュメントに記載されているように、adb のすべての機能(dumpsys [参考資料、56] を含む)をサポートしなければなりません。デバイス側の adb デーモンはデフォルトで無効でなければならず、ユーザーによるアクセスが可能な、Android Debug Bridge をオンにするメカニズムが存在しなければなりません。デバイス実装が USB ペリフェラル モードを省略している場合は、ローカルエリア ネットワーク(イーサネットや 802.11 など)を介して Android Debug Bridge を実装しなければなりません。
Android は、セキュア adb をサポートしています。セキュア adb は、既知の認証済みホストで adb を有効にします。デバイス実装は、セキュア adb をサポートしなければなりません。
- Dalvik Debug Monitor Service(ddms)[参考資料、57]
デバイス実装は、Android SDK に記載されているように、ddms のすべての機能をサポートしなければなりません。ddms は adb を使用するため、ddms のサポートはデフォルトで無効にすべきですが、上記のようにユーザーが Android Debug Bridge を有効にした場合は必ずサポートしなければなりません。
- Monkey [参考資料、58]
デバイス実装は、Monkey フレームワークを含まなければならず、アプリで使用できるようにしなければなりません。
- SysTrace [参考資料、59]
デバイス実装は、Android SDK に記載されているように、systrace ツールをサポートしなければなりません。Systrace はデフォルトで無効でなければならず、Systrace をオンにするユーザーがアクセス可能なメカニズムがなければなりません。
ほとんどの Linux ベースのシステムと Apple Macintosh システムは、追加サポートなしで、標準の Android SDK Tools を使用して Android デバイスを認識します。一方、Microsoft Windows システムは、通常、新しい Android デバイス用のドライバを必要とします(たとえば、新しいベンダー ID や新しいデバイス ID には、Windows システム用のカスタム USB ドライバが必要です)。デバイス実装が標準の Android SDK で提供される adb ツールによって認識されない場合、デバイス実装者は、デベロッパーが adb プロトコルを使用してデバイスに接続するための Windows ドライバを提供しなければなりません。これらのドライバは、32 ビット版と 64 ビット版の両方で、Windows XP、Windows Vista、Windows 7、Windows 8、Windows 9 向けに提供しなければなりません。
6.2. 開発者向けオプション
Android は、デベロッパーがアプリ開発関連の設定を構成することをサポートしています。デバイス実装は、android.settings.APPLICATION_DEVELOPMENT_SETTINGS インテントを尊重して、アプリ開発関連の設定を表示しなければなりません [参考資料、60]。アップストリームの Android 実装では、開発者向けオプション メニューはデフォルトで非表示になっています。ユーザーは [設定] > [デバイス情報] > [ビルド番号] メニュー アイテムを 7 回タップすると、開発者向けオプションを起動できます。デバイス実装は、開発者向けオプションについて一貫性のあるエクスペリエンスを提供しなければなりません。具体的には、デバイス実装は、開発者向けオプションをデフォルトで非表示にしなければならず、アップストリームの Android 実装と一貫性がある、開発者向けオプションを有効にするメカニズムを提供しなければなりません。
7. ハードウェアの互換性
サードパーティ デベロッパー向けの対応する API を持つ特定のハードウェア コンポーネントがデバイスに含まれている場合、デバイス実装は、Android SDK ドキュメントに記載されているように、その API を実装しなければなりません。任意であると明記されているハードウェア コンポーネントを SDK の API が操作し、デバイス実装がそのコンポーネントを備えていない場合:
- そのような場合でも、コンポーネントの API 用の完全なクラス定義(SDK ドキュメントに記載)が存在しなければなりません。
- API の動作は、なんらかの合理的な方法で NoOps として実装しなければなりません。
- API メソッドは、SDK ドキュメントで許可されている場合、null 値を返さなければなりません。
- API メソッドは、null 値が SDK ドキュメントで許可されていないクラスでは NoOps 実装を返さなければなりません。
- API メソッドは、SDK ドキュメントに記載されていない例外をスローしてはなりません。
上記の要件が適用されるシナリオの典型例は、テレフォニー API です。これらの API は、電話以外のデバイスであっても、合理的な NoOps として実装しなければなりません。
デバイス実装は、同じビルドのフィンガープリントについて、android.content.pm.PackageManager クラスの getSystemAvailableFeatures() メソッドと hasSystemFeature(String) メソッドを介して正確なハードウェア構成情報を一貫してレポートしなければなりません [参考資料、53]。
7.1. ディスプレイとグラフィック
Android には、さまざまなハードウェア構成でサードパーティ アプリが適切に動作するように、デバイスに合わせてアプリアセットと UI レイアウトを自動的に調整する機能があります [参考資料、61]。このセクションで詳述するように、デバイスはこれらの API と動作を適切に実装しなければなりません。
このセクションの要件で言及する単位の定義は次のとおりです。
- 物理的な対角サイズ。ディスプレイの点灯部分の、2 つの相対する隅の間の距離(インチ単位)。
- 1 インチあたりのドット数(dpi)。長さ 1 インチの水平または垂直の直線で囲まれたピクセルの数。dpi 値が記載されている場合は、水平方向と垂直方向の dpi が両方とも範囲内に収まらなければなりません。
- アスペクト比。画面の長辺と短辺のピクセル数の比。たとえば 480 x 854 ピクセルのディスプレイは 854/480 = 1.779、すなわち約「16:9」となります。
- 密度非依存ピクセル(dp)。160 dpi の画面に正規化された仮想ピクセル単位。ピクセル数 = dps * (密度/160) として計算されます。
7.1.1. 画面構成
7.1.1.1. 画面サイズ
Android スマートウォッチ デバイス(セクション 2 で詳述)は、このセクションに記載されているように、画面サイズが小さくても構いません。
Android UI フレームワークはさまざまな画面サイズをサポートしており、アプリは SCREENLAYOUT_SIZE_MASK を使用して android.content.res.Configuration.screenLayout でデバイスの画面サイズ(または「画面レイアウト」)をクエリできます。デバイス実装は、Android SDK ドキュメント [参考資料、61] で規定されアップストリームの Android プラットフォームによって決定される、正しい画面サイズをレポートしなければなりません。具体的には、デバイス実装は、次の論理密度非依存ピクセル(dp)画面寸法に従って正しい画面サイズをレポートしなければなりません。
- デバイスは、画面サイズが少なくとも 426 dp x 320 dp(「小」)でなければなりません。ただし、Android スマートウォッチ デバイスは除きます。
- 画面サイズが「標準」であるとレポートするデバイスは、画面サイズが少なくとも 480 dp x 320 dp でなければなりません。
- 画面サイズが「大」であるとレポートするデバイスは、画面サイズが少なくとも 640 dp x 480 dp でなければなりません。
- 画面サイズが「特大」であるとレポートするデバイスは、画面サイズが少なくとも 960 dp x 720 dp でなければなりません。
さらに、
- Android スマートウォッチ デバイスは、画面の物理的な対角サイズが 1.1~2.5 インチの範囲内になければなりません。
- 画面が物理的に統合されているその他のタイプの Android デバイス実装は、画面の物理的な対角サイズが少なくとも 2.5 インチでなければなりません。
デバイスは、レポートされた画面サイズをいかなるときも変更してはなりません。
アプリが AndroidManifest.xml ファイルの <supports-screens> 属性を介して、サポートする画面サイズを示すかどうかは任意です。デバイス実装は、Android SDK ドキュメントに記載されているように、小、標準、大、特大の画面についてアプリが表明しているサポートを正しく尊重しなければなりません。
7.1.1.2. 画面のアスペクト比
Android スマートウォッチ デバイスは、アスペクト比が 1.0(1:1)であっても構いません。
画面のアスペクト比は 1.3333(4:3)から 1.86(おおよそ 16:9)まででなければなりませんが、Android スマートウォッチ デバイスは 1.0(1:1)のアスペクト比であっても構いません。そのようなデバイス実装は、android.content.res.Configuration.uiMode として UI_MODE_TYPE_WATCH を使用するためです。
7.1.1.3. 画面密度
Android UI フレームワークは、アプリ デベロッパーがアプリリソースをターゲットにできるように、標準的な論理密度のセットを定義しています。デバイス実装は、android.util.DisplayMetrics API を介して次のいずれかの論理 Android フレームワーク密度をレポートしなければならず、この標準密度でアプリを実行しなければなりません。また、デフォルト ディスプレイに関しては、いかなるときにも、この値を変更してはなりません。
- 120 dpi(ldpi)
- 160 dpi(mdpi)
- 213 dpi(tvdpi)
- 240 dpi(hdpi)
- 280 dpi(280dpi)
- 320 dpi(xhdpi)
- 400 dpi(400dpi)
- 480 dpi(xxhdpi)
- 560 dpi(560dpi)
- 640 dpi(xxxhdpi)
デバイス実装は、画面の物理密度に数値的に最も近い標準 Android フレームワーク密度を定義するべきです。ただし、その論理密度によって、報告される画面サイズがサポート対象の最小値を下回る場合は除きます。物理密度に数値的に最も近い標準 Android フレームワーク密度が、サポート対象の最小互換画面サイズ(幅 320 dp)よりも小さい画面サイズとなる場合、デバイス実装は、次に低い標準 Android フレームワーク密度をレポートすべきです。
7.1.2. ディスプレイの指標
デバイス実装は、android.util.DisplayMetrics [参考資料、62] で定義されているすべてのディスプレイ指標について正しい値をレポートしなければなりません。また、内蔵画面と外部画面のどちらがデフォルト ディスプレイとして使用されているかにかかわらず、同じ値をレポートしなければなりません。
7.1.3. 画面の向き
デバイスは、サポートする画面の向き(android.hardware.screen.portrait や android.hardware.screen.landscape)を報告しなければならず、サポートされる向きを少なくとも 1 つ報告しなければなりません。たとえば、テレビやノートパソコンなど、固定の横向き画面を備えたデバイスは、android.hardware.screen.landscape のみを報告すべきです。
両方の画面の向きをレポートするデバイスは、アプリによる動的な画面の向き(縦向きまたは横向き)の指定をサポートしなければなりません。つまり、デバイスは、特定の画面の向きに関するアプリのリクエストを尊重しなければなりません。デバイス実装は、縦向きと横向きのいずれかをデフォルトとして選択しても構いません。
デバイスは、android.content.res.Configuration.orientation、android.view.Display.getOrientation()、またはその他の API を介してクエリされた場合は常に、デバイスの現在の画面の向きについて、正しい値をレポートしなければなりません。
デバイスは、向きを変更するときに、報告する画面サイズまたは密度を変更してはなりません。
7.1.4. 2D と 3D のグラフィック アクセラレーション
デバイス実装は、Android SDK ドキュメントで具体的に詳述されているように、OpenGL ES 1.0 と 2.0 の両方をサポートしなければなりません。デバイス実装は、OpenGL ES 3.0 または 3.1 をサポートできるデバイスでは、それをサポートすべきです。デバイス実装は、Android SDK ドキュメント [参考資料、63] で詳述されているとおり、Android RenderScript もサポートしなければなりません。
また、デバイス実装は、OpenGL ES 1.0、OpenGL ES 2.0、OpenGL ES 3.0、または OpenGL 3.1 のサポートを正しく識別しなければなりません。つまり:
- マネージド API は(GLES10.getString() メソッドなどにより)OpenGL ES 1.0 と OpenGL ES 2.0 のサポートをレポートしなければなりません。
- ネイティブ C/C++ OpenGL API(つまり、libGLES_v1CM.so、libGLES_v2.so、または libEGL.so を介してアプリから使用できる API)は、OpenGL ES 1.0 と OpenGL ES 2.0 のサポートをレポートしなければなりません。
- OpenGL ES 3.0 または 3.1 のサポートを宣言するデバイス実装は、対応するマネージド API をサポートするとともに、ネイティブ C/C++ API のサポートを含まなければなりません。OpenGL ES 3.0 または 3.1 のサポートを宣言するデバイス実装では、libGLESv2.so は OpenGL ES 2.0 の関数シンボルに加えて、対応する関数シンボルをエクスポートしなければなりません。
Android は、OpenGL ES 3.1 に加えて、Java インターフェースを備えた拡張機能パック [参考資料、64] と、テッセレーションや ASTC テクスチャ圧縮形式などの高度なグラフィック機能のネイティブ サポートを提供しています。Android デバイス実装は、この拡張機能パックをサポートしても構いません。完全に実装されている場合に限り、android.hardware.opengles.aep 機能フラグを通じてサポートを識別しなければなりません。
また、デバイス実装は、任意の OpenGL ES 拡張機能を実装しても構いません。ただしデバイス実装は、OpenGL ES のマネージド API とネイティブ API を介して、サポートする拡張機能の文字列をすべてレポートしなければならず、また逆に、サポートしない拡張機能の文字列をレポートしてはなりません。
なお、Android では、アプリは特定の OpenGL テクスチャ圧縮形式を必要とすることを任意で指定できます。通常、そうした形式はベンダー固有です。Android では、デバイス実装が特定のテクスチャ圧縮形式を実装することは必須ではありません。ただし、OpenGL API の getString() メソッドを介して、サポートするテクスチャ圧縮形式を正確にレポートすべきです。
Android には、マニフェスト タグ android:hardwareAccelerated または直接 API 呼び出しを使用することで、アプリ、アクティビティ、ウィンドウ、ビューのレベルで 2D グラフィックのハードウェア アクセラレーションを有効にすることを、アプリで宣言するメカニズムがあります [参考資料、65]。
デバイス実装は、ハードウェア アクセラレーションをデフォルトで有効にしなければならず、デベロッパーが android:hardwareAccelerated="false” を設定するか、Android View API を通じてハードウェア アクセラレーションを直接無効にすることでリクエストした場合、ハードウェア アクセラレーションを無効にしなければなりません。
また、デバイス実装は、ハードウェア アクセラレーションに関する Android SDK ドキュメント [参考資料、65] に合致する動作を示さなければなりません。
Android には、ハードウェア アクセラレーションの OpenGL ES テクスチャを UI 階層のレンダリング ターゲットとしてデベロッパーが直接統合できる、TextureView オブジェクトがあります。デバイス実装は TextureView API をサポートしなければならず、アップストリームの Android 実装と整合する動作を行わなければなりません。
Android には、EGL_ANDROID_RECORDABLE のサポートが含まれています。これは、画像を動画に記録する ANativeWindow へのレンダリングを EGLConfig がサポートするかどうかを示す EGLConfig 属性です。デバイス実装は、EGL_ANDROID_RECORDABLE 拡張機能 [参考資料、66] をサポートしなければなりません。
7.1.5. レガシーアプリの互換モード
Android では、以前の画面サイズに依存しない Android の旧バージョン向けに開発されていないレガシーアプリを活用するために、フレームワークが「標準」画面サイズ相当(幅 320 dp)のモードで動作する「互換モード」を規定しています。
- Android Automotive は、以前の互換モードをサポートしていません。
- 他のすべてのデバイス実装は、アップストリームの Android オープンソース コードで実装されたレガシーアプリ互換モードのサポートを含まなければなりません。つまり、デバイス実装は、互換モードが有効になるトリガーまたはしきい値を変更してはなりません。また、互換モード自体の動作を変更してはなりません。
7.1.6. 画面技術
Android プラットフォームには、アプリがリッチ グラフィックをディスプレイにレンダリングできるようにする API があります。このドキュメントで特に許可されていない限り、デバイスは、Android SDK で定義されているこれらの API をすべてサポートしなければなりません。
- デバイスは、16 ビットカラー グラフィックをレンダリングできるディスプレイをサポートしなければならず、24 ビットカラー グラフィックに対応したディスプレイをサポートするべきです。
- デバイスは、アニメーションをレンダリングできるディスプレイをサポートしなければなりません。
- 使用するディスプレイ技術は、ピクセル アスペクト比(PAR)が 0.9 から 1.15 の間でなければなりません。つまり、ピクセル アスペクト比は、許容差 10~15% でほぼ正方形(1.0)でなければなりません。
7.1.7. セカンダリ ディスプレイ
Android にはセカンダリ ディスプレイのサポートが含まれており、メディア共有機能と、外部ディスプレイにアクセスするためのデベロッパー API を有効にできます。デバイスが有線、無線、または埋め込み式の追加ディスプレイ接続を介して外部ディスプレイをサポートする場合、デバイス実装は、Android SDK ドキュメントに記載されているように、ディスプレイ マネージャー API を実装しなければなりません [参考資料、67]。
7.2. 入力デバイス
デバイスは、タッチスクリーンをサポートするか、7.2.2 に記載されているタップ以外のナビゲーションの要件を満たさなければなりません。
7.2.1. キーボード
Android スマートウォッチ実装と Android Automotive 実装は、ソフト キーボードを実装しても構いません。他のすべてのデバイス実装は、ソフト キーボードを実装しなければならず、さらに以下の要件も適用されます。
デバイス実装は:
- http://developer.android.com に詳述されているように、サードパーティ デベロッパーがソフト キーボードなどのインプット メソッド エディタを作成できる入力管理フレームワークをサポートしなければなりません。
- ハード キーボードが存在するかどうかにかかわらず、少なくとも 1 つのソフト キーボード実装を提供しなければなりません。ただし、画面サイズの観点からソフト キーボードを備えることがあまり合理的でない Android スマートウォッチ デバイスは除きます。
- 追加のソフト キーボード実装を含んでも構いません。
- ハードウェア キーボードを含んでも構いません。
- android.content.res.Configuration.keyboard [参考資料、68] で規定されている形式(QWERTY キーまたは 12 キー)のいずれかと一致しないハードウェア キーボードを含んではなりません。
7.2.2. タップ以外のナビゲーション
Android テレビデバイスは、D-pad をサポートしなければなりません。
デバイス実装は:
- デバイス実装が Android テレビデバイスでない場合は、タップ以外のナビゲーション オプション(トラックボール、D-pad、ホイール)を省略しても構いません。
- android.content.res.Configuration.navigation [参考資料、68] について、正しい値をレポートしなければなりません。
- 入力管理エンジンと互換性のある、テキストの選択と編集のための妥当な代替ユーザー インターフェース メカニズムを提供しなければなりません。アップストリームの Android オープンソース実装には、タップ以外のナビゲーション入力がないデバイスでの使用に適した選択メカニズムがあります。
7.2.3. ナビゲーション キー
このセクションで説明しているように、ホーム機能、履歴機能、戻る機能の可用性と表示の要件は、デバイスタイプによって異なります。
ホーム機能、履歴機能、戻る機能(それぞれキーイベント KEYCODE_HOME、KEYCODE_APP_SWITCH、KEYCODE_BACK にマッピングされています)は Android のナビゲーション パラダイムに不可欠であるため、以下の要件が適用されます。
- Android ハンドヘルド デバイス実装は、ホーム機能、履歴機能、戻る機能を提供しなければなりません。
- Android テレビデバイス実装は、ホーム機能と戻る機能を提供しなければなりません。
- Android スマートウォッチ デバイス実装は、ユーザーが利用できるホーム機能と、戻る機能(UI_MODE_TYPE_WATCH のときを除く)を備えなければなりません。
- Android Automotive 実装は、ホーム機能を提供しなければならず、戻る機能と履歴機能を提供しても構いません。
- 他のすべてのタイプのデバイス実装は、ホーム機能と戻る機能を提供しなければなりません。
これらの機能は、専用の物理ボタン(機械式または静電容量方式のタッチボタンなど)を介して実装しても構いません。または、画面の区分された部分の専用のソフトウェア キー、ジェスチャー、タッチパネルなどを使用して実装しても構いません。Android は両方の実装をサポートしています。これらの機能はすべて、表示されているときに、単一のアクション(タップ、ダブルクリック、ジェスチャーなど)でアクセスできなければなりません。
履歴機能(提供されている場合)は、全画面モードで他のナビゲーション機能とともに非表示になっている場合を除き、ボタンまたはアイコンを表示しなければなりません。この要件は、ナビゲーション用の物理ボタンがあって履歴キーがない以前の Android バージョンからアップグレードするデバイスには適用されません。
ホーム機能と戻る機能(提供されている場合)は、全画面モードで他のナビゲーション機能とともに非表示になっている場合、または uiMode UI_MODE_TYPE_MASK が UI_MODE_TYPE_WATCH に設定されている場合を除き、それぞれボタンまたはアイコンを表示しなければなりません。
Android 4.0 以降では、メニュー機能が非推奨になり、アクションバーに置き換えられました。そのため、Android 5.0 以降を搭載して出荷される新しいデバイス実装は、メニュー機能専用の物理ボタンを実装してはなりません。それより古いデバイス実装は、メニュー機能専用の物理ボタンを実装すべきではありません。ただし、物理的なメニューボタンが実装されており、デバイスが targetSdkVersion > 10 のアプリを実行する場合:
- アクションバーが表示され、その結果表示されるアクション オーバーフロー メニュー ポップアップが空でないときは、アクションバーにアクション オーバーフロー ボタンを表示しなければなりません。この要件は、Android 4.4 より前にリリースされたが Android 5.1 にアップグレードするデバイス実装の場合は、推奨されます。
- アクションバーのオーバーフロー ボタンを選択することで表示されるアクション オーバーフロー ポップアップの位置を変更してはなりません。
- 物理的なメニューボタンを選択することで表示されるときは、アクション オーバーフロー ポップアップを画面上の変更された位置にレンダリングしても構いません。
下位互換性を確保するため、デバイス実装は、targetSdkVersion が 10 未満のときは、物理ボタン、ソフトウェア キー、ジェスチャーのいずれかによって、メニュー機能をアプリで利用できるようにしなければなりません。このメニュー機能は、他のナビゲーション機能とともに非表示になっている場合を除き、表示すべきです。
Android は、アシスト アクションをサポートしています [参考資料、69]。Android スマートウォッチ デバイス以外の Android デバイス実装は、アプリ実行時に常にアシスト アクションをユーザーが利用できるようにしなければなりません。アシスト アクションは、ホームボタンの長押しか、ソフトウェア ホームキーで上にスワイプするジェスチャーとして実装すべきです。この機能は、別の物理ボタン、ソフトウェア キー、ジェスチャーで実装しても構いませんが、他のナビゲーション キーが表示されているときは単一のアクション(タップ、ダブルクリック、ジェスチャーなど)でアクセスできなければなりません。
デバイス実装は、ナビゲーション キーを表示するために画面の区分けされた部分を使用しても構いませんが、その場合は以下の要件を満たさなければなりません。
- デバイス実装のナビゲーション キーは、画面内のアプリが利用できない区分けされた部分を使用しなければなりません。また、画面内のアプリが利用できる部分を隠したり、その他の方法で利用を妨げたりしてはなりません。
- デバイス実装は、セクション 7.1.1 で規定されている要件を満たすアプリがディスプレイの一部を利用できるようにしなければなりません。
- アプリがシステム UI モードを指定していない場合、または SYSTEM_UI_FLAG_VISIBLE を指定している場合、デバイス実装はナビゲーション キーを表示しなければなりません。
- アプリが SYSTEM_UI_FLAG_LOW_PROFILE を指定している場合、デバイス実装は、ナビゲーション キーを目立たない「ロー プロファイル」(例: グレー表示)モードで表示しなければなりません。
- アプリが SYSTEM_UI_FLAG_HIDE_NAVIGATION を指定している場合、デバイス実装はナビゲーション キーを非表示にしなければなりません。
7.2.4. タッチスクリーン入力
Android ハンドヘルド デバイスと Android スマートウォッチ デバイスは、タッチスクリーン入力をサポートしなければなりません。
デバイス実装は、なんらかのポインタ入力(マウスのような入力またはタップ入力)システムを備えるべきです。ただし、デバイス実装がポインタ入力システムをサポートしていない場合は、android.hardware.touchscreen または android.hardware.faketouch 機能定数をレポートしてはなりません。ポインタ入力システムを含むデバイス実装には、以下の要件が適用されます。
- デバイス入力システムが複数のポインタをサポートする場合は、完全に独立してトラッキングされるポインタをサポートすべきです。
- デバイス上の具体的なタッチスクリーンの種類に対応する android.content.res.Configuration.touchscreen [参考資料、68] の値をレポートしなければなりません。
Android には、さまざまなタッチ スクリーン、タッチパッド、疑似タップ入力デバイスのサポートが含まれています。タッチスクリーン ベースのデバイス実装は、画面上のアイテムを直接操作しているような印象をユーザーに与えるディスプレイ [参考資料、70] に関連付けられます。ユーザーが画面に直接触れているため、操作中のオブジェクトを示すアフォーダンスを追加する必要はありません。これに対して、疑似タップ インターフェースは、タッチスクリーン機能のサブセットに似たユーザー入力システムを提供します。たとえば、画面上のカーソルを操作するマウスまたはリモコンはタップに近いですが、ユーザーは最初にポイントまたはフォーカスしてからクリックする必要があります。マウス、トラックパッド、ジャイロベースのエアマウス、ジャイロポインタ、ジョイスティック、マルチタッチ トラックパッドなど、多くの入力デバイスが擬似タップ インターフェースをサポートできます。Android には、機能定数 android.hardware.faketouch があります。これは、タップベースの入力を適切にエミュレートできる(そして基本的なジェスチャーをサポートする)マウスやトラックパッドなどの忠実度の高い非タップ式(ポインタベース)の入力デバイスに対応しており、タッチスクリーン機能のエミュレートされたサブセットをデバイスがサポートしていることを示します。疑似タップ機能を宣言するデバイス実装は、セクション 7.2.5 の疑似タップの要件を満たさなければなりません。
デバイス実装は、使用されている入力の種類に対応する正しい機能をレポートしなければなりません。タッチスクリーン(シングルタッチ以上)を含むデバイス実装は、プラットフォーム機能定数 android.hardware.touchscreen をレポートしなければなりません。プラットフォーム機能定数 android.hardware.touchscreen をレポートするデバイス実装は、プラットフォーム機能定数 android.hardware.faketouch もレポートしなければなりません。タッチスクリーンを含まない(そしてポインタ デバイスのみに依存する)デバイス実装はタッチスクリーン機能をレポートしてはならず、セクション 7.2.5 の疑似タップの要件を満たす場合は android.hardware.faketouch のみをレポートしなければなりません。
7.2.5. 疑似タップ入力
android.hardware.faketouch のサポートを宣言するデバイス実装は:
- ポインタ位置の絶対 X 画面位置と絶対 Y 画面位置をレポートし、画面にビジュアル ポインタを表示しなければなりません [参考資料、71]。
- ポインタが画面を上下に移動するときに発生する状態変化を指定するアクション コードで、タッチイベントをレポートしなければなりません [参考資料、71]。
- ユーザーが画面上のオブジェクトのタップをエミュレートできるように、画面上のオブジェクトでのポインタの上下移動をサポートしなければなりません。
- ユーザーが画面上のオブジェクトのダブルタップをエミュレートできるように、時間しきい値内で、画面上のオブジェクトの同じ場所におけるポインタの下移動、ポインタの上移動、ポインタの下移動からの上移動をサポートしなければなりません [参考資料、71]。
- ユーザーがタップドラッグをエミュレートできるように、画面上の任意の点におけるポインタの下移動、画面上の他の任意の点へのポインタ移動、その後のポインタの上移動をサポートしなければなりません。
- ユーザーが画面上のオブジェクトをフリングできるように、ポインタの下移動をサポートし、ユーザーがオブジェクトを画面上の別の位置にすばやく移動してから画面上でポインタを上移動できるようにしなければなりません。
android.hardware.faketouch.multitouch.distinct のサポートを宣言するデバイスは、上記の疑似タップの要件を満たさなければならず、2 つ以上の独立したポインタ入力の個別のトラッキングもサポートしなければなりません。
7.2.6. ゲーム コントローラのサポート
Android テレビデバイス実装は、下記のように、ゲーム コントローラのボタン マッピングをサポートしなければなりません。アップストリームの Android 実装には、この要件を満たすゲーム コントローラの実装が含まれています。
7.2.6.1. ボタン マッピング
Android テレビデバイス実装は、次のキーマッピングをサポートしなければなりません。
ボタン | HID 使用状況2 | Android ボタン |
---|---|---|
A1 | 0x09 0x0001 | KEYCODE_BUTTON_A(96) |
B1 | 0x09 0x0002 | KEYCODE_BUTTON_B(97) |
X1 | 0x09 0x0004 | KEYCODE_BUTTON_X(99) |
Y1 | 0x09 0x0005 | KEYCODE_BUTTON_Y(100) |
D-pad 上1 | 0x01 0x00393 | AXIS_HAT_Y4 |
D-pad 左1 | 0x01 0x00393 | AXIS_HAT_X4 |
左ショルダーボタン1 | 0x09 0x0007 | KEYCODE_BUTTON_L1(102) |
右ショルダー ボタン1 | 0x09 0x0008 | KEYCODE_BUTTON_R1(103) |
左スティック クリック1 | 0x09 0x000E | KEYCODE_BUTTON_THUMBL(106) |
右スティック クリック1 | 0x09 0x000F | KEYCODE_BUTTON_THUMBR(107) |
ホーム1 | 0x0c 0x0223 | KEYCODE_HOME(3) |
戻る1 | 0x0c 0x0224 | KEYCODE_BACK(4) |
1 [参考資料、72]
2 上記の HID 使用状況は、ゲームパッド CA(0x01 0x0005)内で宣言しなければなりません。
3 この使用状況は、論理最小値 0、論理最大値 7、物理最小値 0、物理最大値 315、度単位、レポートサイズ 4 でなければなりません。論理値は、垂直軸から時計回りに定義されます。たとえば、論理値 0 は回転せず上ボタンが押されていることを表し、論理値 1 は 45 度回転し上キーと左キーの両方が押されていることを表します。
4 [参考資料、71]
アナログ コントロール1 | HID 使用状況 | Android ボタン |
---|---|---|
左トリガー | 0x02 0x00C5 | AXIS_LTRIGGER |
右トリガー | 0x02 0x00C4 | AXIS_RTRIGGER |
左ジョイスティック | 0x01 0x0030
0x01 0x0031 |
AXIS_X
AXIS_Y |
右ジョイスティック | 0x01 0x0032
0x01 0x0035 |
AXIS_Z
AXIS_RZ |
1 [参考資料、71]
7.2.7. リモコン
Android テレビデバイス実装は、ユーザーがテレビ インターフェースにアクセスできるようにリモコンを提供すべきです。リモコンは、物理的なリモコンでも、スマートフォンまたはタブレットからアクセスできるソフトウェア ベースのリモコンでも構いません。リモコンは、下記の要件を満たさなければなりません。
- 検索アフォーダンス。デバイス実装は、ユーザーが物理リモコンまたはソフトウェア ベースのリモコンで音声検索を呼び出したときに、KEYCODE_SEARCH を起動しなければなりません。
- ナビゲーション。すべての Android テレビのリモコンは、戻るボタン、ホームボタン、選択ボタンと、D-pad イベントのサポートを含まれなければなりません [参考資料、72]。
7.3. センサー
Android には、さまざまな種類のセンサーにアクセスするための API があります。デバイス実装は、以降のサブセクションに示すとおり、通常、これらのセンサーを省略しても構いません。サードパーティ デベロッパー向けの対応する API を持つ特定のセンサータイプがデバイスに含まれる場合、デバイス実装は、センサーに関する Android SDK ドキュメントと Android オープンソース ドキュメントに記載されているとおり、その API を実装しなければなりません [参考資料、73]。たとえば、デバイス実装は:
- android.content.pm.PackageManager クラス [参考資料、53] に基づいて、センサーの有無を正確にレポートしなければなりません。
- SensorManager.getSensorList() や同様のメソッドを介してサポート対象のセンサーの正確なリストを返さなければなりません。
- 他のすべてのセンサー API について合理的に動作しなければなりません(たとえば、アプリがリスナーの登録を試みたときは適切に true または false を返す、対応するセンサーが存在しないときはセンサー リスナーを呼び出さないなど)。
- Android SDK ドキュメント [参考資料、74] で規定されているセンサータイプごとに、関連する国際単位系(メートル法)の値を使用してすべてのセンサー測定値をレポートしなければなりません。
- Android SDK ドキュメントで定義されているとおり、ナノ秒単位でイベント時刻をレポートすべきです。これは、イベントが発生した時刻を表し、SystemClock.elapsedRealtimeNano() クロックと同期されています。既存と新規の Android デバイスは、これらの要件を満たすことが極めて強く推奨されます。これにより、これが必須コンポーネントとなる将来のプラットフォーム リリースへのアップグレードが可能になります。同期エラーは 100 ミリ秒未満であるべきです [参考資料、75]。
上記のリストは包括的なものではありません。センサー [参考資料、73] に関する Android SDK ドキュメントと Android オープンソース ドキュメントに記載されている動作を、信頼できるものとみなします。
一部のセンサータイプは複合型です。つまり、1 つ以上の他のセンサーによって提供されるデータから得られることがあります(方向センサーや直線加速度センサーなど)。デバイス実装は、[参考資料、76] に記載されているとおり、必須の物理センサーを含む場合、これらのセンサータイプを実装すべきです。複合センサーが含まれる場合、デバイス実装は、複合センサーに関する Android オープンソースのドキュメント [参考資料、76] に記載されているセンサーを実装しなければなりません。
一部の Android センサーは、データを継続的に返す「連続」トリガーモード [参考資料、77] をサポートしています。連続センサーであることが Android SDK ドキュメントで示されている API の場合、デバイス実装は、ジッターが 3% 未満であるべき定期データサンプルを継続的に提供しなければなりません(ジッターは、連続するイベント間でレポートされるタイムスタンプ値の標準偏差として定義されます)。
なお、センサー イベント ストリームは、デバイス CPU がサスペンド状態に入ること、またはサスペンド状態から復帰することを妨げてはならず、デバイス実装はそれを保証しなければなりません。
複数のセンサーが有効になっているとき、消費電力は、個々のセンサーがレポートした消費電力の合計を超えるべきではありません。
7.3.1. 加速度計
デバイス実装は、3 軸加速度計を含むべきです。Android ハンドヘルド デバイスと Android スマートウォッチ デバイスは、このセンサーを含むことが強く推奨されます。3 軸加速度計が含まれる場合、デバイス実装は:
- TYPE_ACCELEROMETER センサー [参考資料、78] を実装し、レポートしなければなりません。
- Android スマートウォッチ デバイスでは、比較的厳しい電力制約があるため、周波数が少なくとも 50 Hz までのイベントをレポートできなければならず、他のすべてのデバイスタイプでは、100 Hz までのイベントをレポートできなければなりません。
- 少なくとも 200 Hz までのイベントをレポートすべきです。
- Android API で詳述されているとおり、Android センサー座標系に準拠しなければなりません [参考資料、74]。
- どの軸でも、自由落下から重力の 4 倍(4g)以上まで測定できなければなりません。
- 分解能が 8 ビット以上でなければならず、16 ビット以上であるべきです。
- ライフサイクル中に特性が変化して補正される場合は使用中にキャリブレーションを行うべきであり、デバイスの再起動の間で補正パラメータを保持すべきです。
- 温度補正すべきです。
- 標準偏差が 0.05 m/s^ 以下でなければなりません。標準偏差は、最速サンプリング レートで少なくとも 3 秒間にわたって収集されたサンプルについて、軸ごとに計算するべきです。
- Android SDK ドキュメントに記載されているように、TYPE_SIGNIFICANT_MOTION、TYPE_TILT_DETECTOR、TYPE_STEP_DETECTOR、TYPE_STEP_COUNTER 複合センサーを実装すべきです。既存と新規の Android デバイスは、TYPE_SIGNIFICANT_MOTION 複合センサーを実装することが極めて強く推奨されます。これらのセンサーのいずれかを実装する場合は、消費電力の合計が常に 4 mW 未満でなければならず、デバイスが動的状態にあるときは 2 mW 未満、静的状態にあるときは 0.5 mW 未満であるべきです。
- ジャイロスコープ センサーが含まれる場合は、TYPE_GRAVITY 複合センサーと TYPE_LINEAR_ACCELERATION 複合センサーを実装しなければならず、TYPE_GAME_ROTATION_VECTOR 複合センサーを実装すべきです。既存と新規の Android デバイスは、TYPE_GAME_ROTATION_VECTOR センサーを実装することが強く推奨されます。
- ジャイロスコープ センサーと磁力計センサーも含まれる場合は、TYPE_ROTATION_VECTOR 複合センサーを実装すべきです。
7.3.2. 磁力計
デバイス実装は、3 軸磁力計(コンパス)を含むべきです。3 軸磁力計を含むデバイスには、以下の要件が適用されます。
- TYPE_MAGNETIC_FIELD センサーを実装しなければならず、TYPE_MAGNETIC_FIELD_UNCALIBRATED センサーも実装すべきです。既存と新規の Android デバイスは、TYPE_MAGNETIC_FIELD_UNCALIBRATED センサーを実装することが強く推奨されます。
- 周波数が少なくとも 10 Hz までのイベントをレポートできなければならず、少なくとも 50 Hz までのイベントをレポートすべきです。
- Android API で詳述されているとおり、Android センサー座標系に準拠しなければなりません [参考資料、74]。
- 飽和する前に各軸で -900 µT~+900 µT を測定できなければなりません。
- 磁力計を動的(電流誘導)磁場と静的(磁気誘導)磁場から離して配置することで、ハードアイアン オフセット値が 700 µT 未満でなければならず、200 µT 未満であるべきです。
- 分解能が 0.6 µT 以上でなければならず、0.2 µT 以上であるべきです。
- 温度補正すべきです。
- ハードアイアン バイアスのオンラインのキャリブレーションと補正をサポートし、デバイスの再起動の前後で補正パラメータを保持しなければなりません。
- ソフトアイアン補正を適用しなければなりません。キャリブレーションは、デバイスの使用中または製造中に行うことができます。
- 最速サンプリング レートで少なくとも 3 秒間にわたって収集されたサンプルについて軸ごとに計算された標準偏差が 0.5 µT 以下であるべきです。
- 加速度センサーとジャイロスコープ センサーも含まれる場合は、TYPE_ROTATION_VECTOR 複合センサーを実装すべきです。
- 加速度計センサーも実装する場合は、TYPE_GEOMAGNETIC_ROTATION_VECTOR センサーを実装しても構いません。ただし、実装するときは、センサーが 10 Hz でバッチモードに登録されている場合、消費電力が 10 mW 未満でなければならず、3 mW 未満であるべきです。
7.3.3. GPS
デバイス実装は、GPS レシーバーを含むべきです。GPS レシーバーが含まれる場合、デバイス実装は、GPS ロックオン時間を最小化するために、なんらかの「アシスト GPS」技術を含むべきです。
7.3.4. ジャイロスコープ
デバイス実装は、ジャイロスコープ(角度変化センサー)を含むべきです。デバイスは、3 軸加速度計も含む場合を除き、ジャイロスコープ センサーを含むべきではありません。デバイス実装がジャイロスコープを含む場合は、以下の要件が適用されます。
- TYPE_GYROSCOPE センサーを実装しなければならず、TYPE_GYROSCOPE_UNCALIBRATED センサーも実装すべきです。既存と新規の Android デバイスは、SENSOR_TYPE_GYROSCOPE_UNCALIBRATED センサーを実装することが強く推奨されます。
- 最大で毎秒 1,000 度の方向変化を測定できなければなりません。
- Android スマートウォッチ デバイスでは、比較的厳しい電力制約があるため、周波数が少なくとも 50 Hz までのイベントを報告できなければならず、他のすべてのデバイスタイプでは、100 Hz までのイベントを報告できなければなりません。
- 少なくとも 200 Hz までのイベントをレポートすべきです。
- 分解能が 12 ビット以上でなければならず、16 ビット以上であるべきです。
- 温度補正を行わなければなりません。
- 使用中にキャリブレーションと補正を行い、デバイスの再起動の間で補正パラメータを保持しなければなりません。
- 分散が Hz あたり 1e-7 rad^2/s^2(Hz あたりの分散、つまり rad^2/s)以下でなければなりません。分散はサンプリング レートによって異なることが許容されますが、この値の制約を受けなければなりません。つまり、サンプリング レート 1 Hz でジャイロの分散を測定した場合、1e-7 rad^2/s^2 以下であるべきです。
- 加速度計センサーと磁力計センサーも含まれる場合は、TYPE_ROTATION_VECTOR 複合センサーを実装すべきです。
- 加速度計センサーが含まれる場合は、TYPE_GRAVITY 複合センサーと TYPE_LINEAR_ACCELERATION 複合センサーを実装しなければならず、TYPE_GAME_ROTATION_VECTOR 複合センサーを実装すべきです。既存と新規の Android デバイスは、TYPE_GAME_ROTATION_VECTOR センサーを実装することが強く推奨されます。
7.3.5. 気圧計
デバイス実装は、気圧計(大気圧センサー)を含むべきです。デバイス実装が気圧計を含む場合は、以下の要件が適用されます。
- TYPE_PRESSURE センサーを実装し、レポートしなければなりません。
- 5 Hz 以上でイベントを配信できなければなりません。
- 標高を推定するのに十分な精度がなければなりません。
- 温度補正しなければなりません。
7.3.6. 温度計
デバイス実装は、周囲温度計(温度センサー)を含んでも構いません。周囲温度計が存在する場合は、SENSOR_TYPE_AMBIENT_TEMPERATURE として定義されなければならず、周囲温度(室温)を摂氏で測定しなければなりません。
デバイス実装は、CPU 温度センサーを含んでも構いませんが、含むべきではありません。存在する場合、SENSOR_TYPE_TEMPERATURE として定義されなければなりません。また、デバイスの CPU の温度を測定しなければならず、それ以外の温度を測定してはなりません。なお、SENSOR_TYPE_TEMPERATURE センサータイプは Android 4.0 で非推奨になりました。
7.3.7. 光度計
デバイス実装は、光度計(周囲光センサー)を含んでも構いません。
7.3.8. 近接センサー
デバイス実装は、近接センサーを含んでも構いません。音声通話が可能で、getPhoneType に PHONE_TYPE_NONE 以外の値を示すことができるデバイスは、近接センサーを含むべきです。近接センサーを含むデバイス実装には、以下の要件が適用されます。
- 画面と同じ向きで物体の近接を測定しなければなりません。つまり、近接センサーは画面の近くにある物体を検出するような向きでなければなりません。これは、スマートフォンをユーザーが使用中であることの検出が、この種のセンサーの主な目的であるためです。他の方向を向いている近接センサーを含む場合、デバイス実装はこの API を介してアクセス可能であってはなりません。
- 正確度が 1 ビット以上でなければなりません。
7.4. データ接続
7.4.1. 電話
Android API とこのドキュメントで使用する「電話」は、特に、GSM または CDMA ネットワークを介して行う音声通話と SMS メッセージの送信に関連するハードウェアのことを指します。こうした音声通話は、パケット交換であってもそうでなくても構いませんが、Android では、同じネットワークを使用して実装されるデータ接続からは独立しているとみなされます。つまり、Android の「電話」機能と API は、特に音声通話と SMS のことを指します。たとえば、発信や SMS メッセージの送受信ができないデバイス実装は、データ接続にモバイル ネットワークを使用するかどうかにかかわらず、android.hardware.telephony 機能またはサブ機能をレポートしてはなりません。
Android は、電話ハードウェアを含まないデバイスで使用しても構いません。つまり、Android はスマートフォンではないデバイスに対応しています。ただし、デバイス実装に GSM または CDMA の電話が含まれる場合、その技術の API の完全なサポートを実装しなければなりません。電話ハードウェアを含まないデバイス実装は、完全な API を NoOps として実装しなければなりません。
7.4.2. IEEE 802.11(Wi-Fi)
Android テレビデバイス実装は、Wi-Fi サポートを含まなければなりません。
Android テレビデバイス実装は、1 つ以上の形式の 802.11(b/g/a/n など)のサポートを含まなければならず、他のタイプの Android デバイス実装は、1 つ以上の形式の 802.11 のサポートを含むべきです。802.11 のサポートが含まれ、その機能をサードパーティ アプリに公開する場合、デバイス実装は、対応する Android API を実装しなければならず、以下の要件も適用されます。
- ハードウェア機能フラグ android.hardware.wifi をレポートしなければなりません。
- SDK ドキュメント [参考資料、79] に記載されているとおり、マルチキャスト API を実装しなければなりません。
- マルチキャスト DNS(mDNS)をサポートしなければならず、画面がアクティブ状態にないときを含むいかなる運用時にも mDNS パケット(224.0.0.251)をフィルタしてはなりません。
7.4.2.1. Wi-Fi Direct
デバイス実装は、Wi-Fi Direct(Wi-Fi ピアツーピア)をサポートすべきです。Wi-Fi Direct をサポートする場合、デバイス実装は、SDK ドキュメント [参考資料、80] に記載されているとおり、対応する Android API を実装しなければなりません。Wi-Fi Direct のサポートが含まれる場合、デバイス実装は:
- ハードウェア機能 android.hardware.wifi.direct をレポートしなければなりません。
- 通常の Wi-Fi 運用をサポートしなければなりません。
- Wi-Fi と Wi-Fi Direct の同時使用をサポートすべきです。
7.4.2.2. Wi-Fi Tunneled Direct Link Setup
Android テレビデバイス実装は、Wi-Fi Tunneled Direct Link Setup(TDLS)のサポートを含まなければなりません。
Android テレビデバイス実装は、Wi-Fi Tunneled Direct Link Setup(TDLS)のサポートを含まなければならず、他のタイプの Android デバイス実装は、Android SDK ドキュメント [参考資料、81] に記載されているとおり、Wi-Fi TDLS のサポートを含むべきです。TDLS のサポートが含まれ、WiFiManager API で TDLS が有効になっている場合、デバイス実装は:
- 可能かつ有効な場合にのみ、TDLS を使用すべきです。
- TDLS のパフォーマンスが Wi-Fi アクセス ポイントを通過する場合よりも悪くなる可能性がある場合は、TDLS を使用せず、なんらかのヒューリスティックを使用するべきです。
7.4.3. Bluetooth
Android スマートウォッチ実装と Android Automotive 実装は、Bluetooth をサポートしなければなりません。Android テレビ実装は、Bluetooth と Bluetooth LE をサポートしなければなりません。
Android は、Bluetooth と Bluetooth Low Energy をサポートしています [参考資料、82]。Bluetooth と Bluetooth Low Energy のサポートを含むデバイス実装は、関連するプラットフォーム機能(それぞれ android.hardware.bluetooth と android.hardware.bluetooth_le)を宣言し、そのプラットフォーム API を実装しなければなりません。デバイス実装は、デバイスに応じて、A2DP、AVCP、OBEX など、関連する Bluetooth プロファイルを実装すべきです。Android テレビデバイス実装は、Bluetooth と Bluetooth LE をサポートしなければなりません。
Bluetooth Low Energy のサポートを含むデバイス実装には、以下の要件が適用されます。
- ハードウェア機能 android.hardware.bluetooth_le を宣言しなければなりません。
- SDK ドキュメントと [参考資料、82] に記載されているとおり、GATT(汎用属性プロファイル)ベースの Bluetooth API を有効にしなければなりません。
- ScanFilter API [参考資料、83] を実装するとき、Bluetooth チップセットに対するフィルタリング ロジックのオフロードをサポートすべきであり、android.bluetooth.BluetoothAdapter.isOffloadedFilteringSupported() メソッドを介してクエリされたときにフィルタリング ロジックが実装された場所の正しい値をレポートしなければなりません。
- Bluetooth チップセットに対するバッチスキャンのオフロードをサポートすべきですが、サポートしない場合、android.bluetooth.BluetoothAdapater.isOffloadedScanBatchingSupported() メソッドを通じてクエリされたときは常に「false」をレポートしなければなりません。
- 少なくとも 4 つのスロットでマルチ アドバタイズメントをサポートするべきですが、サポートしない場合、android.bluetooth.BluetoothAdapter.isMultipleAdvertisementSupported() メソッドを通じてクエリされたときは常に「false」を報告しなければなりません。
7.4.4. 近距離無線通信
デバイス実装は、近距離無線通信(NFC)用の送受信機と関連ハードウェアを含むべきです。NFC ハードウェアが含まれ、サードパーティ アプリで利用できるようにする予定である場合、デバイス実装は:
- android.content.pm.PackageManager.hasSystemFeature() メソッド [参考資料、53] から android.hardware.nfc 機能をレポートしなければなりません。
- 次の NFC 規格を介して、NDEF メッセージの読み取りと書き込みができなければなりません。
- 次の NFC 規格を介して、NFC フォーラムのリーダー / ライター(NFC フォーラムの技術仕様 NFCForum-TS-DigitalProtocol-1.0 で定義)として動作できなければなりません。
- NfcA(ISO14443-3A)
- NfcB(ISO14443-3B)
- NfcF(JIS 6319-4)
- IsoDep(ISO 14443-4)
- NFC フォーラムのタグタイプ 1、2、3、4(NFC フォーラムにより定義)
- 次の NFC 規格を介して NDEF メッセージの読み取りと書き込みを行えるべきです。なお、以下の NFC 規格は「すべき」として記載されていますが、今後のバージョンの互換性定義では「しなければならない」に変更される予定です。これらの規格は、このバージョンでは任意ですが、今後のバージョンでは必須となります。このバージョンの Android を搭載した既存または新規のデバイスは現在、今後のプラットフォーム リリースにアップグレードできるよう、これらの要件を満たすことが極めて強く奨励されています。
- NfcV(ISO 15693)
- 次のピアツーピア規格とプロトコルを介してデータを送受信できなければなりません。
- ISO 18092
- LLCP 1.0(NFC フォーラムにより定義)
- SDP 1.0(NFC フォーラムにより定義)
- NDEF プッシュ プロトコル [参考資料、84]
- SNEP 1.0(NFC フォーラムにより定義)
- Android ビーム [参考資料、85] のサポートを含まなければなりません。
- SNEP デフォルト サーバーを実装しなければなりません。デフォルトの SNEP サーバーが受信した有効な NDEF メッセージは、android.nfc.ACTION_NDEF_DISCOVERED インテントを使用してアプリにディスパッチされなければなりません。設定で Android ビームを無効にすることにより、受信 NDEF メッセージのディスパッチを無効にしてはなりません。
- android.settings.NFCSHARING_SETTINGS インテントを尊重して、NFC 共有設定 [参考資料、86] を表示しなければなりません。
- NPP サーバーを実装しなければなりません。NPP サーバーが受信するメッセージは、SNEP のデフォルト サーバーと同じ方法で処理しなければなりません。
- Android ビームが有効になっているときは、SNEP クライアントを実装し、送信 P2P NDEF のデフォルトの SNEP サーバーへの送信を試行しなければなりません。デフォルトの SNEP サーバーが見つからない場合、クライアントは NPP サーバーへの送信を試行しなければなりません。
- フォアグラウンド アクティビティが、android.nfc.NfcAdapter.setNdefPushMessage、android.nfc.NfcAdapter.setNdefPushMessageCallback、android.nfc.NfcAdapter.enableForegroundNdefPush を使用して、送信 P2P NDEF メッセージを設定できるようにしなければなりません。
- 送信 P2P NDEF メッセージを送信する前に、「タップしてビーム」などのジェスチャーまたは画面上の確認を使用すべきです。
- Android ビームをデフォルトで有効にすべきであり、別の独自の NFC P2p モードがオンになっていても、Android ビームを使用して送受信ができなければなりません。
- デバイスが Bluetooth オブジェクト プッシュ プロファイルをサポートしている場合は、Bluetooth への NFC 接続ハンドオーバーをサポートしなければなりません。デバイス実装は、android.nfc.NfcAdapter.setBeamPushUris を使用する場合、NFC フォーラムの「Connection Handover バージョン 1.2」仕様 [参考資料、87] と「Bluetooth Secure Simple Pairing Using NFC バージョン 1.0」仕様 [参考資料、88] を実装して、Bluetooth への接続ハンドオーバーをサポートしなければなりません。このような実装では、NFC を介してハンドオーバー リクエスト / 選択レコードを交換するために、サービス名「urn:nfc:sn:handover」を持つハンドオーバー LLCP サービスを実装しなければならず、実際の Bluetooth データ転送には Bluetooth オブジェクト プッシュ プロファイルを使用しなければなりません。従来の理由(Android 4.1 デバイスとの互換性を維持する)のために、実装では NFC を介してハンドオーバー リクエスト / 選択レコードを交換するために SNEP GET リクエストを引き続き受け入れるべきです。ただし、実装自体が、接続ハンドオーバーを行うための SNEP GET リクエストを送信すべきではありません。
- NFC 検出モードのときは、サポートされているすべての技術をポーリングしなければなりません。
- 画面がアクティブ、ロック画面がロック解除された状態でデバイスが起動しているときは、NFC 検出モードになっているべきです。
- 次の NFC 規格を介して、NFC フォーラムのリーダー / ライター(NFC フォーラムの技術仕様 NFCForum-TS-DigitalProtocol-1.0 で定義)として動作できなければなりません。
(なお、上記の JIS、ISO、NFC フォーラムの仕様について、一般公開されているリンクはありません)。
Android は、NFC ホストカード エミュレーション(HCE)モードをサポートしています。HCE とアプリケーション ID(AID)ルーティングの機能がある NFC コントローラが含まれる場合、デバイス実装には以下の要件が適用されます。
- android.hardware.nfc.hce 機能定数をレポートしなければなりません。
- Android SDK で定義されているとおり、NFC HCE API をサポートしなければなりません [参考資料、10]。
さらに、デバイス実装は、以下の MIFARE 技術のリーダー / ライターをサポートしても構いません。
- MIFARE Classic
- MIFARE Ultralight
- MIFARE Classic の NDEF
なお、Android には、これらの MIFARE タイプ用の API が含まれています。リーダー / ライターの役割で MIFARE をサポートする場合、デバイス実装には以下の要件が適用されます。
- Android SDK に記載されているとおり、対応する Android API を実装しなければなりません。
- android.content.pm.PackageManager.hasSystemFeature() メソッド [参考資料、53] から機能 com.nxp.mifare をレポートしなければなりません。なお、これは Android の標準の機能ではないため、PackageManager クラスの定数としては表示されません。
- このセクションに記載されているように、一般的な NFC サポートも実装しない限り、対応する Android API を実装してはならず、com.nxp.mifare 機能をレポートしてはなりません。
NFC ハードウェアが含まれない場合、デバイス実装は android.content.pm.PackageManager.hasSystemFeature() メソッドから android.hardware.nfc 機能を宣言してはなりません [参考資料、53]。また、Android NFC API を NoOps として実装しなければなりません。
android.nfc.NdefMessage クラスと android.nfc.NdefRecord クラスはプロトコルに依存しないデータ表現形式を表すため、デバイス実装は NFC のサポートを含まない場合または android.hardware.nfc 機能を宣言していない場合でも、これらの API を実装しなければなりません。
7.4.5. 最低限のネットワーク機能
デバイス実装は、1 つ以上の形式のデータ ネットワーキングのサポートを含まなければなりません。具体的には、デバイス実装は、200 kbps 以上の能力を持つ、少なくとも 1 つのデータ標準のサポートを含まなければなりません。この要件を満たす技術の例としては、EDGE、HSPA、EV-DO、802.11g、イーサネット、Bluetooth PAN が挙げられます。
物理ネットワーキング標準(イーサネットなど)がプライマリ データ接続になっているデバイス実装は、802.11(Wi-Fi)などの一般的なワイヤレス データ標準も少なくとも 1 つサポートすべきです。
デバイスは、複数の形式のデータ接続を実装しても構いません。
7.4.6. 同期設定
デバイス実装は、メソッド getMasterSyncAutomatically() が「true」を返すように、マスター自動同期設定をデフォルトでオンにしなければなりません [参考資料、89]。
7.5. カメラ
デバイス実装は背面カメラを含むべきであり、前面カメラを含んでも構いません。背面カメラとは、デバイスのディスプレイとは反対側に配置されたカメラのことです。つまり、従来のカメラのようにデバイスの向こう側の光景を撮影するものです。前面カメラとは、デバイスのディスプレイと同じ側に配置されたカメラのことです。つまり、通常はビデオ会議や類似のアプリなどでユーザーを撮影するために使用されるカメラです。
少なくとも 1 つのカメラが含まれる場合、デバイス実装は、デバイスの最大解像度のカメラセンサーによって生成された画像のサイズに等しい 3 つのビットマップを、アプリが同時に割り当てられるようにするべきです。
7.5.1. 背面カメラ
デバイス実装は背面カメラを含むべきです。背面カメラが 1 つ以上含まれる場合、デバイス実装は:
- 機能フラグ android.hardware.camera と android.hardware.camera.any をレポートしなければなりません。
- 解像度が少なくとも 2 メガピクセルでなければなりません。
- カメラドライバでハードウェア オートフォーカスまたはソフトウェア オートフォーカスを実装すべきです(アプリ ソフトウェアに対して透過的)。
- 固定フォーカスまたは EDOF(拡張被写界深度)のハードウェアがあっても構いません。
- フラッシュを含んでも構いません。カメラがフラッシュを含む場合、android.hardware.Camera.PreviewCallback インスタンスがカメラ プレビュー サーフェスに登録されている間は、アプリが Camera.Parameters オブジェクトの FLASH_MODE_AUTO 属性または FLASH_MODE_ON 属性を有効にすることによってフラッシュを明示的に有効にしていない限り、フラッシュ ランプを点灯してはなりません。なお、この制約は、デバイスの内蔵システム カメラアプリには適用されず、Camera.PreviewCallback を使用するサードパーティ アプリにのみ適用されます。
7.5.2. 前面カメラ
デバイス実装は前面カメラを含んでも構いません。前面カメラが 1 つ以上含まれる場合、デバイス実装は:
- 機能フラグ android.hardware.camera.any と android.hardware.camera.front をレポートしなければなりません。
- 解像度が少なくとも VGA(640x480 ピクセル)でなければなりません。
- 前面カメラを Camera API のデフォルトとして使用してはなりません。Android の Camera API には前面カメラに対する特定のサポートが含まれており、デバイス実装は、たとえデバイス上の唯一のカメラであったとしても、前面カメラをデフォルトの背面カメラとして扱うように API を構成してはなりません。
- セクション 7.5.1 に記載されているとおり、背面カメラで利用できる機能(オートフォーカス、フラッシュなど)を含めても構いません。
- 次に示すように、カメラ プレビューで、アプリによって表示されるストリームを水平方向に反映(つまりミラーリング)しなければなりません。
- デバイス実装がユーザーによる回転(たとえば、加速度計による自動的な回転またはユーザー入力による手動の回転)に対応している場合は、デバイスの現在の向きに対して水平にカメラ プレビューをミラーリングしなければなりません。
- 現在のアプリが、android.hardware.Camera.setDisplayOrientation() メソッド [参考資料、90] を呼び出してカメラ ディスプレイの回転を明示的にリクエストした場合は、アプリが指定した向きに対して水平にカメラ プレビューをミラーリングしなければなりません。
- それ以外の場合は、デバイスのデフォルトの水平軸に沿ってプレビューをミラーリングしなければなりません。
- カメラ プレビューの画像ストリームと同じ方法で、ポストビューで表示される画像をミラーリングしなければなりません。デバイス実装がポストビューをサポートしていない場合、この要件は明確には適用されません。
- アプリのコールバックに対して返されたか、メディア ストレージに対してコミットされた、キャプチャした最終的な静止画または動画のストリームをミラーリングしてはなりません。
7.5.3. 外部カメラ
USB ホストモードを備えたデバイス実装は、USB ポートに接続する外部カメラのサポートを含んでも構いません。外部カメラのサポートが含まれる場合、デバイスは:
- プラットフォーム機能 android.hardware.camera.external と android.hardware camera.any を宣言しなければなりません。
- USB 動画クラス(UVC 1.0 以降)をサポートしなければなりません。
- 複数のカメラをサポートしても構いません。
高品質な未エンコード ストリーム(つまり、未加工または個別に圧縮された画像ストリーム)の転送を可能にするために、動画圧縮(MJPEG など)のサポートが推奨されます。カメラベースの動画エンコードをサポートしても構いません。サポートする場合は、同時未エンコード / MJPEG ストリーム(解像度 QVGA 以上)がデバイス実装からアクセス可能でなければなりません。
7.5.4. カメラ API の動作
Android には、カメラにアクセスするための API パケージが 2 つあります。新しい android.hardware.camera2 API は、下位レベルのカメラ制御をアプリに公開します。これには、効率的なゼロコピー バースト / ストリーミング フローと、フレームごとの露出、ゲイン、ホワイト バランスゲイン、色変換、ノイズ除去、シャープニングの制御が含まれます。
古い API パッケージ android.hardware.Camera は Android 5.0 で非推奨としてマークされましたが、引き続きアプリで使用できるべきであるため、Android デバイス実装は、このセクションと Android SDK ドキュメントに記載されているように、この API の継続的なサポートを保証しなければなりません。
デバイス実装は、利用可能なカメラすべてについて、カメラ関連の API のために次の動作を実装しなければなりません。
- アプリで android.hardware.Camera.Parameters.setPreviewFormat(int) が一度も呼び出されていない場合、デバイスはアプリのコールバックに提供されるプレビュー データに android.hardware.PixelFormat.YCbCr_420_SP を使用しなければなりません。
- アプリが android.hardware.Camera.PreviewCallback インスタンスを登録し、プレビュー形式が YCbCr_420_SP のときに onPreviewFrame() メソッドを呼び出す場合、onPreviewFrame() に渡される byte[] のデータは NV21 エンコード形式でなければなりません。つまり、NV21 がデフォルトでなければなりません。
- android.hardware.Camera については、デバイス実装は、前面カメラと背面カメラの両方のカメラ プレビュー用に YV12 形式(android.graphics.ImageFormat.YV12 定数で示されます)をサポートしなければなりません(ハードウェア動画エンコーダとカメラは任意のネイティブ ピクセル形式を使用できますが、デバイス実装は YV12 への変換をサポートしなければなりません)。
- android.hardware.camera2 については、デバイス実装は、android.media.ImageReader API を介して、出力として android.hardware.ImageFormat.YUV_420_888 形式と android.hardware.ImageFormat.JPEG 形式をサポートしなければなりません。
デバイス実装は、デバイスにハードウェア オートフォーカスなどの機能があるかどうかにかかわらず、引き続き Android SDK のドキュメント [参考資料、91] に含まれる Camera API を完全に実装しなければなりません。たとえば、オートフォーカスのないカメラは、(オートフォーカスのないカメラには関係がなくとも)登録された android.hardware.Camera.AutoFocusCallback インスタンスを引き続き呼び出さなければなりません。なお、これは前面カメラに適用されます。たとえば、前面カメラはたいていの場合オートフォーカスをサポートしていませんが、それでも前述のように API コールバックを「偽装」しなければなりません。
デバイス実装は、基盤となるハードウェアがこの機能をサポートしている場合、android.hardware.Camera.Parameters クラスの定数として定義された各パラメータ名を認識し、尊重しなければなりません。デバイス ハードウェアが機能をサポートしていない場合、API はドキュメントに記載されているとおりに動作しなければなりません。逆に、デバイス実装は android.hardware.Camera.Parameters で定数として記述されているもの以外の文字列定数が android.hardware.Camera.setParameters() メソッドに渡されても、それを尊重したり認識したりしてはなりません。つまりデバイス実装は、ハードウェアが許すならば標準的なカメラ パラメータをすべてサポートしなければならず、カスタムのカメラ パラメータ タイプをサポートしてはなりません。たとえば、ハイ ダイナミック レンジ(HDR)画像処理手法を使用する画像キャプチャをサポートするデバイス実装は、カメラ パラメータ Camera.SCENE_MODE_HDR [参考資料、92] をサポートしなければなりません。
すべてのデバイス実装が android.hardware.camera2 API のすべての機能を完全にサポートしているわけではないため、デバイス実装は、Android SDK [参考資料、93] に記載されているとおり、android.info.supportedHardwareLevel プロパティで適切なサポートレベルをレポートし、該当するフレームワーク機能フラグ [参考資料、94] をレポートしなければなりません。
また、デバイス実装は、android.request.availableCapabilities プロパティを介して android.hardware.camera2 の個々のカメラ機能を宣言し、該当する機能フラグ [参考資料、94] を宣言しなければなりません。装着されているカメラデバイスのいずれかが機能をサポートしている場合は機能フラグを定義しなければなりません。
デバイス実装は、カメラで新しい画像が撮影され、画像のエントリがメディアストアに追加されたときは常に、Camera.ACTION_NEW_PICTURE インテントをブロードキャストしなければなりません。
デバイス実装は、カメラで新しい動画が録画され、画像のエントリがメディアストアに追加されたときは常に、Camera.ACTION_NEW_VIDEO インテントをブロードキャストしなければなりません。
7.5.5. カメラの向き
前面カメラと背面カメラは(存在する場合)、カメラの長辺が画面の長辺と揃うように向きを調整しなければなりません。つまり、デバイスが横向きで保持されている場合、カメラは横向きで画像をキャプチャしなければなりません。これは、デバイスの自然な向きに関係なく適用されます。つまり、横向き主体のデバイスと、縦向き主体のデバイスに適用されます。
7.6. メモリとストレージ
7.6.1. 最小のメモリとストレージ
Android テレビデバイスには、アプリの個人データに使用できる不揮発性ストレージが少なくとも 5 GB 存在しなければなりません。
デバイス実装のカーネルとユーザー空間に使用できるメモリは、次の表で指定される最小値以上でなければなりません(画面サイズと画面密度の定義については、セクション 7.1.1 をご覧ください)。
密度と画面サイズ | 32 ビットデバイス | 64 ビットデバイス |
---|---|---|
Android スマートウォッチ デバイス(画面が小さいため) | 416 MB | 該当なし |
|
424 MB | 704 MB |
|
512 MB | 832 MB |
|
896 MB | 1280 MB |
|
1344 MB | 1824 MB |
最小メモリ値は、カーネルの制御下にない無線や動画などのハードウェア コンポーネント専用のメモリ空間とは別に設定しなければなりません。
Android スマートウォッチを除き、カーネルとユーザー空間に利用できるメモリが 512 MB 未満のデバイス実装は、ActivityManager.isLowRamDevice() に「true」の値を返さなければなりません。
アプリの個人データに使用できる不揮発性ストレージは、Android テレビデバイスでは少なくとも 5 GB 存在しなければならず、他のデバイス実装では少なくとも 1.5 GB 存在しなければなりません。つまり、/data パーティションは、Android テレビデバイスでは少なくとも 5 GB、他のデバイス実装では少なくとも 1.5 GB でなければなりません。Android を搭載するデバイス実装には、今後のプラットフォーム リリースにアップグレードできるよう、アプリの個人データ用に不揮発性ストレージを 3 GB 以上用意することが極めて強く推奨されます。
Android API には、アプリがデータファイルをダウンロードするために使用しても構わないダウンロード マネージャーが含まれています [参考資料、95]。ダウンロード マネージャーのデバイス実装は、サイズが 100 MB 以上の個々のファイルをデフォルトの「キャッシュ」場所にダウンロードできなければなりません。
7.6.2. アプリ共有ストレージ
デバイス実装は、アプリ用の共有ストレージ(「共有外部ストレージ」とも呼ばれます)を提供しなければなりません。
デバイス実装は、デフォルトでマウントされる共有ストレージをすぐに使えるように構成しなければなりません。共有ストレージが Linux パス /sdcard にマウントされない場合、デバイスは /sdcard から実際のマウント ポイントへの Linux シンボリック リンクを含まなければなりません。
デバイス実装は、セキュア デジタル(SD)カードスロットなど、ユーザーによるアクセスが可能なリムーバブル ストレージのハードウェアを備えていても構いません。デバイス実装がこのスロットを使用して共有ストレージ要件を満たす場合は、以下の要件が適用されます。
- SD カードがないときにユーザーに警告する、トーストまたはポップアップのユーザー インターフェースを実装しなければなりません。
- 1 GB 以上の FAT フォーマット済み SD カードを同梱するか、箱や購入時に入手できるその他の資料に、SD カードを別途購入する必要があることを表示しなければなりません。
- デフォルトで SD カードをマウントしなければなりません。
あるいは、デバイス実装は、アップストリームの Android オープンソース プロジェクトに含まれているように、アプリ用の共有ストレージとして内部(非リムーバブル)ストレージを割り当てても構いません。デバイス実装は、この構成とソフトウェア実装を使用するべきです。デバイス実装が共有ストレージ要件を満たすために内部(非リムーバブル)ストレージを使用する場合、そのストレージはアプリの個人データとスペースを共有しても構いませんが、少なくとも 1 GB のサイズを持ち、/sdcard にマウントされなければなりません(別の場所にマウントされる場合は、/sdcard がその物理的ロケーションへのシンボリック リンクでなければなりません)。
デバイス実装は、この共有ストレージに対する android.permission.WRITE_EXTERNAL_STORAGE 権限を、ドキュメントに記載されているとおりに適用しなければなりません。そうしない場合、共有ストレージは、その権限を取得するすべてのアプリから書き込み可能でなければなりません。
複数の共有ストレージパス(SD カードスロットと共有内部ストレージの両方など)を含むデバイス実装は、WRITE_EXTERNAL_STORAGE 権限を持つプリインストール済みの特権 Android アプリのみに、セカンダリ外部ストレージへの書き込みを許可しなければなりません。ただし、パッケージ固有のディレクトリに書き込む場合または ACTION_OPEN_DOCUMENT_TREE
インテントの呼び出しによって返される URI
内に書き込む場合は除きます。
ただし、デバイス実装は、Android のメディア スキャナ サービスと android.provider.MediaStore を通じて、両方のストレージパスからのコンテンツを透過的に公開すべきです。
使用する共有ストレージの形態に関係なく、デバイス実装に USB ペリフェラル モードをサポートする USB ポートがある場合、ホスト コンピュータから共有ストレージの内容にアクセスするメカニズムを提供しなければなりません。デバイス実装は USB マスストレージを使用しても構いませんが、メディア転送プロトコルを使用してこの要件を満たすべきです。デバイス実装がメディア転送プロトコルをサポートする場合は、以下の要件が適用されます。
- リファレンス Android MTP ホストである Android File Transfer [参考資料、96] と互換性を持つべきです。
- USB デバイスクラス 0x00 をレポートすべきです。
- USB インターフェース名「MTP」をレポートすべきです。
7.7. USB
デバイス実装は、USB ペリフェラル モードをサポートすべきであり、USB ホストモードをサポートすべきです。
ペリフェラル モードをサポートする USB ポートを備えたデバイス実装には、以下の要件が適用されます。
- ポートは、標準の Type-A または Type-C の USB ポートを持つ USB ホストに接続可能でなければなりません。
- ポートは、Micro-B、Micro-AB、または Type-C の USB フォーム ファクタを使用するべきです。既存と新規の Android デバイスは、今後のプラットフォーム リリースにアップグレードできるよう、これらの要件を満たすことが強く推奨されます。
- ポートは、デバイスのポートが下向きのときディスプレイが正しく描画されるように、(自然な向きに合わせて)デバイスの底部に配置するか、すべてのアプリ(ホーム画面を含む)でソフトウェアの画面回転を可能にすべきです。既存と新規の Android デバイスは、今後のプラットフォーム リリースにアップグレードできるよう、これらの要件を満たすことが強く推奨されます。
- Android SDK ドキュメントに記載されているように、Android Open Accessory(AOA)の API と仕様を実装するべきであり、Android ハンドヘルド デバイスの場合は AOA API を実装しなければなりません。AOA 仕様を実装するデバイス実装は:
- USB Battery Charging Specification, Revision 1.2 [参考資料、99] で規定されているとおり、HS チャープ、トラフィックの際に 1.5 A の電流を流すためのサポートを実装すべきです。既存と新規の Android デバイスは、今後のプラットフォーム リリースにアップグレードできるよう、これらの要件を満たすことが強く推奨されます。
- USB 標準デバイス記述子の iSerialNumber の値は、android.os.Build.SERIAL の値と等しくなければなりません。
ホストモードをサポートする USB ポートを備えたデバイス実装には、以下の要件が適用されます。
- デバイス実装が USB 3.1 をサポートしていれば、Type-C の USB ポートを使用すべきです。
- 標準以外のポート フォーム ファクタを使用しても構いませんが、使用する場合は、ポートを標準の Type-A または Type-C の USB ポートに適合させるケーブルを同梱しなければなりません。
- Micro-AB USB ポートを使用しても構いませんが、使用する場合は、標準の Type-A または Type-C の USB ポートに適合させるケーブルを同梱すべきです。
- Android SDK ドキュメント [参考資料、98] に記載されているとおり、USB オーディオ クラスを実装することが極めて強く推奨されます。
- Android SDK に記載されているとおり Android USB ホスト API を実装しなければならず、ハードウェア機能 android.hardware.usb.host のサポートを宣言しなければなりません [参考資料、100]。
- USB Battery Charging Specification, Revision 1.2 [参考資料、99] で規定されているとおり、充電ダウンストリーム ポートの出力電流範囲 1.5 A~5 A をサポートすべきです。
7.8. オーディオ
7.8.1. マイク
Android ハンドヘルド実装、Android スマートウォッチ実装、Android Automotive 実装は、マイクを含まなければなりません。
デバイス実装は、マイクを省略しても構いません。ただし、デバイス実装でマイクを省略する場合、デバイス実装は、android.hardware.microphone 機能定数をレポートしてはならず、セクション 7 のとおり、音声録音 API を NoOps として実装しなければなりません。それとは逆に、マイクを備えたデバイス実装は:
- android.hardware.microphone 機能定数をレポートしなければなりません
- セクション 5.4 の、録音の要件を満たさなければなりません
- セクション 5.6 の、オーディオ レイテンシの要件を満たさなければなりません
7.8.2. オーディオ出力
Android スマートウォッチ デバイスは、オーディオ出力を含んでも構いません。
スピーカーを含むか、ヘッドセットまたは外部スピーカーとしてのオーディオ出力周辺機器用のオーディオ / マルチメディア出力ポートを備えているデバイス実装には、以下の要件が適用されます。
- android.hardware.audio.output 機能定数をレポートしなければなりません。
- セクション 5.5 の、オーディオの再生の要件を満たさなければなりません。
- セクション 5.6 の、オーディオ レイテンシの要件を満たさなければなりません。
逆に、デバイス実装にスピーカーまたはオーディオ出力ポートが含まれない場合、デバイス実装は android.hardware.audio 出力機能をレポートしてはならず、少なくともオーディオ出力関連の API を NoOps として実装しなければなりません。
Android スマートウォッチ デバイス実装はオーディオ出力を備えても構いませんが、備えるべきではありません。その他のタイプの Android デバイス実装はオーディオ出力を備えるとともに、android.hardware.audio.output を宣言しなければなりません。
7.8.2.1. アナログ オーディオ ポート
Android エコシステム全体で、3.5 mm オーディオ プラグを使用するヘッドセットやその他のオーディオ アクセサリ [参考資料、101] との互換性を持たせるために、デバイス実装に 1 つ以上のアナログ オーディオ ポートが含まれる場合、オーディオ ポートのうち少なくとも 1 つが、4 極 3.5 mm オーディオ ジャックであるべきです。4 極 3.5 mm オーディオ ジャックが含まれる場合、デバイス実装は:
- ステレオ ヘッドフォンと、マイク付きステレオ ヘッドセットへのオーディオ再生をサポートしなければならず、マイク付きステレオ ヘッドセットからの録音をサポートするべきです。
- CTIA ピン配列の TRRS オーディオ プラグをサポートしなければならず、OMTP ピン配列のオーディオ プラグをサポートするべきです。
- デバイス実装がマイクをサポートしている場合は、接続したオーディオ アクセサリのマイクの検出をサポートしなければならず、エクストラ値 microphone を 1 に設定して android.intent.action.HEADSET_PLUG をブロードキャストしなければなりません。
- オーディオ プラグのマイク極と接地極の間で、次に示す 3 つの等価インピーダンス範囲について、検出とキーコードへのマッピングをサポートするべきです。
- 70 オーム以下: KEYCODE_HEADSETHOOK
- 210~290 オーム: KEYCODE_VOLUME_UP
- 360~680 オーム: KEYCODE_VOLUME_DOWN
- オーディオ プラグのマイク極と接地極の間で、次に示す等価インピーダンス範囲について、検出とキーコードへのマッピングをサポートするべきです。
- 110~180 オーム: KEYCODE_VOICE_ASSIST
- プラグ挿入時、ACTION_HEADSET_PLUG をトリガーしなければなりません(ただしプラグのすべての接点がジャックの該当セグメントに接した後に限ります)。
- スピーカー インピーダンス 32 オームで、少なくとも 150 mV +/- 10% の出力電圧で動作できなければなりません。
- マイクのバイアス電圧が 1.8 V~2.9 V でなければなりません。
8. パフォーマンスの互換性
パフォーマンスに関する最低基準は、ユーザー エクスペリエンスにとって重要であり、アプリの開発時にデベロッパーが設定するであろうベースラインの前提条件に影響を与えます。Android スマートウォッチ デバイスは、以下の基準を満たすべきであり、その他のタイプのデバイス実装は以下の基準を満たさなければなりません。
8.1. ユーザー エクスペリエンスの一貫性
デバイス実装は、アプリとゲームでフレームレートと応答時間の一貫性を確保することで、スムーズなユーザー インターフェースを提供しなければなりません。デバイス実装は次の要件を満たさなければなりません。
- 一貫性のあるフレーム レイテンシ。一貫性のないフレーム レイテンシ、またはフレームのレンダリングの遅延は、1 秒間に 5 フレームを超えて発生してはならず、1 秒間に 1 フレーム未満であるべきです。
- ユーザー インターフェースのレイテンシ。デバイス実装は、Android 互換性テストスイート(CTS)で定義された 10,000 リストエントリのリストを 36 秒未満でスクロールすることで、低レイテンシのユーザー エクスペリエンスを実現しなければなりません。
- タスク切り替え。複数のアプリが起動されている場合、起動後に実行中のアプリを再起動するまでにかかる時間は 1 秒未満でなければなりません。
8.2. ファイル I/O アクセスのパフォーマンス
デバイス実装は、読み取りと書き込みのオペレーションについて、内部ストレージのファイル アクセス パフォーマンスの一貫性を確保しなければなりません。
- シーケンシャル書き込み。デバイス実装は、256 MB のファイルに対し、10 MB の書き込みバッファを使用して少なくとも 5 MB/s のシーケンシャル書き込みパフォーマンスを保証しなければなりません。
- ランダム書き込み。デバイス実装は、256 MB のファイルに対し、4 KB の書き込みバッファを使用して少なくとも 0.5 MB/s のランダム書き込みパフォーマンスを保証しなければなりません。
- シーケンシャル読み取り。デバイス実装は、256 MB のファイルに対し、10 MB の書き込みバッファを使用して少なくとも 15 MB/s のシーケンシャル読み取りパフォーマンスを保証しなければなりません。
- ランダム読み取り。デバイス実装は、256 MB のファイルに対し、4 KB の書き込みバッファを使用して少なくとも 3.5 MB/s のランダム読み取りパフォーマンスを保証しなければなりません。
9. セキュリティ モデルの互換性
デバイス実装は、Android デベロッパー向けドキュメントに含まれる API のセキュリティと権限に関するリファレンス ドキュメント [参考資料、102] で規定されているとおり、Android プラットフォームのセキュリティ モデルと整合するセキュリティ モデルを実装しなければなりません。デバイス実装は、サードパーティ / 認証局からの追加の許可 / 証明書を必要とせずに、自己署名アプリのインストールをサポートしなければなりません。具体的には、互換性のあるデバイスは、以降のサブセクションに記載されているセキュリティ メカニズムをサポートしなければなりません。
9.1. 権限
デバイス実装は、Android デベロッパー向けドキュメント [参考資料、102] で規定されているとおり、Android 権限モデルをサポートしなければなりません。具体的には、実装は SDK ドキュメントで規定されている各権限を適用しなければならず、どの権限も省略、変更、無視することはできません。実装は、新しい権限 ID 文字列が android.* 名前空間にない場合、権限を追加しても構いません。
9.2. UID とプロセスの分離
デバイス実装は、各アプリが一意の Unix 形式の UID として個別のプロセスで動作する、Android アプリ サンドボックス モデルをサポートしなければなりません。デバイス実装は、セキュリティと権限に関するリファレンス [参考資料、102] で規定されているようにアプリが適切に署名されて構築されている場合は、同じ Linux ユーザー ID での複数アプリの実行をサポートしなければなりません。
9.3. ファイルシステムの権限
デバイス実装は、セキュリティと権限に関するリファレンス [参考資料、102] で規定されているとおり、Android ファイル アクセス権限モデルをサポートしなければなりません。
9.4. 代替実行環境
デバイス実装は、Dalvik 実行ファイル形式またはネイティブ コード以外のソフトウェアまたはテクノロジーを使用してアプリを実行するランタイム環境を含んでも構いません。ただし、このセクションで説明しているように、そのような代替実行環境は、Android セキュリティ モデル、またはインストール済みの Android アプリのセキュリティを侵害してはなりません。
代替ランタイムは、それ自体が Android アプリでなければならず、セクション 9 の他の部分に記載されているとおり、標準の Android セキュリティ モデルに準拠しければなりません。
代替ランタイムには、<uses-permission> メカニズムを介して、ランタイムの AndroidManifest.xml ファイルでリクエストされていない権限によって保護されたリソースへのアクセス権を付与してはなりません。
代替ランタイムは、システムアプリに制限された Android 権限によって保護された機能の利用を、アプリに許可してはなりません。
代替ランタイムは、Android サンドボックス モデルに準拠しなければなりません。具体的には、代替ランタイムには以下の要件が適用されます。
- PackageManager を介してアプリを個別の Android サンドボックス(Linux ユーザー ID など)にインストールすべきです。
- 代替ランタイムを使用するすべてのアプリで共有される単一の Android サンドボックスを提供しても構いません。
- 代替ランタイムを使用するインストール済みのアプリは、共有ユーザー ID と署名証明書の標準的な Android メカニズムを使用する場合を除き、デバイスにインストールされている他のアプリのサンドボックスを再利用してはなりません。
- 他の Android アプリに対応するサンドボックスで起動されてはならず、そのサンドボックスへのアクセス権を付与したり、付与されたりしてはなりません。
- スーパーユーザー(root)または他のユーザー ID の特権で起動されてはならず、その特権を付与される、または付与することを回避しなければなりません。
代替ランタイムの .apk ファイルは、デバイス実装のシステム イメージに含まれていても構いませんが、デバイス実装に含まれる他のアプリの署名に使用される鍵とは異なる鍵で署名されなければなりません。
アプリをインストールする際、代替ランタイムは、アプリが使用する Android の権限についてユーザーの同意を得なければなりません。アプリが、対応する Android の権限があるデバイス リソース(カメラ、GPS など)を利用する必要がある場合、代替ランタイムは、アプリがそのリソースにアクセスできることをユーザーに通知しなければなりません。ランタイム環境がこの方法でアプリの機能を記録しない場合、ランタイム環境は、そのランタイムを使用してアプリをインストールするときに、そのランタイムが持つすべての権限をリストしなければなりません。
9.5. マルチユーザー サポート
この機能は、すべてのデバイスタイプで任意です。
Android は、複数のユーザーをサポートし、ユーザーの完全な分離をサポートします [参考資料、103]。デバイス実装は複数のユーザーを有効にしても構いませんが、有効にしたときはマルチユーザー サポート [参考資料、104] に関連する以下の要件を満たさなければなりません。
- android.hardware.telephony 機能フラグを宣言しないデバイス実装は、制限付きプロファイル(追加ユーザーと、そのユーザーがデバイス上でできることを、デバイス所有者が管理できるようにする機能)をサポートしなければなりません。制限付きプロファイルにより、デバイス所有者は、追加のユーザーが使用する個別の環境をすばやく設定でき、その環境で利用できるアプリの制限をきめ細かく管理できます。
- 逆に、android.hardware.telephony 機能フラグを宣言するデバイス実装は、制限付きプロファイルをサポートしてはなりませんが、他のユーザーによる音声通話と SMS へのアクセスを有効または無効にするコントロールの AOSP 実装に合わせなければなりません。
- デバイス実装は、ユーザーごとに、API のセキュリティと権限に関するリファレンス ドキュメント [参考資料、102] で規定されているとおり、Android プラットフォームのセキュリティ モデルに合致するセキュリティ モデルを実装しなければなりません。
- デバイス実装は、android.app.admin.DevicePolicyManager API を介したユーザーと管理対象プロファイルの作成をサポートしても構いません。また、サポートされている場合は、プラットフォーム機能フラグ android.software.managed_users を宣言しなければなりません。
- 機能フラグ android.software.managed_users を宣言するデバイス実装は、アップストリームの AOSP アイコンバッジを使用して、管理対象アプリや、履歴と通知のような他のバッジ UI 要素を表さなければなりません。
- Android デバイス上のユーザー インスタンスごとに、個別の分離された外部ストレージ ディレクトリが存在しなければなりません。デバイス実装は、複数のユーザーのデータを同じボリュームまたはファイルシステムに保存しても構いません。ただし、デバイス実装は、特定のユーザーが所有し、そのユーザーに代わって実行されるアプリが、他のユーザーが所有するデータを一覧表示 / 読み取り / 書き込みできないようにしなければなりません。なお、SD カードスロットなどのリムーバブル メディアを使用する場合は、あるユーザーがホスト PC を使用して別のユーザーのデータにアクセスできます。そのため、プライマリ外部ストレージ API 用にリムーバブル メディアを使用するデバイス実装は、システムのみがアクセスできる非リムーバブル メディアにのみ保存されるキーを使用してマルチユーザーを有効にする場合、SD カードの内容を暗号化しなければなりません。これにより、ホスト PC でメディアを読み取れなくなるため、デバイス実装は、MTP または同様のシステムに切り替えて、ホスト PC から現在のユーザーのデータにアクセスできるようにする必要があります。したがって、デバイス実装は、プライマリ外部ストレージにリムーバブル メディア [参考資料、105] を使用する場合、マルチユーザーを有効にしても構いませんが、有効にすべきではありません。
9.6. プレミアム SMS の警告
Android は、プレミアム SMS メッセージ [参考資料、106] の送信についてユーザーに警告することをサポートしています。プレミアム SMS メッセージとは、携帯通信会社に登録されたサービスに送信されるテキスト メッセージのことであり、ユーザーに課金される可能性があります。android.hardware.telephony のサポートを宣言するデバイス実装は、デバイスの /data/misc/sms/codes.xml ファイルで定義された正規表現で識別される番号に SMS メッセージを送信する前に、ユーザーに警告しなければなりません。アップストリームの Android オープンソース プロジェクトは、この要件を満たす実装を提供しています。
9.7. カーネル セキュリティ機能
Android サンドボックスには、Security-Enhanced Linux(SELinux)の強制アクセス制御(MAC)システムを使用できる機能や Linux カーネルのその他のセキュリティ機能が含まれています。SELinux などのセキュリティ機能(Android フレームワークの下に実装されている場合)は:
- 既存のアプリとの互換性を維持しなければなりません。
- セキュリティ違反が検出されて正常にブロックされたときはユーザー インターフェースを表示してはなりませんが、ブロックされないセキュリティ違反が発生して悪用されたときはユーザー インターフェースを表示しても構いません。
- ユーザーまたはデベロッパーが構成できるようにするべきではありません。
ポリシーを構成するための API が、別のアプリに影響する可能性のあるアプリ(Device Administration API など)に公開されている場合、API は互換性を破る構成を許可してはなりません。
デバイスは、SELinux を実装するか、Linux 以外のカーネルを使用する場合は同等の強制アクセス制御システムを実装しなければならず、以下の要件を満たさなければなりません(アップストリームの Android オープンソース プロジェクトのリファレンス実装は、これらの要件を満たしています)。
デバイス実装は:
- ドメインごとの SELinux モードの設定を許可する SELinux ポリシーをサポートしなければならず、すべてのドメインを enforcing モードで構成しなければなりません。デバイス / ベンダー固有のドメインを含め、permissive モードのドメインは許可されません。
- デバイスの /sepolicy ファイルからポリシーを読み込むべきです。
- アップストリームの Android オープンソース プロジェクト(AOSP)で提供されている sepolicy ファイル内に存在する neverallow ルールの変更、省略、または置き換えを行ってはなりません。また、ポリシーは、AOSP SELinux ドメインとデバイス / ベンダー固有のドメインの両方について、neverallow がすべて存在する状態でコンパイルしなければなりません。
- システム イメージの更新を求めずに SELinux ポリシー ファイルの動的更新を行うことをサポートしなければなりません。
デバイス実装は、SELinux ポリシーへの追加を最初に監査するまで、アップストリームの Android オープンソース プロジェクトで提供されるデフォルトの SELinux ポリシーを保持すべきです。デバイス実装は、アップストリームの Android オープンソース プロジェクトと互換性がなければなりません。
9.8. プライバシー
画面に表示されたコンテンツをキャプチャする機能や、デバイスで再生されている音声ストリームを録音する機能をデバイスがシステムに実装している場合、この機能が有効になっていてアクティブにキャプチャや録音を行っているときは常に、ユーザーに通知しなければなりません。
デバイス実装に、デフォルトでプロキシ サーバーまたは VPN ゲートウェイ経由でネットワーク データ トラフィックをルーティングするメカニズムがある場合(例: android.permission.CONTROL_VPN が付与された VPN サービスのプリロード)、デバイス実装はそのメカニズムを有効にする前にユーザーの同意を得なければなりません。
9.9. フルディスク暗号化
ロック画面のない Android デバイス実装では任意です。
デバイス実装が PIN(数字)またはパスワード(英数字)によるロック画面をサポートしている場合、デバイスは、アプリの個人データ(/data パーティション)のフルディスク暗号化をサポートしなければならず、永続的で取り外し不可能である場合は、SD カード パーティションのフルディスク暗号化もサポートしなければなりません [参考資料、107]。フルディスク暗号化をサポートするデバイスの場合、ユーザーが開封時の初期設定を完了した時点で常にフルディスク暗号化を有効にすべきです。この要件は、このバージョンの Android プラットフォームでは「すべきである」と記載されていますが、Android の今後のバージョンでは「しなければならない」に変更されることが予想されるため、極めて強く推奨されます。暗号化では、128 ビット以上の鍵の AES と、ストレージ用に設計されたモード(AES-XTS、AES-CBC-ESSIV など)を使用しなければなりません。いかなるときも暗号鍵を暗号化せずにストレージに書き込んではなりません。アクティブに使用されている場合を除き、暗号鍵は、低速ストレッチング アルゴリズム(PBKDF2 や scrypt など)でストレッチングされたロック画面のパスコードで AES 暗号化すべきです。ユーザーがロック画面パスコードを指定していない場合、または暗号化でパスコードを使用することを無効にしている場合、システムはデフォルトのパスコードを使用して暗号鍵をラップすべきです。デバイスがハードウェア格納型キーストアを提供する場合は、パスワード ストレッチング アルゴリズムを、そのキーストアに暗号によってバインドしなければなりません。暗号鍵をデバイスの外部に送信してはなりません(ユーザーのパスコードおよび / またはハードウェアにバインドされた鍵でラップされている場合も同様です)。アップストリームの Android オープンソース プロジェクトは、Linux カーネル機能 dm-crypt に基づいて、この機能の優先実装を提供しています。
9.10. 確認付きブート
確認付きブートは、デバイス ソフトウェアの完全性を保証する機能です。この機能をサポートする場合、デバイス実装は:
- プラットフォーム機能フラグ android.software.verified_boot を宣言しなければなりません。
- ブート シーケンスごとに確認を実施しなければなりません。
- ルート オブ トラストであるハードウェア キーから開始してシステム パーティションに至るまで、確認しなければなりません。
- 確認の各ステージを実装して、次のステージのバイトすべての完全性と正真性をチェックしてから、次のステージのコードを実行しなければなりません。
- ハッシュ アルゴリズム(SHA-256)と公開鍵サイズ(RSA-2048)について、NIST による現在の推奨事項と同程度強力な検証アルゴリズムを使用しなければなりません。
デバイス実装は、デバイスの完全性のために確認付きブートをサポートすべきです。このバージョンの Android プラットフォームでは「すべきである」要件ですが、今後のバージョンの Android で「しなければならない」要件に変更する予定であるため、これは強く推奨されます。アップストリームの Android オープンソース プロジェクトは、Linux カーネル機能 dm-verity に基づいて、この機能の優先実装を提供しています。
10. ソフトウェア互換性テスト
デバイス実装は、このセクションに記載されているすべてのテストに合格しなければなりません。
しかし、完全に包括的なソフトウェア テスト パッケージというものはありません。このため、デバイス実装者は、Android オープンソース プロジェクトから入手できる Android のリファレンス実装と優先実装に対して行う変更を可能な限り最小限に抑えることが極めて強く推奨されます。これにより、互換性の問題をもたらすバグが導入され、再作業やデバイスのアップデートが必要となるリスクを最小限に抑えることができます。
10.1. 互換性テストスイート
デバイス実装は、デバイスの最終出荷ソフトウェアを使用して、Android オープンソース プロジェクトから入手可能な Android 互換性テストスイート(CTS)[参考資料、108] に合格しなければなりません。さらに、デバイス実装者は可能な限り Android オープンソース ツリーのリファレンス実装を使用すべきであり、CTS で不明確な点があった場合やリファレンス ソースコードの一部を再実装する場合に互換性を確保しなければなりません。
CTS は、実際のデバイスで実行するように設計されています。他のソフトウェアと同様に、CTS 自体にもバグが含まれている可能性があります。CTS はこの互換性定義とは別にバージョニングされ、Android 5.1 用に CTS の複数のリビジョンがリリースされる可能性があります。デバイス実装は、デバイス ソフトウェアが完成した時点で利用可能な最新バージョンの CTS に合格しなければなりません。
10.2. CTS 検証ツール
デバイス実装は、CTS 検証ツールで該当するすべてのケースを正しく実行しなければなりません。CTS 検証ツールは互換性テストスイートに含まれています。これは、カメラとセンサーの正しい動作など、自動システムではテストできない機能をテストするために人間のオペレーターが実行するツールです。
CTS 検証ツールには、オプションのハードウェアを含め、さまざまな種類のハードウェア用のテストがあります。デバイス実装は、搭載しているハードウェア用のすべてのテストに合格しなければなりません。たとえば、デバイスに加速度計が搭載されている場合は、CTS 検証ツールで加速度計のテストケースが正しく実行されなければなりません。この互換性定義ドキュメントで任意とされている機能のテストケースは、スキップまたは省略しても構いません。
前述のとおり、すべてのデバイスとすべてのビルドで、CTS 検証ツールが正しく実行されなければなりません。ただし、ビルドの多くはよく似ているため、デバイス実装者は、わずかな違いしかないビルドで CTS 検証ツールを明示的に実行することは求められていません。具体的には、CTS 検証ツールに合格した実装との違いが、含まれるロケール、ブランディングなどのセットのみであるデバイス実装は、CTS 検証ツールのテストを省略しても構いません。
11. アップデート可能なソフトウェア
デバイス実装は、システム ソフトウェア全体を置き換えるメカニズムを含まなければなりません。このメカニズムは、「ライブ」アップグレードを実施する必要はありません。つまり、デバイスの再起動が必要となっても構いません。
デバイスにプリインストールされているソフトウェア全体を置き換えることができるのであれば、どの方法でも使用できます。たとえば、次のどの方法も、この要件を満たします。
- 再起動によるオフライン アップデートを伴う「無線(OTA)」ダウンロード。
- ホスト PC から USB 経由での「テザー」アップデート。
- 再起動による「オフライン」アップデートとリムーバブル ストレージ上のファイルからのアップデート。
ただし、デバイス実装に 802.11 や Bluetooth PAN(パーソナル エリア ネットワーク)プロファイルなど、定額制データ接続のサポートが含まれる場合は、以下の要件が適用されます。
- Android Automotive 実装は、再起動によるオフライン アップデートを伴う OTA ダウンロードをサポートすべきです。
- 他のすべてのデバイス実装は、再起動によるオフライン アップデートを伴う OTA ダウンロードをサポートしなければなりません。
使用するアップデート メカニズムは、ユーザーデータをワイプせずにアップデートをサポートしなければなりません。つまりアップデート メカニズムは、アプリの個人データとアプリの共有データを保持しなければなりません。なお、アップストリームの Android ソフトウェアには、この要件を満たすアップデート メカニズムが含まれています。
Android 5.1 以降を搭載してリリースされるデバイス実装の場合、アップデート メカニズムは、システム イメージが OTA の後に想定される結果とバイナリ同一であることの検証をサポートすべきです。Android 5.1 から追加された、アップストリームの Android オープンソース プロジェクトのブロックベース OTA 実装は、この要件を満たしています。
リリース後に、ただし妥当な製品寿命の期間内にデバイス実装でエラーが見つかり、Android 互換性チームとの協議において、サードパーティ アプリの互換性に影響を与えると判断された場合、デバイス実装者は前述のメカニズムによって適用できる、利用可能なソフトウェア アップデートを介してエラーを修正しなければなりません。
12. ドキュメントの変更履歴
次の表に、このリリースでの互換性定義に対する変更の概要を示します。
セクション | 変更の概要 |
---|---|
2. デバイスタイプ | Android Automotive 実装の定義を追加しました。 |
2.1 デバイス構成 | Android Automotive 実装用の列を追加しました。 |
3.3.2. 32 ビット ARM ネイティブ コードの互換性 | 新しいセクションを追加しました。 |
3.4.1. WebView の互換性 | アップストリーム実装の変更に対応するため、WebView のユーザー エージェント文字列の要件を更新しました。 |
3.4.2. ブラウザの互換性 | ブラウザアプリを省略してもかまわない別のケースとして、Android Automotive 実装を追加しました。 |
3.7. ランタイムの互換性 | 小さい画面に必要なランタイム ヒープサイズを更新し、新しい dpi バケット(280dpi)の要件を追加しました。 |
3.8.3. 通知 | Android スマートウォッチ実装、テレビ実装、Automotive 実装の通知要件を明確にしました。 |
3.8.8. アクティビティの切り替え | 概要タイトル数の要件を緩和しました。 |
3.8.10. ロック画面のメディア コントロール | Android スマートウォッチ実装と Automotive 実装の要件を明確にしました。 |
3.8.13. Unicode とフォント | 絵文字の入力方法の要件を緩和しました。 |
3.9. デバイス管理 | デバイス管理ポリシーをすべてサポートする必要がある場合の条件を明確にしました。 |
3.10. ユーザー補助 | Android Automotive の要件を追加しました。 |
3.11. テキスト読み上げ | Android Automotive の要件を追加しました。 |
5.1. メディア コーデック | CamcorderProfile でレポートされるコーデックのデコードのサポートを必須にしました。 |
5.1.3 動画コーデック | Android Automotive の要件を追加しました。 |
5.4. 録音 | 「しなければならない」要件が「必須」として読まれるようにするために、セクション冒頭の文言を明確にしました。 |
7.1.1.3. 画面密度 | 新しい画面 dpi(280dpi)を追加しました。 |
7.1.5. レガシーアプリの互換モード | Android Automotive の要件を追加しました。 |
7.2 入力デバイス | 一般的な導入文を追加しました。 |
7.2.1. キーボード | Android Automotive の要件を追加しました。 |
7.2.3. ナビゲーション キー | Android Automotive の要件を追加しました。 |
7.3.1. 加速度計 | Android スマートウォッチでのレポート頻度に関する要件を緩和しました。 |
7.3.4. ジャイロスコープ | Android スマートウォッチでのレポート頻度に関する要件を緩和しました。 |
7.4.3 Bluetooth | Android Automotive の要件を追加しました。 |
7.4.4. 近距離無線通信 | ホストカード エミュレーションが必要な場合の条件を明確にしました。 |
7.6.1. 最小のメモリとストレージ | 画面解像度が低いデバイスの最小メモリ要件を更新し、ハードリミット要件 isLowRamDevice() を追加しました。 |
7.6.2. アプリ共有ストレージ | ホストマシン アクセスのサポートが必須となる場合の要件を更新しました。 |
7.7 USB | USB セクションの誤字を修正しました。 |
7.6.2. アプリ共有ストレージ | プリインストールのシステムアプリがセカンダリ外部ストレージに書き込むことができるという要件を更新しました。 |
7.6.2. アプリ共有ストレージ | アプリで ACTION_OPEN_DOCUMENT_TREE を使用してセカンダリ外部ストレージに書き込めるようになりました。 |
7.6.2. アプリ共有ストレージ | /sdcard が /data とストレージを共有できることを明確にしました。 |
7.7 USB | UMS / MTP の余分な要件を 7.7 から削除しました。 |
7.8.1. マイク | Android Automotive の要件を追加しました。 |
8.2. ファイル I/O アクセスのパフォーマンス | 要件を明確にしました。 |
9.5. マルチユーザー サポート | SD カードの暗号化がプライマリ外部ストレージで必須になりました。 |
9.8. プライバシー | プリロードされた VPN のプライバシー要件を追加しました。 |
9.9. フルディスク暗号化 | フルディスク暗号化のサポートが必須となる場合の条件を明確にしました。 |
9.10. 確認付きブート | 確認付きブートの定義を明確にしました。 |
11. アップデート可能なソフトウェア | Android Automotive 実装では OTA ダウンロードの要件は許容されるが必須ではないことを明確にしました。 |
13. お問い合わせ
android-compatibility フォーラム [参考資料、109] に参加すると、解説を求めたり、このドキュメントがカバーしていないと思われる問題を提起したりできます。
14. 参考資料
1. IETF RFC2119 要件レベル: http://www.ietf.org/rfc/rfc2119.txt
2. Android オープンソース プロジェクト: http://source.android.com/
3. Android テレビの機能: http://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_LEANBACK
4. Android スマートウォッチの機能: http://developer.android.com/reference/android/content/res/Configuration.html#UI_MODE_TYPE_WATCH
5. API の定義とドキュメント: http://developer.android.com/reference/packages.html
6. Android の権限のリファレンス: http://developer.android.com/reference/android/Manifest.permission.html
7. android.os.Build のリファレンス: http://developer.android.com/reference/android/os/Build.html
8. Android 5.1 で許可されているバージョン文字列: http://source.android.com/compatibility/5.1/versions.html
9. テレフォニー プロバイダ: http://developer.android.com/reference/android/provider/Telephony.html
10. ホストベースのカード エミュレーション: http://developer.android.com/guide/topics/connectivity/nfc/hce.html
11. Android 拡張機能パック: http://developer.android.com/guide/topics/graphics/opengl.html#aep
12. android.webkit.WebView クラス: http://developer.android.com/reference/android/webkit/WebView.html
13. WebView の互換性: http://www.chromium.org/
14. HTML5: http://html.spec.whatwg.org/multipage/
15. HTML5 のオフライン機能: http://dev.w3.org/html5/spec/Overview.html#offline
16. HTML5 の video タグ: http://dev.w3.org/html5/spec/Overview.html#video
17. HTML5/W3C の位置情報 API: http://www.w3.org/TR/geolocation-API/
18. HTML5/W3C のウェブストレージ API: http://www.w3.org/TR/webstorage/
19. HTML5/W3C の IndexedDB API: http://www.w3.org/TR/IndexedDB/
20. Dalvik 実行可能ファイルの形式とバイトコードの仕様: Android ソースコードの dalvik/docs で利用可能
21. アプリ ウィジェット: http://developer.android.com/guide/practices/ui_guidelines/widget_design.html
22. 通知: http://developer.android.com/guide/topics/ui/notifiers/notifications.html
23. アプリのリソース: https://developer.android.com/guide/topics/resources/available-resources.html
24. ステータスバー アイコンのスタイルガイド: http://developer.android.com/design/style/iconography.html
25. 通知のリソース: https://developer.android.com/design/patterns/notifications.html
26. 検索マネージャー: http://developer.android.com/reference/android/app/SearchManager.html
27. トースト: http://developer.android.com/reference/android/widget/Toast.html
28. テーマ: http://developer.android.com/guide/topics/ui/themes.html
29. R.style クラス: http://developer.android.com/reference/android/R.style.html
30. マテリアル デザイン: http://developer.android.com/reference/android/R.style.html#Theme_Material
31. ライブ壁紙: http://developer.android.com/reference/android/service/wallpaper/WallpaperService.html
32. 概要画面のリソース: http://developer.android.com/guide/components/recents.html
33. 画面固定: https://developer.android.com/about/versions/android-5.0.html#ScreenPinning
34. 入力方法: http://developer.android.com/guide/topics/text/creating-input-method.html
35. メディア通知: https://developer.android.com/reference/android/app/Notification.MediaStyle.html
36. Dreams: http://developer.android.com/reference/android/service/dreams/DreamService.html
37. Settings.Secure LOCATION_MODE:
http://developer.android.com/reference/android/provider/Settings.Secure.html#LOCATION_MODE
38. Unicode 6.1.0: http://www.unicode.org/versions/Unicode6.1.0/
39. Android デバイス管理: http://developer.android.com/guide/topics/admin/device-admin.html
40. DevicePolicyManager リファレンス: http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html
41. Android デバイス所有者アプリ:
42. Android のユーザー補助サービス API: http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html
43. Android のユーザー補助 API: http://developer.android.com/reference/android/view/accessibility/package-summary.html
44. Eyes Free プロジェクト: http://code.google.com/p/eyes-free
45. テキスト読み上げ API: http://developer.android.com/reference/android/speech/tts/package-summary.html
46. テレビ入力フレームワーク: /devices/tv/index.html
47. リファレンス ツールのドキュメント(adb、aapt、ddms、systrace): http://developer.android.com/tools/help/index.html
48. Android apk ファイルの説明: http://developer.android.com/guide/components/fundamentals.html
49. マニフェスト ファイル: http://developer.android.com/guide/topics/manifest/manifest-intro.html
50. Android のメディア形式: http://developer.android.com/guide/appendix/media-formats.html
51. RTC ハードウェア コーディングの要件: http://www.webmproject.org/hardware/rtc-coding-requirements/
52. AudioEffect API: http://developer.android.com/reference/android/media/audiofx/AudioEffect.html
53. Android の android.content.pm.PackageManager クラスとハードウェア機能のリスト:
http://developer.android.com/reference/android/content/pm/PackageManager.html
54. HTTP Live Streaming のドラフト プロトコル: http://tools.ietf.org/html/draft-pantos-http-live-streaming-03
55. ADB: http://developer.android.com/tools/help/adb.html
56. dumpsys: /devices/input/diagnostics.html
57. DDMS: http://developer.android.com/tools/debugging/ddms.html
58. Monkey テストツール: http://developer.android.com/tools/help/monkey.html
59. SysyTrace ツール: http://developer.android.com/tools/help/systrace.html
60. Android アプリの開発関連の設定:
61. 複数画面のサポート: http://developer.android.com/guide/practices/screens_support.html
62. android.util.DisplayMetrics: http://developer.android.com/reference/android/util/DisplayMetrics.html
63. RenderScript: http://developer.android.com/guide/topics/renderscript/
64. OpenGL ES 用の Android 拡張機能パック: https://developer.android.com/reference/android/opengl/GLES31Ext.html
65. ハードウェア アクセラレーション: http://developer.android.com/guide/topics/graphics/hardware-accel.html
66. EGL Extension-EGL_ANDROID_RECORDABLE:
http://www.khronos.org/registry/egl/extensions/ANDROID/EGL_ANDROID_recordable.txt
67. ディスプレイ マネージャー: http://developer.android.com/reference/android/hardware/display/DisplayManager.html
68. android.content.res.Configuration: http://developer.android.com/reference/android/content/res/Configuration.html
69. アクション アシスト: http://developer.android.com/reference/android/content/Intent.html#ACTION_ASSIST
70. タップ入力の構成: http://source.android.com/devices/tech/input/touch-devices.html
71. モーション イベント API: http://developer.android.com/reference/android/view/MotionEvent.html
72. キーイベント API: http://developer.android.com/reference/android/view/KeyEvent.html
73. Android オープンソース センサー: http://source.android.com/devices/sensors
74. android.hardware.SensorEvent: http://developer.android.com/reference/android/hardware/SensorEvent.html
75. タイムスタンプ センサー イベント: http://developer.android.com/reference/android/hardware/SensorEvent.html#timestamp
76. Android オープンソース複合センサー: /devices/sensors/sensor-types.html#composite_sensor_type_summary
77. 連続トリガーモード: /docs/core/interaction/sensors/report-modes#continuous
78. 加速度計センサー: http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_ACCELEROMETER
79. Wi-Fi マルチキャスト API: http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html
80. Wi-Fi Direct(Wi-Fi P2P): http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html
81. WifiManager API: http://developer.android.com/reference/android/net/wifi/WifiManager.html
82. Bluetooth API: http://developer.android.com/reference/android/bluetooth/package-summary.html
83. Bluetooth ScanFilter API: https://developer.android.com/reference/android/bluetooth/le/ScanFilter.html
84. NDEF プッシュ プロトコル: http://source.android.com/compatibility/ndef-push-protocol.pdf
85. Android ビーム: http://developer.android.com/guide/topics/connectivity/nfc/nfc.html
86. Android NFC の共有設定:
http://developer.android.com/reference/android/provider/Settings.html#ACTION_NFCSHARING_SETTINGS
87. NFC 接続ハンドオーバー: http://members.nfc-forum.org/specs/spec_list/#conn_handover
88. Bluetooth Secure Simple Pairing Using NFC: http://members.nfc-forum.org/apps/group_public/download.php/18688/NFCForum-AD-BTSSP_1_1.pdf
89. コンテンツ リゾルバ: http://developer.android.com/reference/android/content/ContentResolver.html
90. カメラの向きに関する API: http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)
91. カメラ: http://developer.android.com/reference/android/hardware/Camera.html
92. カメラ: http://developer.android.com/reference/android/hardware/Camera.Parameters.html
93. カメラのハードウェア レベル: https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL
94. カメラのバージョンのサポート: http://source.android.com/devices/camera/versioning.html
95. Android DownloadManager: http://developer.android.com/reference/android/app/DownloadManager.html
96. Android File Transfer: http://www.android.com/filetransfer
97. Android のオープン アクセサリ: http://developer.android.com/guide/topics/connectivity/usb/accessory.html
98. Android USB オーディオ: http://developer.android.com/reference/android/hardware/usb/UsbConstants.html#USB_CLASS_AUDIO
99. USB 充電仕様: http://www.usb.org/developers/docs/devclass_docs/USB_Battery_Charging_1.2.pdf
100. USB ホスト API: http://developer.android.com/guide/topics/connectivity/usb/host.html
101. 有線オーディオ ヘッドセット: http://source.android.com//docs/core/interaction/accessories/headset/plug-headset-spec.html
102. Android のセキュリティと権限に関するリファレンス: http://developer.android.com/guide/topics/security/permissions.html
103. UserManager のリファレンス: http://developer.android.com/reference/android/os/UserManager.html
104. 外部ストレージのリファレンス: http://source.android.com/docs/core/storage
105. 外部ストレージの API: http://developer.android.com/reference/android/os/Environment.html
106. SMS ショートコード: http://en.wikipedia.org/wiki/Short_code
107. Android オープンソース暗号化: http://source.android.com/docs/security/features/encryption
108. Android 互換性プログラムの概要: http://source.android.com//docs/compatibility
109. Android 互換性フォーラム: https://groups.google.com/forum/#!forum/android-compatibility
110. WebM プロジェクト: http://www.webmproject.org/
111. Android UI_MODE_TYPE_CAR API: http://developer.android.com/reference/android/content/res/Configuration.html#UI_MODE_TYPE_CAR
112. Android MediaCodecList API: http://developer.android.com/reference/android/media/MediaCodecList.html
113. Android CamcorderProfile API: http://developer.android.com/reference/android/media/CamcorderProfile.html
上記の参考資料の多くは、Android SDK から直接的または間接的に派生したものであり、その SDK のドキュメントに記載されている情報と機能的にまったく同じです。この互換性定義または互換性テストスイートと SDK ドキュメントの間に相違がある場合、SDK ドキュメントが正式なものであるとみなされます。上記の参考資料に記載されている技術的な詳細情報はすべて、この互換性定義の一部とみなされます。