Copyright © 2010, Google Inc. All rights reserved.
compatibility@android.com
目次
2. 参考資料
3. ソフトウェア
3.2. ソフト API の互換性
3.3. ネイティブ API の互換性
3.4. ウェブの互換性
3.5. API 動作の互換性
3.6. API の名前空間
3.7. 仮想マシンの互換性
3.8. ユーザー インターフェースの互換性
5. マルチメディアの互換性
6. デベロッパー ツールの互換性
7. ハードウェアの互換性
8. パフォーマンスの互換性
9. セキュリティ モデルの互換性
10. ソフトウェア互換性テスト
11. アップデート可能なソフトウェア
12. お問い合わせ
付録 A - Bluetooth のテスト手順
1. はじめに
このドキュメントでは、スマートフォンが Android 2.3 との互換性を維持するために満たさなければならない要件を列挙しています。
原文における「must」(しなければならない)、「must not」(してはならない)、「required」(要求される)、「shall」(するものとする)、「shall not」(しないものとする)、「should」(すべきである)、「should not」(すべきではない)、「recommended」(推奨される)、「may」(しても構わない)「optional」(任意)の使用は、RFC2119 [参考資料、1] で定義されている IETF 規格に従います。
このドキュメントで使用する「デバイス実装者」および「実装者」という用語は、Android 2.3 を実行するハードウェア / ソフトウェア ソリューションを開発する人または組織を指します。「デバイス実装」または「実装」とは、そのように開発されたハードウェア / ソフトウェア ソリューションを指します。
Android 2.3 と互換性があるとみなされるには、デバイス実装で、この互換性定義に示された要件(参照により盛り込まれたドキュメントを含む)を満たさなければなりません。
この定義、またはセクション 10 に記載されているソフトウェア テストが、言及されていない、曖昧である、または不完全である場合、既存の実装との互換性を確保することはデバイス実装者の責任です。このため、Android オープンソース プロジェクト [参考資料、3] は Android のリファレンス実装であり、優先実装です。デバイス実装者は可能な限り、Android オープンソース プロジェクトから入手できる「アップストリーム」のソースコードに基づいて実装することが強く推奨されます。一部のコンポーネントは仮に別の実装に置き換えることもできますが、ソフトウェア テストの合格が非常に困難になるため、そのような慣例には従わないことが強く推奨されます。互換性テストスイートなどを含む標準的な Android 実装との完全な動作互換性を確保することは、実装者の責任です。なお、このドキュメントでは特定のコンポーネントの置き換えと変更が明示的に禁止されています。
この互換性定義は、Android 2.3.3 のアップデートに対応するために発行されたものであり、これは API レベル 10. に該当します。この定義は、Android 2.3.3 より前の 2.3 バージョンに対する互換性定義を廃止し、置き換えるものです(つまり、バージョン 2.3.1 および 2.3.2 は廃止されています)。今後、Android 2.3 を搭載した Android 対応デバイスは、バージョン 2.3.3 以降で出荷しなければなりません。
2. 参考資料
- IETF RFC2119 要件レベル: http://www.ietf.org/rfc/rfc2119.txt
- Android 互換性プログラムの概要: http://source.android.com/docs/compatibility/index.html
- Android オープンソース プロジェクト: http://source.android.com/
- API の定義とドキュメント: http://developer.android.com/reference/packages.html
- Android 権限リファレンス: http://developer.android.com/reference/android/Manifest.permission.html
- android.os.Build リファレンス: http://developer.android.com/reference/android/os/Build.html
- Android 2.3 で許可されているバージョン文字列: http://source.android.com/docs/compatibility/2.3/versions.html
- android.webkit.WebView クラス: http://developer.android.com/reference/android/webkit/WebView.html
- HTML5: http://www.whatwg.org/specs/web-apps/current-work/multipage/
- HTML5 のオフライン機能: http://dev.w3.org/html5/spec/Overview.html#offline
- HTML5 の video タグ: http://dev.w3.org/html5/spec/Overview.html#video
- HTML5/W3C の位置情報 API: http://www.w3.org/TR/geolocation-API/
- HTML5/W3C の webdatabase API: http://www.w3.org/TR/webdatabase/
- HTML5/W3C の IndexedDB API: http://www.w3.org/TR/IndexedDB/
- Dalvik 仮想マシン仕様: Android ソースコード(dalvik/docs)で入手可能
- AppWidget: http://developer.android.com/guide/practices/ui_guidelines/widget_design.html
- 通知: http://developer.android.com/guide/topics/ui/notifiers/notifications.html
- アプリケーション リソース: http://code.google.com/android/reference/available-resources.html
- ステータスバー アイコンのスタイルガイド: http://developer.android.com/guide/practices/ui_guideline /icon_design.html#statusbarstructure
- 検索マネージャー: http://developer.android.com/reference/android/app/SearchManager.html
- トースト: http://developer.android.com/reference/android/widget/Toast.html
- ライブ壁紙: https://android-developers.googleblog.com/2010/02/live-wallpapers.html
- リファレンス ツールのドキュメント(adb、aapt、ddms): http://developer.android.com/guide/developing/tools/index.html
- Android apk ファイルの説明: http://developer.android.com/guide/topics/fundamentals.html
- マニフェスト ファイル: http://developer.android.com/guide/topics/manifest/manifest-intro.html
- Monkey テストツール: https://developer.android.com/studio/test/other-testing-tools/monkey
- Android のハードウェア機能のリスト: http://developer.android.com/reference/android/content/pm/PackageManager.html
- 複数画面のサポート: http://developer.android.com/guide/practices/screens_support.html
- android.util.DisplayMetrics: http://developer.android.com/reference/android/util/DisplayMetrics.html
- android.content.res.Configuration: http://developer.android.com/reference/android/content/res/Configuration.html
- センサー座標空間: http://developer.android.com/reference/android/hardware/SensorEvent.html
- Bluetooth API: http://developer.android.com/reference/android/bluetooth/package-summary.html
- NDEF プッシュ プロトコル: http://source.android.com/docs/compatibility/ndef-push-protocol.pdf
- MIFARE MF1S503X: http://www.nxp.com/documents/data_sheet/MF1S503x.pdf
- MIFARE MF1S703X: http://www.nxp.com/documents/data_sheet/MF1S703x.pdf
- MIFARE MF0ICU1: http://www.nxp.com/documents/data_sheet/MF0ICU1.pdf
- MIFARE MF0ICU2: http://www.nxp.com/documents/short_data_sheet/MF0ICU2_SDS.pdf
- MIFARE AN130511: http://www.nxp.com/documents/application_note/AN130511.pdf
- MIFARE AN130411: http://www.nxp.com/documents/application_note/AN130411.pdf
- カメラの向きに関する API: http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)
- android.hardware.Camera: http://developer.android.com/reference/android/hardware/Camera.html
- Android のセキュリティと権限に関するリファレンス: http://developer.android.com/guide/topics/security/security.html
- Android 向けアプリ: http://code.google.com/p/apps-for-android
上記の参考資料の多くは、Android 2.3 SDK から直接的または間接的に派生したものであり、その SDK のドキュメントに記載されている情報と機能的にまったく同じです。この互換性定義または互換性テストスイートと SDK ドキュメントの間に相違がある場合、SDK ドキュメントが正式なものであるとみなされます。上記の参考資料に記載されている技術的な詳細情報はすべて、この互換性定義の一部とみなされます。
3. ソフトウェア
Android プラットフォームには、一連のマネージド API、一連のネイティブ API、いわゆる「ソフト」API の本体(インテント システム、ウェブ アプリケーション API など)が含まれています。このセクションでは、互換性に不可欠なハード API とソフト API、およびその他の関連する特定の技術やユーザー インターフェースの動作について詳しく説明します。デバイス実装は、このセクションのすべての要件に準拠しなければなりません。
3.1. マネージド API の互換性
マネージド(Dalvik ベース)実行環境は、Android アプリを実行するための主要な手段です。Android アプリケーション プログラミング インターフェース(API)は、一連の Android プラットフォーム インターフェースとして、マネージド VM 環境で動作するアプリに公開されます。デバイス実装は完全な実装を提供しなければなりません。これには、Android 2.3 SDK で公開されているドキュメント化された API [参考資料、4] のドキュメント化された動作がすべて含まれます。
デバイス実装は、この互換性定義で特に許可される場合を除き、マネージド API の省略、API インターフェースまたは署名の変更、ドキュメント化済みの動作からの逸脱、NoOps の組み込みを行ってはなりません。
この互換性定義では、Android に API が含まれている一部のタイプのハードウェアについては、デバイス実装で省略することを許可しています。そのような場合であっても、API が存在し、かつ妥当な動作をしなければなりません。このシナリオに固有の要件については、セクション 7 をご覧ください。
3.2. ソフト API の互換性
セクション 3.1 のマネージド API に加えて、Android には、アプリのコンパイル時には適用できない、Android アプリのインテントや権限などの形式で、重要なランタイム専用の「ソフト」API も含まれています。このセクションでは、Android 2.3 との互換性に必要な「ソフト」API とシステムの動作について詳しく説明します。デバイス実装は、このセクションに示されている要件をすべて満たさなければなりません。
3.2.1. 権限
デバイス実装者は、権限リファレンス ページ [参考資料、5] に記載されているすべての権限定数をサポートし、適用しなければなりません。なお、セクション 10 に、Android セキュリティ モデルに関連する追加の要件を記載しています。
3.2.2. ビルド パラメータ
Android API には、現在のデバイスを記述するための android.os.Build
クラス [参考資料、6] の定数がいくつか含まれています。デバイス実装間で一貫した意味のある値を提供するために、これらの値の形式に関してデバイス実装が従わなければならない追加の制限を下記の表に示します。
パラメータ | コメント |
android.os.Build.VERSION.RELEASE | 現在実行している Android システムのバージョン(人が読める形式)。このフィールドには、[参考資料、7] で定義された文字列値のいずれかを指定しなければなりません。 |
android.os.Build.VERSION.SDK | 現在実行している Android システムのバージョン(サードパーティ アプリのコードからアクセスできる形式)。Android 2.3 の場合、このフィールドには整数値 9 を指定しなければなりません。 |
android.os.Build.VERSION.INCREMENTAL | 現在実行している Android システムの特定のビルドを指定する、デバイス実装者が選択した値(人が読める形式)。この値については、エンドユーザーが利用できる別のビルドに再利用することは回避しなければなりません。このフィールドは主に、ビルドの生成に使用されたビルド番号またはソース管理変更 ID を示すために使用します。このフィールドの具体的な形式についての要件はありませんが、null または空の文字列("")であってはなりません。 |
android.os.Build.BOARD | デバイスで使用される特定の内部ハードウェアを識別する、デバイス実装者が選択した値(人が読める形式)。このフィールドは、デバイスに電力を供給するボードの特定のリビジョンを示すために使用できます。このフィールドの値は、7 ビット ASCII としてエンコード可能でなければならず、かつ正規表現 "^[a-zA-Z0-9.,_-]+$" と一致しなければなりません。 |
android.os.Build.BRAND | デバイスを製作した企業、組織、個人などを識別する、デバイス実装者が選択した値(人が読める形式)。このフィールドは、デバイスを販売した OEM や携帯通信会社を示すために使用します。このフィールドの値は、7 ビット ASCII としてエンコード可能でなければならず、かつ正規表現 "^[a-zA-Z0-9.,_-]+$" と一致しなければなりません。 |
android.os.Build.DEVICE | デバイスの筐体の具体的な構成またはリビジョン(「工業デザイン」と呼ばれることもあります)を識別する、デバイス実装者が選択した値。このフィールドの値は、7 ビット ASCII としてエンコード可能でなければならず、かつ正規表現 "^[a-zA-Z0-9.,_-]+$" と一致しなければなりません。 |
android.os.Build.FINGERPRINT | このビルドを一意に識別する文字列。人が読める程度の形式にすべきです。次のテンプレートに従わなければなりません。$(BRAND)/$(PRODUCT)/$(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS) 例: acme/mydevice/generic/generic:2.3/ERC77/3359:userdebug/test-keys フィンガープリントは空白文字を含んではなりません。上記のテンプレート内の他のフィールドに空白文字がある場合、ビルドのフィンガープリントではアンダースコア(_)などの別の文字に置き換えなければなりません。このフィールドの値は、7 ビット ASCII としてエンコード可能でなければなりません。 |
android.os.Build.HOST | ビルドが構築されたホストを一意に識別する文字列(人が読める形式)。このフィールドの具体的な形式についての要件はありませんが、null または空の文字列("")であってはなりません。 |
android.os.Build.ID | 特定のリリースを参照するためにデバイス実装者が選択する識別子(人が読める形式)。このフィールドは android.os.Build.VERSION.INCREMENTAL と同じ内容にできますが、エンドユーザーがソフトウェア ビルドを区別できるような意味のある値にするべきです。このフィールドの値は、7 ビット ASCII としてエンコード可能でなければならず、かつ正規表現 "^[a-zA-Z0-9.,_-]+$" と一致しなければなりません。 |
android.os.Build.MODEL | エンドユーザーが知っているデバイスの名前を含む、デバイス実装者が選択した値。これは、デバイスが販売され、エンドユーザーに購入される際の名前と同じにすべきです。このフィールドの具体的な形式についての要件はありませんが、null または空の文字列("")であってはなりません。 |
android.os.Build.PRODUCT | デバイスの開発名またはコードネームを含む、デバイス実装者が選択した値。人が読める形式でなければなりませんが、必ずしもエンドユーザーに表示することを意図したものではありません。このフィールドの値は、7 ビット ASCII としてエンコード可能でなければならず、かつ正規表現 "^[a-zA-Z0-9.,_-]+$" と一致しなければなりません。 |
android.os.Build.TAGS | ビルドをさらに区別する、デバイス実装者が選択したタグのカンマ区切りのリスト。例: 「unsigned,debug」。このフィールドの値は、7 ビット ASCII としてエンコード可能でなければならず、かつ正規表現 "^[a-zA-Z0-9.,_-]+$" と一致しなければなりません。 |
android.os.Build.TIME | ビルドが作成されたときのタイムスタンプを表す値。 |
android.os.Build.TYPE | ビルドのランタイム構成を指定する、デバイス実装者が選択した値。このフィールドには、典型的な 3 つの Android ランタイム構成(user、userdebug、eng)に対応する値のいずれかを指定するべきです。このフィールドの値は、7 ビット ASCII としてエンコード可能でなければならず、かつ正規表現 "^[a-zA-Z0-9.,_-]+$" と一致しなければなりません。 |
android.os.Build.USER | ビルドを生成したユーザー(または自動ユーザー)の名前またはユーザー ID。このフィールドの具体的な形式についての要件はありませんが、null または空の文字列("")であってはなりません。 |
3.2.3. インテントの互換性
Android は、インテントを使用してアプリ間の疎結合統合を実現します。このセクションでは、デバイス実装で尊重しなければならないインテント パターンに関連する要件について説明します。「尊重する」とは、デバイス実装者が、一致するインテント フィルタを指定し、指定されたインテント パターンごとに正しい動作をバインドして実装する Android のアクティビティまたはサービスを提供しなければならないことを意味します。
3.2.3.1. コアアプリのインテント
Android のアップストリーム プロジェクトでは、電話アプリ、カレンダー、連絡先、音楽プレーヤーなど、多数のコアアプリを定義しています。デバイス実装者は、これらのアプリを代替バージョンに置き換えても構いません。
ただし、そのような代替バージョンはすべて、アップストリーム プロジェクトが提供するものと同じインテント パターンを尊重しなければなりません。たとえば、デバイスに代替の音楽プレーヤーが含まれている場合でも、サードパーティ アプリによって発行されたインテント パターンを尊重して曲を選択しなくてはなりません。
以下のアプリは、コア Android システムアプリとみなされます。
- 卓上時計
- ブラウザ
- カレンダー
- 電卓
- 連絡先
- メール
- ギャラリー
- グローバル検索
- ランチャー
- 音楽
- 設定
コア Android システムアプリには、「パブリック」とみなされるさまざまな Activity または Service コンポーネントが含まれます。つまり、属性「android:exported」が存在しないか、値が「true」である可能性があります。
デバイス実装は、android:exported 属性の値を「false」に設定することにより非パブリックとしてマークされていない、コア Android システムアプリのいずれかで定義されたすべての Activity または Service で、コア Android システムアプリと同じインテント フィルタ パターンを実装する同じタイプのコンポーネントを含まなければなりません。
つまり、デバイス実装はコア Android システムアプリを置き換えても構いませんが、その場合は、置き換えられる各コア Android システムアプリで定義されたすべてのインテント パターンをサポートしなければなりません。
3.2.3.2. インテントのオーバーライド
Android は拡張可能なプラットフォームであるため、デバイス実装者は、セクション 3.2.3.1 で参照されている各インテント パターンをサードパーティ アプリでオーバーライドできるようにしなければなりません。アップストリームの Android オープンソース プロジェクトでは、デフォルトでこれが可能です。デバイス実装者は、システムアプリがこれらのインテント パターンを使用することに対し特別な権限を付与したり、サードパーティ アプリがこれらのパターンにバインドして制御を引き受けることを妨げたりしてはなりません。これによって禁止される行為には、たとえば同じインテント パターンを処理する複数のアプリからユーザーが選択することを許可する「選択的」ユーザー インターフェースを無効にすることが含まれますが、これに限定されません。
3.2.3.3. インテントの名前空間
デバイス実装者は、android.* 名前空間に、ACTION、CATEGORY、または他のキー文字列を使用して、新しいインテントまたはブロードキャスト インテント パターンを尊重する Android コンポーネントを含めてはなりません。デバイス実装者は、別の組織に属するパッケージ スペースに、ACTION、CATEGORY、または他のキー文字列を使用して、新しいインテントまたはブロードキャスト インテント パターンを尊重する Android コンポーネントを含めてはなりません。デバイス実装者は、セクション 3.2.3.1 に記載されているコアアプリで使用されるインテント パターンのいずれについても変更または拡張してはなりません。
この制約は、セクション 3.6 の Java 言語クラスに指定された制約と同様のものです。
3.2.3.4. ブロードキャスト インテント
サードパーティ アプリは、特定のインテントをブロードキャストしてハードウェアまたはソフトウェア環境の変更を通知する際、プラットフォームに依存します。Android 互換デバイスは、該当するシステム イベントに応じてパブリック ブロードキャスト インテントをブロードキャストしなければなりません。ブロードキャスト インテントについては、SDK のドキュメントに記載されています。
3.3. ネイティブ API の互換性
Dalvik で動作するマネージド コードは、アプリの .apk ファイルで提供されるネイティブ コードを、該当のデバイス ハードウェア アーキテクチャ向けにコンパイルされた ELF .so ファイルとして呼び出すことができます。ネイティブ コードは基となるプロセッサ技術に大きく依存するため、Android では、Android NDK のファイル docs/CPU-ARCH-ABIS.txt
で多数のアプリケーション バイナリ インターフェース(ABI)を定義しています。デバイス実装は、1 つ以上の定義済み ABI と互換性がある場合、以下に示すように Android NDK との互換性を実装するべきです。
Android ABI をサポートする場合、デバイス実装には以下の要件が求められます。
- 標準の Java Native Interface(JNI)セマンティクスを使用して、ネイティブ コードを呼び出すためにマネージド環境で動作するコードがサポートされていなければなりません。
- 以下のリストにある各必須ライブラリと、ソース互換(すなわちヘッダー互換)かつバイナリ互換(ABI 向け)でなければなりません。
android.os.Build.CPU_ABI
API を介して、デバイスがサポートするネイティブ アプリケーション バイナリ インターフェース(ABI)を正確にレポートしなければなりません。- 最新バージョンの Android NDK のファイル
docs/CPU-ARCH-ABIS.txt
に記載されている ABI のみをレポートしなければなりません。 - アップストリームの Android オープンソース プロジェクトで入手可能なソースコードとヘッダー ファイルを使用してビルドするべきです。
次のネイティブ コード API が、ネイティブ コードを含むアプリで利用できなければなりません。
- libc(C ライブラリ)
- libm(math ライブラリ)
- C++ の最小限のサポート
- JNI インターフェース
- liblog(Android ロギング)
- libz(Zlib 圧縮)
- libdl(ダイナミック リンカー)
- libGLESv1_CM.so(OpenGL ES 1.0)
- libGLESv2.so(OpenGL ES 2.0)
- libEGL.so(ネイティブ OpenGL サーフェス管理)
- libjnigraphics.so
- libOpenSLES.so(Open Sound Library 音声サポート)
- libandroid.so(ネイティブ Android アクティビティ サポート)
- 以下で説明する OpenGL のサポート
なお、Android NDK の将来のリリースで、追加の ABI のサポートが導入される可能性があります。デバイス実装では、既存の事前定義済み ABI と互換性がない場合、いかなる ABI のサポートについてもレポートすることを回避しなければなりません。
ネイティブ コードの互換性は難しい問題です。非常に重要であるため、デバイス実装者には、互換性を確保するために上記のライブラリのアップストリーム実装を使用することが強く推奨されます。
3.4. ウェブの互換性
多くのデベロッパーとアプリは、ユーザー インターフェースに関して android.webkit.WebView
クラス [参考資料、8] の動作に依存しているため、WebView の実装に Android 実装間での互換性がなければなりません。同様に、完全で最新のウェブブラウザは Android ユーザー エクスペリエンスの中心です。デバイス実装は、アップストリームの Android ソフトウェアと一致するバージョンの android.webkit.WebView
を含まなければならず、下記のとおり、最新の HTML5 対応ブラウザを含まなければなりません。
3.4.1. WebView の互換性
Android オープンソース実装では、WebKit レンダリング エンジンを使用して android.webkit.WebView
を実装します。ウェブ レンダリング システムの包括的なテストスイートを開発することは現実的でないため、デバイス実装者は、WebView 実装に WebKit の特定のアップストリーム ビルドを使用しなければなりません。詳細は以下のとおりです。
- デバイス実装の
android.webkit.WebView
実装は、Android 2.3 用のアップストリームの Android オープンソース ツリーにある 533.1 WebKit ビルドをベースとしている必要があります。このビルドには、WebView の特定の機能セットとセキュリティ修正が含まれています。デバイス実装者は WebKit 実装のカスタマイズを含めても構いません。ただし、そのようなカスタマイズで WebView の動作(レンダリング動作など)を変更してはなりません。 - WebView がレポートするユーザー エージェント文字列は、次の形式でなければなりません。
Mozilla/5.0 (Linux; U; Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD)) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
- $(VERSION) 文字列の値は、
android.os.Build.VERSION.RELEASE
の値と同じでなければなりません。 - $(LOCALE) 文字列の値は、国コードと言語に関する ISO 規則に従うべきであり、デバイスの現在構成されているロケールを参照すべきです。
- $(MODEL) 文字列の値は、
android.os.Build.MODEL
の値と同じでなければなりません。 - $(BUILD) 文字列の値は、
android.os.Build.ID
の値と同じでなければなりません。
- $(VERSION) 文字列の値は、
WebView コンポーネントは、可能な限り HTML5 [参考資料、9] をサポートすべきです。少なくとも、デバイス実装は WebView の HTML5 に関連する以下の API をそれぞれサポートしなければなりません。
さらに、デバイス実装は、HTML5/W3C の webstorage API [参考資料、13] をサポートしなければならず、HTML5/W3C の IndexedDB API [参考資料、14] をサポートするべきです。なお、ウェブ開発標準化団体が webstorage よりも IndexedDB を優先するようになっているため、将来の Android バージョンでは IndexedDB が必須コンポーネントになると見込まれます。
すべての JavaScript API と同様に、WebView では HTML5 API をデフォルトで無効にしなければなりません。ただし、デベロッパーが通常の Android API を介して明示的に有効にする場合を除きます。
3.4.2. ブラウザの互換性
デバイス実装では、一般ユーザーのウェブ ブラウジング用のスタンドアロン ブラウザアプリを配置しなければなりません。スタンドアロン ブラウザは、WebKit 以外のブラウザ技術に基づくものでも構いません。ただし、代替ブラウザアプリを使用する場合でも、サードパーティ アプリに提供する android.webkit.WebView
コンポーネントは、セクション 3.4.1 に記載されているように、WebKit に基づくものでなければなりません。
実装では、スタンドアロン ブラウザアプリでカスタムのユーザー エージェント文字列を送信しても問題ありません。
スタンドアロン ブラウザアプリは(アップストリームの WebKit ブラウザアプリとサードパーティの代替アプリのどちらをベースとしているかにかかわらず)、可能な限り HTML5 [参考資料、9] をサポートすべきです。少なくとも、デバイス実装は HTML5 に関連する以下の API をそれぞれサポートしなければなりません。
さらに、デバイス実装は、HTML5/W3C の webstorage API [参考資料、13] をサポートしなければならず、HTML5/W3C の IndexedDB API [参考資料、14] をサポートするべきです。なお、ウェブ開発標準化団体が webstorage よりも IndexedDB を優先するようになっているため、将来の Android バージョンでは IndexedDB が必須コンポーネントになると見込まれます。
3.5. API 動作の互換性
各 API タイプ(マネージド、ソフト、ネイティブ、ウェブ)の動作は、アップストリームの Android オープンソース プロジェクト [参考資料、3] の優先実装と一貫性がなければなりません。互換性の具体的な内容は次のとおりです。
- デバイスによる、標準的なインテントの動作またはセマンティクスの変更を回避しなければなりません。
- デバイスによる、特定のタイプのシステム コンポーネント(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 仮想マシンのセマンティクス [参考資料、15] をサポートしなければなりません。
画面が中密度または低密度に分類されるデバイス実装は、各アプリに少なくとも 16 MB のメモリを割り当てるように Dalvik を構成しなければなりません。画面が高密度または超高密度に分類されるデバイス実装は、各アプリに少なくとも 24 MB のメモリを割り当てるように Dalvik を構成しなければなりません。なお、デバイス実装は、これらの数値よりも多くのメモリを割り当てても構いません。
3.8. ユーザー インターフェースの互換性
Android プラットフォームには、デベロッパーがシステム ユーザー インターフェースに接続できるようにするデベロッパー API がいくつか含まれています。デバイス実装は、下記のとおり、開発するカスタム ユーザー インターフェースに標準の UI API を組み込まなければなりません。
3.8.1. ウィジェット
Android では、アプリが「AppWidget」をエンドユーザーに公開するためのコンポーネント タイプと、それに対応する API およびライフサイクルを定義しています [参考資料、16]。Android オープンソース リファレンス リリースには、ユーザーがホーム画面から AppWidget を追加、表示、削除できるユーザー インターフェース要素を含むランチャー アプリが含まれています。
デバイス実装者は、リファレンス ランチャー(ホーム画面)に代わるランチャーを使用しても構いません。代替ランチャーは、AppWidget の組み込みのサポートを含むべきであり、ランチャー内で直接 AppWidget を追加、構成、表示、削除するユーザー インターフェース要素を公開すべきです。代替ランチャーは、これらのユーザー インターフェース要素を省略しても構いません。ただしその場合、デバイス実装者は、ユーザーが AppWidget を追加、構成、表示、削除できるように、ランチャーからアクセス可能な別のアプリを提供しなければなりません。
3.8.2. 通知
Android には、デベロッパーが重要なイベントをユーザーに通知 [参考資料、17] するための API が含まれています。デバイス実装者は、定義された通知の各クラスのサポートを提供しなければなりません。具体的には、音、バイブレーション、ライト、ステータスバーです。
さらに、実装は、API [参考資料、18] で提供されるか、ステータスバー / システムバー アイコンのスタイルガイド [参考資料、19] に記載されているすべてのリソース(アイコンやサウンド ファイルなど)を正しくレンダリングしなければなりません。デバイス実装者は、通知について、リファレンス Android オープンソース実装で提供されているものと異なる代替ユーザー エクスペリエンスを提供しても構いません。ただし、そのような代替通知システムは、上記のように既存の通知リソースをサポートしなければなりません。
3.8.3. 検索
Android には、デベロッパーがアプリに検索を組み込んでアプリのデータをグローバル システム検索に公開するための API [参考資料、20] が含まれています。一般に、この機能はシステム全体にわたる単一のユーザー インターフェースで構成されており、ユーザーがクエリを入力し、その入力に対して候補を示して結果を表示できるようになっています。Android API を使用すると、デベロッパーは、このインターフェースを再利用して独自のアプリ内で検索を提供でき、共通のグローバル検索ユーザー インターフェースに結果を供給できます。
デバイス実装は、ユーザー入力に応じてリアルタイムで検索候補を表示できるような、システム全体にわたる単一の共有検索ユーザー インターフェースを含まなければなりません。デバイス実装は、デベロッパーがこのユーザー インターフェースを再利用してアプリ内で検索を提供できるような API を実装しなければなりません。デバイス実装は、サードパーティ アプリがグローバル検索モードで実行されたときに検索候補を検索ボックスに追加できるような API を実装しなければなりません。この機能を利用するサードパーティ アプリがインストールされていない場合は、デフォルトの動作として、ウェブ検索エンジンの検索結果と検索候補を表示すべきです。
デバイス実装は、代替の検索ユーザー インターフェースを使用しても構いませんが、任意のアプリが検索フレームワークを呼び出すためにいつでも使用できるハードまたはソフトの専用の検索ボタンを含め、API ドキュメントに記載されている動作をそのボタンに提供すべきです。
3.8.4. トースト
アプリは、「トースト」API([参考資料、21] で定義)を使用して、短時間で消える短い非モーダル文字列をエンドユーザーに表示できます。デバイス実装は、アプリからエンドユーザーへのトーストを、なんらかの目立つ方法で表示しなければなりません。
3.8.5. ライブ壁紙
Android では、アプリで 1 つ以上の「ライブ壁紙」[参考資料、22] をエンドユーザーに公開できるようにするためのコンポーネント タイプと、対応する API およびライフサイクルを定義しています。ライブ壁紙とは、入力機能が制限されたアニメーションやパターンなどの画像で、壁紙として他のアプリの背後に表示されるものです。
ハードウェアは、他のアプリに悪影響を及ぼさず、妥当なフレームレートで、機能に制限なくすべてのライブ壁紙を実行できる場合、ライブ壁紙を確実に実行できるとみなされます。ハードウェアの制限によって、壁紙やアプリがクラッシュする、誤動作する、CPU やバッテリーを過剰に消費する、または許容できない低フレームレートで実行される場合、ハードウェアはライブ壁紙を実行できないとみなされます。たとえば、一部のライブ壁紙は、OpenGL 1.0 または 2.0 コンテキストを使用してコンテンツをレンダリングする場合があります。複数の OpenGL コンテキストをサポートしていないハードウェアでは、ライブ壁紙は確実には実行されません。OpenGL コンテキストを使用するライブ壁紙は、同様に OpenGL コンテキストを使用する別のアプリと競合する可能性があるからです。
上記のようにライブ壁紙を確実に実行できるデバイス実装では、ライブ壁紙を実装するべきです。ライブ壁紙を上記のように確実には実行しないと判断されたデバイス実装は、ライブ壁紙を実装してはなりません。
4. アプリ パッケージの互換性
デバイス実装は、公式の Android SDK に含まれる「aapt」ツールによって生成された Android「.apk」ファイルをインストールして実行しなければなりません [参考資料、23]。
デバイス実装は、.apk [参考資料、24]、Android マニフェスト [参考資料、25]、Dalvik バイトコード [参考資料、15] のいずれかの形式を、他の互換デバイスで該当ファイルを正しくインストールおよび実行できなくなるような方法で拡張してはなりません。デバイス実装者は、Dalvik のリファレンス アップストリーム実装と、リファレンス実装のパッケージ管理システムを使用すべきです。
5. マルチメディアの互換性
デバイス実装は、すべてのマルチメディア API を完全に実装しなければなりません。デバイス実装は、以下のすべてのマルチメディア コーデックのサポートを含まなければならず、以下の音声処理ガイドラインを満たすべきです。デバイス実装は、少なくとも 1 つの形式のオーディオ出力(スピーカー、ヘッドフォン端子、外部スピーカー接続など)を含まなければなりません。
5.1. メディア コーデック
デバイス実装は、以降のセクションで説明するマルチメディア コーデックをサポートしなければなりません。以下のコーデックはすべて、Android オープンソース プロジェクトの優先 Android 実装でソフトウェア実装として提供されています。
Google もオープン ハンドセット アライアンスも、これらのコーデックがサードパーティの特許の制約を受けないとは表明していないことにご注意ください。オープンソース ソフトウェアまたはシェアウェアを含め、このソースコードをハードウェアまたはソフトウェア製品で使用する場合は、このコードの実装に、関連する特許権者からの特許ライセンスが必要になることがあります。
以下の表には、ほとんどの動画コーデックの具体的なビットレート要件は記載されていません。実際には、関連する標準で要件として指定されているビットレートに正確に対応するビットレートを現在のデバイス ハードウェアが必ずしもサポートしていないためです。代わりに、デバイス実装では、仕様で定義されている上限までの、ハードウェアで実現できる最も高いビットレートをサポートすべきです。
5.1.1. メディア デコーダ
デバイス実装は、以下の表に記載されている各コーデックおよび各形式のデコーダ実装を含まなければなりません。各メディアタイプのデコーダは、アップストリームの Android オープンソース プロジェクトによって提供されます。
音声 | ||
名前 | 詳細 | ファイル / コンテナの形式 |
AAC LC/LTP | 標準ビットレート 160 kbps とサンプリング レート 8~48 kHz の任意の組み合わせのモノラル / ステレオ コンテンツ | 3GPP(.3gp)と MPEG-4(.mp4、.m4a)。raw AAC(.aac)に対するサポートなし |
HE-AACv1(AAC+) | ||
HE-AACv2(Enhanced AAC+) | ||
AMR-NB | 8 kHz でサンプリングされた 4.75~12.2 kbps | 3GPP(.3gp) |
AMR-WB | 16 kHz でサンプリングされた 6.60~23.85 kbps の 9 種類のレート | 3GPP(.3gp) |
MP3 | モノラル / ステレオの 8~320 Kbps 固定ビットレート(CBR)または可変ビットレート(VBR) | MP3(.mp3) |
MIDI | MIDI タイプ 0 と 1。DLS バージョン 1 と 2。XMF と Mobile XMF。着信音形式 RTTTL/RTX、OTA、iMelody をサポート | タイプ 0 と 1(.mid、.xmf、.mxmf)。RTTTL/RTX(.rtttl、.rtx)、OTA(.ota)、iMelody(.imy) |
Ogg Vorbis | Ogg(.ogg) | |
PCM | 8 ビットと 16 ビットのリニア PCM(最大レートはハードウェアの上限値) | WAVE(.wav) |
画像 | ||
JPEG | ベースラインとプログレッシブ | |
GIF | ||
PNG | ||
BMP | ||
動画 | ||
H.263 | 3GPP(.3gp)ファイル | |
H.264 | 3GPP(.3gp)と MPEG-4(.mp4)ファイル | |
MPEG4 シンプル プロファイル | 3GPP(.3gp)ファイル |
5.1.2. メディア エンコーダ
デバイス実装は、可能な限りセクション 5.1.1. に記載されているメディア形式のエンコーダを含めるべきです。ただし、特定のオプションのハードウェアが搭載されていないデバイスの場合には、エンコーダが意味をなさないことがあります。たとえば、デバイスにカメラが搭載されていない場合、H.263 動画用のエンコーダは意味をなしません。そのため、デバイス実装は、以下の表に記載されている条件に従ってメディア エンコーダを実装しなければなりません。
デバイス実装でハードウェアを省略できる条件の詳細については、セクション 7 をご覧ください。
音声 | ||||
名前 | 詳細 | ファイル / コンテナの形式 | 条件 | |
AMR-NB | 8 kHz でサンプリングされた 4.75~12.2 kbps | 3GPP(.3gp) | マイク ハードウェアを含み、android.hardware.microphone を定義するデバイス実装では、これらのオーディオ形式のエンコーダを含まなければなりません。 |
|
AMR-WB | 16 kHz でサンプリングされた 6.60~23.85 kbps の 9 種類のレート | 3GPP(.3gp) | ||
AAC LC/LTP | 標準ビットレート 160 kbps とサンプリング レート 8~48 kHz の任意の組み合わせのモノラル / ステレオ コンテンツ | 3GPP(.3gp)と MPEG-4(.mp4、.m4a)。 | ||
画像 | JPEG | ベースラインとプログレッシブ | すべてのデバイス実装は、これらの画像形式のエンコーダを含まなければなりません。Android 2.3 には、アプリケーションがこれらのファイル形式をプログラムで生成するために使用できる API が含まれているためです。 | |
PNG | ||||
動画 | H.263 | 3GPP(.3gp)ファイル | カメラ ハードウェアを含み、android.hardware.camera または android.hardware.camera.front を定義するデバイス実装では、これらの動画形式のエンコーダを含まなければなりません。 |
上記のエンコーダに加えて、デバイス実装には H.264 エンコーダを含めるべきです。将来のバージョンの互換性定義では、この要件が「しなければならない」に変更される予定です。つまり、H.264 のエンコーダは Android 2.3 では任意ですが、将来のバージョンでは必須になります。Android 2.3 を搭載した既存または新規のデバイスでは、Android 2.3 ではこの要件を満たすことが非常に強く推奨されます。そのようにしないと、将来のバージョンにアップグレードした場合に Android の互換性が実現されません。
5.2. 音声録音
デバイス実装は、アプリが android.media.AudioRecord
API を使用して音声ストリームの記録を開始したとき、以下の各動作で音声をサンプリングして録音すべきです。
- ノイズ リダクション処理が存在する場合は、無効にすべきです。
- 自動ゲイン コントロールが存在する場合は、無効にすべきです。
- デバイスは、ほぼ平坦な振幅周波数特性(具体的には ±3 dB、100 Hz~4,000 Hz)を示すべきです。
- オーディオ入力感度は、1,000 Hz で音圧レベル(SPL)90 dB の音源が 16 ビットサンプルで RMS 5,000 になるように設定すべきです。
- PCM 振幅レベルは、マイクでの 90 dB SPL から少なくとも 30 dB(-18 dB~+12 dB)の範囲で入力 SPL の変化を線形的にトラッキングすべきです。
- 高調波ひずみの合計を、90 dB SPL の入力レベルで 100 Hz~4,000 Hz の 1% 未満にすべきです。
注: 上記の要件に関して Android 2.3 については「するべき」と記載されていますが、将来のバージョンの互換性定義では「しなければならない」に変更される予定です。つまり、これらの要件は、Android 2.3 では任意ですが、将来のバージョンでは必須になります。Android 2.3 を搭載した既存または新規のデバイスでは、Android 2.3 ではそれらの要件を満たすことが非常に強く推奨されます。そのようにしないと、将来のバージョンにアップグレードした場合に Android の互換性が実現されません。
5.3. オーディオ レイテンシ
オーディオ レイテンシとは、アプリが音声の再生または録音オペレーションをリクエストしてから、デバイス実装が実際にオペレーションを開始するまでの間隔として広く定義されます。アプリのクラスの多くで、サウンド エフェクトや VOIP 通信などのリアルタイム エフェクトを実現するには、レイテンシを短くする必要があります。マイク ハードウェアを含み、android.hardware.microphone
を宣言するデバイス実装は、このセクションで概説するオーディオ レイテンシ要件をすべて満たす必要があります。デバイス実装でマイク ハードウェアを省略できる条件の詳細については、セクション 7 をご覧ください。
このセクションの目的は次のとおりです。
- 「コールド出力レイテンシ」とは、アプリケーションがオーディオの再生をリクエストしてから、音声の再生開始(オーディオ システムがアイドル状態で電源がオフになるまでの時間)を指します。
- 「ウォーム出力レイテンシ」とは、アプリケーションが音声の再生をリクエストしてから音声の再生を開始するまでの間隔として定義され、オーディオ システムが最近使用されたものの、現在アイドル状態(つまり、無音状態)である時間のことを指します。
- 「連続出力レイテンシ」とは、デバイスが再生中のサンプルを発行してから、スピーカーが現在音声を再生しているときに、スピーカーが対応する音を物理的に再生する間隔を指します。
- 「コールド入力レイテンシ」とは、アプリが音声録音をリクエストしてから、コールバックを通じて最初のサンプルがアプリに配信されるまでの間隔(オーディオ システムとマイクがアイドル状態で、リクエストの前に電源がオフになるまでの時間)として定義されます。
- 「連続入力レイテンシ」とは、デバイスが録音モードになっているときに、アンビエント サウンドが発生し、そのサウンドに対応するサンプルがコールバックを通じて録音アプリに提供されるときのことを指します。
上記の定義を使用して、デバイス実装では、以下の各プロパティを示す必要があります。
- 100 ミリ秒以下のコールド出力レイテンシ
- 10 ミリ秒以下のウォーム出力レイテンシ
- 45 ミリ秒以下の連続出力レイテンシ
- 100 ミリ秒以下のコールド入力レイテンシ
- 50 ミリ秒以下の連続入力レイテンシ
注: 上記の要件に関して Android 2.3 については「するべき」と記載されていますが、将来のバージョンの互換性定義では「しなければならない」に変更される予定です。つまり、これらの要件は、Android 2.3 では任意ですが、将来のバージョンでは必須になります。Android 2.3 を搭載した既存または新規のデバイスでは、Android 2.3 ではそれらの要件を満たすことが非常に強く推奨されます。そのようにしないと、将来のバージョンにアップグレードした場合に Android の互換性が実現されません。
デバイス実装がこのセクションの要件を満たしている場合は、android.content.pm.PackageManager
クラスにより機能「android.hardware.audio.low-latency」をレポートすることで、低レイテンシ オーディオのサポートをレポートしても問題ありません。[参考資料、27]。逆に、上記の要件を満たさない場合、デバイス実装は低レイテンシ オーディオのサポートをレポートしてはなりません。
6. デベロッパー ツールの互換性
デバイス実装は、Android SDK で提供されている Android デベロッパー ツールをサポートしなければなりません。具体的には、Android 互換デバイスには、以下の対象との互換性がなければなりません。
- Android Debug Bridge(adb)[参考資料、23]
デバイス実装は、Android SDK に記載されているとおり、adb
のすべての機能をサポートしなければなりません。デバイス側のadb
デーモンはデフォルトで無効にすべきですが、Android Debug Bridge をオンにするための、ユーザーがアクセス可能なメカニズムがなければなりません。 - Dalvik Debug Monitor Service(ddms)[参考資料、23]
デバイス実装は、Android SDK に記載されているとおり、ddms
のすべての機能をサポートしなければなりません。ddms
はadb
を使用するため、上記のように、ddms
のサポートはデフォルトで無効にするべきですが、ユーザーが Android Debug Bridge を有効にした場合は必ずサポートしなければなりません。 - Monkey[参考資料、26]
デバイス実装は、Monkey フレームワークを含まなければならず、アプリで使用可能にしなければなりません。
ほとんどの Linux ベースのシステムと Apple Macintosh システムは、追加サポートなしで、標準の Android SDK ツールを使用して Android デバイスを認識します。一方、Microsoft Windows システムは、通常、新しい Android デバイス用のドライバを必要とします(たとえば、新しいベンダー ID や新しいデバイス ID には、Windows システム用のカスタム USB ドライバが必要です)。デバイス実装が標準の Android SDK で提供される adb
ツールによって認識されない場合、デバイス実装者は、デベロッパーが adb
プロトコルを使用してデバイスに接続できるように、Windows ドライバを提供しなければなりません。これらのドライバは、32 ビット版と 64 ビット版の両方で、Windows XP、Windows Vista、Windows 7 用に提供しなければなりません。
7. ハードウェアの互換性
Android は、デバイスの実装者が革新的なフォーム ファクタや設定を開発できるようにすることを目的としています。また、Android デベロッパーは、Android APIs を通じて利用可能なさまざまなハードウェアや機能に依存する革新的なアプリケーションを作成します。このセクションの要件は、デバイスの実装者が利用できる革新性と、アプリが適切に動作するデバイスでのみ利用できるようにするという開発者のニーズとのバランスをとるものです。
サードパーティ デベロッパー向けの対応する 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)
メソッドを介して正確なハードウェア構成情報を正確にレポートしなければなりません。[参考資料、27]
7.1. ディスプレイとグラフィック
Android 2.3 には、さまざまなハードウェア構成でサードパーティ アプリが適切に動作するように、デバイスに合わせてアプリアセットと UI レイアウトを自動的に調整する機能があります [参考資料、28]。このセクションで詳述するように、デバイスはこれらの API と動作を適切に実装しなければなりません。
7.1.1. 画面構成
デバイス実装は、次の要件を満たしていれば、任意のピクセル寸法の画面を使用しても構いません。
- 画面は物理的な対角サイズが 2.5 インチ以上でなければなりません。
- 密度は 100 dpi 以上でなければなりません。
- アスペクト比は、1.333(4:3)から 1.779(16:9)の間でなければなりません。
- 使用されるディスプレイ技術はスクエア ピクセルで構成されています。
上記の要件を満たす画面を搭載したデバイス実装は、互換性があると見なされ、追加の対応は必要ありません。Android フレームワーク実装は、画面サイズのバケットや密度バケットなどのディスプレイ特性を自動的に計算します。ほとんどの場合、フレームワークの決定は適切です。デフォルトのフレームワーク計算を使用する場合、追加の対応は必要ありません。デフォルトを変更するか、上記の要件を満たさない画面を使用することを希望するデバイスの実装者は、セクション 12 の記載に従って、Android 互換性チームに連絡し、指示を求めなければなりません。
上記の要件で使用される単位は、以下のように定義されています:
- 「物理的な対角サイズ」とは、ディスプレイの明るくなっている部分の 2 つの相対する隅の間の距離(インチ単位)です。
- 「dpi」(1 インチあたりのドット数)とは、長さが 1 インチの水平または垂直の直線で囲まれるピクセルの数です。dpi 値が記載されている場合は、水平方向と垂直方向の dpi がいずれも範囲内に収まらなければなりません。
- 「アスペクト比」とは、画面の長辺と短辺の比率です。たとえば、480x854 ピクセルのディスプレイでは、854/480 = 1.779 すなわち約「16:9」です。
デバイス実装には、単一の静的構成を持つディスプレイのみを使用しなければなりません。つまり、デバイス実装では、複数の画面構成を有効にしてはなりません。たとえば、一般的なテレビは 1080p、720p などの複数の解像度をサポートしているため、この構成は Android 2.3 と互換性がありません(ただし、このような構成のサポートは現在調査中であり、将来の Android バージョンでの対応が予定されています)。
7.1.2. ディスプレイの指標
デバイス実装は、android.util.DisplayMetrics
[参考資料、29] で定義されているすべてのディスプレイ指標について正しい値をレポートしなければなりません。
7.1.3. 画面のサポートの宣言
アプリは任意で、AndroidManifest.xml ファイルの <supports-screens>
属性を介して、サポートする画面サイズを示します。デバイス実装は、Android SDK ドキュメントに記載されているように、小、中、大の画面についてアプリが表明しているサポートを正しく尊重しなければなりません。
7.1.4. 画面の向き
互換性のあるデバイスは、アプリが画面の向きを動的に横向きまたは縦向きに変更することをサポートしなければなりません。つまり、デバイスは、特定の画面の向きに関するアプリのリクエストを尊重しなければなりません。デバイス実装は、横向きまたは縦向きのいずれかをデフォルトとして選択しても構いません。物理的に回転できないデバイスは、ポートレート モードを要求するアプリケーションに対して画面の一部のみを使用する「レターボックス表示」を採用することで、この要件を満たしても構いません。
デバイスは、android.content.res.Configuration.orientation、android.view.Display.getOrientation()、またはその他の API を介してクエリされた場合は常に、デバイスの現在の画面の向きについて、正しい値をレポートしなければなりません。
7.1.5. 3D グラフィック アクセラレーション
デバイス実装は、Android 2.3 API に従い、OpenGL ES 1.0 をサポートしなければなりません。3D アクセラレーション ハードウェアを搭載していないデバイスの場合、OpenGL ES 1.0 のソフトウェア実装はアップストリームの Android オープンソース プロジェクトによって提供されます。デバイス実装は OpenGL ES 2.0 をサポートすべきです。
実装では Open GL ES 2.0 のサポートを省略しても構いませんが、サポートを省略した場合、デバイス実装は OpenGL ES 2.0 をサポートしているとレポートしてはなりません。デバイス実装に OpenGL ES 2.0 がサポートされていない場合の詳細:
- マネージド API(
GLES10.getString()
メソッド経由など)は、OpenGL ES 2.0 のサポートをレポートしてはなりません。 - ネイティブ C/C++ OpenGL API(つまり、libGLES_v1CM.so、libGLES_v2.so、または libEGL.so を介してアプリで使用できる API)は、OpenGL ES 2.0 のサポートをレポートしてはなりません。
逆に、デバイス実装が OpenGL ES 2.0 をサポートしている場合、先に挙げた方法で正確にレポートしなければなりません。
なお、Android 2.3 では、アプリで特定の OpenGL テクスチャ圧縮形式を必須に指定できます。これらの形式は通常ベンダー固有です。Android 2.3 では、特定のテクスチャ圧縮形式を実装するためにデバイス実装は必要ありません。ただし、OpenGL API の getString()
メソッドを介して、サポート対象のテクスチャ圧縮形式を正確にレポートするべきです。
7.2. 入力デバイス
Android 2.3 はユーザー入力のために数多くのモダリティをサポートしています。デバイス実装は、このセクションに記載されたユーザー入力デバイスをサポートしなければなりません。
7.2.1. キーボード
デバイス実装は:
- developer.android.com に詳述されているように、サードパーティ デベロッパーがソフト キーボードなどの入力管理エンジンを作成できる入力管理フレームワークをサポートしなければなりません。
- (ハード キーボードが存在するかどうかにかかわらず)少なくとも 1 つのソフト キーボード実装を提供しなければなりません。
- 追加のソフト キーボード実装を含んでも構いません。
- ハードウェア キーボードを含んでも構いません。
android.content.res.Configuration.keyboard
[参考資料、30] で規定されている形式(QWERTY または 12 キー)のいずれかと一致しないハードウェア キーボードを含んではなりません。
7.2.2. タップ以外のナビゲーション
デバイス実装は:
- タップ以外のナビゲーション オプション(つまり、トラックボール、D-pad、ホイール)を省略しても構いません。
android.content.res.Configuration.navigation
[参考資料、30] の正しい値を報告しなければなりません。- 入力管理エンジンと互換性のある、テキストの選択と編集のための妥当な代替ユーザー インターフェース メカニズムを提供しなければなりません。アップストリームの Android オープンソース コードには、タップ以外のナビゲーション入力がないデバイスでの使用に適した選択メカニズムがあります。
7.2.3. ナビゲーション キー
ホーム機能、メニュー機能、戻る機能は、Android のナビゲーション パラダイムに不可欠です。デバイス実装は、アプリの状態にかかわらず、常にこうした機能をユーザーが利用できるようにしなければなりません。これらの機能は、専用のボタンを介して実装すべきです。ソフトウェア、ジェスチャー、タッチパネルなどを使用して実装しても構いませんが、常にアクセス可能でなければならず、アプリが利用する表示領域を隠したり、干渉したりしてはなりません。
デバイス実装者は専用の検索キーも提供すべきです。デバイス実装者は、通話の送信キーと終了キーを提供しても構いません。
7.2.4. タッチスクリーン入力
デバイス実装は:
- タッチスクリーンがなければなりません。
- 静電容量方式または抵抗膜式のタッチスクリーンでも構いません。
- デバイス上の具体的なタッチスクリーンの種類に対応する
android.content.res.Configuration
[参考資料、30] の値をレポートしなければなりません。 - タッチスクリーンが複数のポインタをサポートしている場合、完全に独立してトラックされるポインタをサポートすべきです。
7.3. センサー
Android 2.3 には、さまざまな種類のセンサーにアクセスするための API があります。デバイス実装は、以降のサブセクションに示すとおり、通常、これらのセンサーを省略しても構いません。サードパーティ デベロッパー向けの対応する API を持つ特定のタイプのセンサーがデバイスに搭載されている場合、デバイス実装では、Android SDK ドキュメントに記載されているとおり、対象の API を実装しなければなりません。たとえば、デバイス実装には以下の要件が適用されます。
android.content.pm.PackageManager
クラスに基づいて、センサーの有無を正確に報告しなければなりません。[参考資料、27]SensorManager.getSensorList()
または同様のメソッドを使用して、サポートされているセンサーの正確なリストを返さなければなりません。- 他のすべてのセンサー API について合理的に動作しなければなりません(たとえば、アプリがリスナーの登録を試みたときは適切に true または false を返す、対応するセンサーが存在しないときはセンサー リスナーを呼び出さないなど)。
上記のリストは包括的なものではありません。Android SDK ドキュメントに記載されている動作を、信頼できるものとみなします。
一部のセンサータイプは統合型です。つまり、1 つ以上の他のセンサーが提供するデータから導出できます(そうしたセンサーには、方向センサーや直線加速度センサーがあります)。デバイス実装では、必須の物理センサーが含まれる場合に、これらのセンサータイプを実装するべきです。
Android 2.3 API では、「ストリーミング」センサーの概念が導入されています。これは、データが変更されたときだけでなく、継続的にデータを返すセンサーです。デバイス実装は、Android 2.3 SDK ドキュメントでストリーミング センサーであると示されている API について、定期的なデータサンプルを継続的に提供しなければなりません。
7.3.1. 加速度計
デバイス実装は、3 軸加速度計を含むべきです。3 軸加速度計が含まれる場合、デバイス実装は:
- 50 Hz 以上でイベントを配信できなければなりません。
- Android API で詳述されているとおり、Android センサー座標系を遵守しなければなりません([参考資料、31] を参照)。
- 任意の 3 次元ベクトルについて、自由落下から重力の 2 倍(2g)以上まで測定できなければなりません。
- 正確度が 8 ビット以上でなければなりません。
- 標準偏差が 0.05 m/s^2 以下でなければなりません。
7.3.2. 磁力計
デバイス実装は 3 軸磁力計(コンパス)を含むべきです。3 軸磁力計が含まれる場合、デバイスは:
- 10 Hz 以上でイベントを配信できなければなりません。
- Android API で詳述されているとおり、Android センサー座標系を遵守しなければなりません([参考資料、31] を参照)。
- 地球磁場をカバーするのに十分な磁場強度の範囲をサンプリングできなければなりません。
- 正確度が 8 ビット以上でなければなりません。
- 標準偏差が 0.5 µT 以下でなければなりません。
7.3.3. GPS
デバイス実装は GPS レシーバーを含むべきです。デバイス実装に GPS レシーバーが含まれる場合は、GPS ロックオン時間を最小化するために、なんらかの「アシスト GPS」技術を含めるべきです。
7.3.4. ジャイロスコープ
デバイス実装はジャイロスコープ(角度変化センサー)を含むべきです。デバイスは、3 軸加速度計も含まない限り、ジャイロスコープ センサーを含むべきではありません。デバイス実装がジャイロスコープを含む場合は、以下の要件が適用されます。
- 最大で 5.5*Pi ラジアン/秒(つまり、毎秒約 1,000 度)の方向変化を測定できなければなりません。
- 100 Hz 以上でイベントを配信できなければなりません。
- 正確度が 8 ビット以上でなければなりません。
7.3.5. 気圧計
デバイス実装は気圧計(周囲気圧センサー)を含んでいても構いません。気圧計が含まれる場合、デバイス実装は:
- 5 Hz 以上でイベントを配信できなければなりません。
- 標高を推定するのに十分な精度がなければなりません。
7.3.7. 温度計
デバイス実装は温度計(温度センサー)を含んでも構いませんが、含むべきではありません。温度計を含む場合、デバイス実装はデバイス CPU の温度を測定しなければなりません。他の温度を測定してはなりません(このセンサータイプは Android 2.3 API で非推奨になりました)。
7.3.7. 光度計
デバイス実装は、光度計(周囲光センサー)を含んでも構いません。
7.3.8. 近接センサー
デバイス実装は近接センサーを含んでも構いません。近接センサーを含む場合、デバイス実装は画面と同じ方向にある物体の近さを測定しなければなりません。つまり、近接センサーは、画面の近くにある物体を検出するような向きでなければなりません。これは、この種のセンサーが主として、スマートフォンがユーザーにより使用中であることを検出するのを目的としているためです。他の方向を向いている近接センサーを含む場合、デバイス実装はそのような API からアクセス可能であってはなりません。デバイス実装が近接センサーを含む場合、その正確度は 1 ビット以上でなければなりません。
7.4. データ接続
ネットワークの接続性とインターネットへのアクセスは、Android. の重要な機能です。一方で、デバイス間のインタラクションは、Android デバイスやアプリケーションに大きな付加価値を与えます。デバイス実装では、このセクションのデータ接続要件を満たさなければなりません。
7.4.1. 電話
Android 2.3 API とこのドキュメントで使用する「電話」は、特に、GSM または CDMA ネットワークを介して行う音声通話と SMS メッセージの送信に関連するハードウェアのことを指します。こうした音声通話は、パケット交換であってもそうでなくても構いませんが、Android 2.3 では、同じネットワークを使用して実装されるデータ接続からは独立しているとみなされます。つまり、Android の「電話」機能と API は、特に音声通話と SMS のことを指します。たとえば、発信や SMS メッセージの送受信ができないデバイス実装は、データ接続にモバイル ネットワークを使用するかどうかにかかわらず、「android.hardware.telephony」機能またはサブ機能をレポートしてはなりません。
Android 2.3 は、電話ハードウェアを含まないデバイスに使用しても構いません。つまり、Android 2.3 はスマートフォンではないデバイスに対応しています。ただし、デバイス実装に GSM または CDMA の電話が含まれる場合、その技術の API の完全なサポートを実装しなければなりません。テレフォニー ハードウェアを含まないデバイス実装は、完全な API を NoOps として実装しなければなりません。
7.4.2. IEEE 802.11(Wi-Fi)
Android 2.3 デバイス実装は、1 つ以上の形式の 802.11(b/g/a/n など)をサポートするべきです。802.11 のサポートが含まれる場合、デバイス実装は、対応する Android API を実装しなければなりません。
7.4.3. Bluetooth
デバイス実装は Bluetooth トランシーバーを含むべきです。Bluetooth トランシーバーを含むデバイス実装は、SDK ドキュメント [参考資料、32] に記載されているとおり、RFCOMM ベースの Bluetooth API を有効にしなければなりません。デバイス実装では、デバイスに応じて、A2DP、AVRCP、OBEX など、関連する Bluetooth プロファイルを実装するべきです。
互換性テストスイートには、Android RFCOMM Bluetooth API の基本的なオペレーションに関するケースが含まれます。ただし、Bluetooth はデバイス間の通信プロトコルであるため、1 台のデバイスで実行される単体テストで完全にテストすることはできません。したがって、デバイス実装は、付録 A に記載されている人間による Bluetooth のテスト手順も満たさなければなりません。
7.4.4. 近距離無線通信
デバイス実装は、近距離無線通信(NFC)用のトランシーバーと関連ハードウェアを含むべきです。NFC ハードウェアが含まれる場合、デバイス実装は:
android.content.pm.PackageManager.hasSystemFeature()
メソッドを介して android.hardware.nfc 機能を報告しなければなりません。[参考資料、27]- 次の NFC 規格を使用して、NDEF メッセージの読み取りと書き込みができなければなりません。
- 次の NFC 規格を使用して、NFC フォーラムのリーダー / ライター(NFC フォーラムの技術仕様 NFCForum-TS-DigitalProtocol-1.0 で定義)として動作できなければなりません。
- NfcA(ISO14443-3A)
- NfcB(ISO14443-3B)
- NfcF(JIS 6319-4)
- NfcV(ISO 15693)
- IsoDep(ISO 14443-4)
- NFC フォーラムのタグタイプ 1、2、3、4(NFC フォーラムにより定義)
- 以下のピアツーピア標準とプロトコルを使用してデータを送受信できなければなりません。
- ISO 18092
- LLCP 1.0(NFC フォーラムにより定義)
- SDP 1.0(NFC フォーラムにより定義)
- NDEF プッシュ プロトコル [参考資料、33]
- NFC 検出モードにあるとき、サポートされているすべての技術をスキャンしなければなりません。
- 画面がアクティブの状態でデバイスが起動しているときは、NFC 検出モードになるべきです
(なお、上記の JIS、ISO、NFC フォーラムの仕様について、一般公開されているリンクはありません)。
さらに、デバイス実装では、以下の広く導入されている MIFARE 技術をサポートするべきです。
- MIFARE Classic(NXP MF1S503x [参考資料、34]、MF1S703x [参考資料、35])
- MIFARE Ultralight(NXP MF0ICU1 [参考資料、36]、MF0ICU2 [参考資料、37])
- MIFARE Classic の NDEF(NXP AN130511 [参考資料、38]、AN130411 [参考資料、39])
Android 2.3.3 には、これらの MIFARE タイプの API が含まれています。デバイス実装で MIFARE をサポートする場合:
- Android SDK ドキュメントに記載されているように、対応する Android API を実装しなければなりません。
android.content.pm.PackageManager.hasSystemFeature()
メソッドを介して機能 com.nxp.mifare をレポートしなければなりません[参考資料、27]。なお、これは標準の Android 機能ではないため、PackageManager
クラスの定数としては表示されません。- このセクションに記載されているように、一般的な NFC サポートも実装しない限り、対応する Android API を実装してはならず、com.nxp.mifare 機能をレポートしてはなりません。
NFC ハードウェアが含まれない場合、デバイス実装では
android.content.pm.PackageManager.hasSystemFeature()
メソッドから android.hardware.nfc 機能を宣言してはなりません [参考資料、27]。また、Android 2.3 NFC API を NoOps として実装しなければなりません。android.nfc.NdefMessage
クラスとandroid.nfc.NdefRecord
クラスはプロトコルに依存しないデータ表現形式を表すため、デバイス実装では NFC がサポートされていない場合や android.hardware.nfc 機能を宣言している場合でも、これらの API を実装しなければなりません。7.4.5. 最低限のネットワーク機能
デバイス実装は、1 つ以上の形式のデータ ネットワーキングのサポートを含まなければなりません。具体的には、デバイス実装は 200 Kbit/秒以上を実現できるデータ標準を少なくとも 1 つサポートしなければなりません。この要件を満たす技術の例としては、EDGE、HSPA、EV-DO、802.11g、イーサネットなどがあります。
物理ネットワーキング標準(イーサネットなど)がプライマリ データ接続になっているデバイス実装は、802.11(Wi-Fi)などの一般的なワイヤレス データ標準も少なくとも 1 つサポートするべきです。
デバイスは、複数の形式のデータ接続を実装しても構いません。
7.5. カメラ
デバイス実装は背面カメラを含むべきであり、前面カメラを含んでも構いません。背面カメラとは、デバイスのディスプレイとは反対側に配置されたカメラのことです。つまり、従来のカメラのようにデバイスの向こう側の光景を撮影するものです。前面カメラとは、デバイスのディスプレイと同じ側に配置されたカメラのことです。つまり、通常はビデオ会議や類似のアプリなどでユーザーを撮影するために使用されるカメラです。
7.5.1. 背面カメラ
デバイス実装は背面カメラを含むべきです。デバイス実装が背面カメラを含む場合は、以下の要件が適用されます。
- 解像度が少なくとも 2 メガピクセルでなければなりません。
- カメラドライバでハードウェア オートフォーカスまたはソフトウェア オートフォーカスを実装すべきです(アプリ ソフトウェアに対して透過的)。
- 固定フォーカスまたは EDOF(拡張被写界深度)のハードウェアがあっても構いません。
- フラッシュを含んでも構いません。カメラがフラッシュを含む場合、android.hardware.Camera.PreviewCallback インスタンスがカメラ プレビュー サーフェスに登録されている間は、アプリが
Camera.Parameters
オブジェクトのFLASH_MODE_AUTO
属性またはFLASH_MODE_ON
属性を有効にすることによってフラッシュを明示的に有効にしていない限り、フラッシュ ランプを点灯してはなりません。なお、この制約はデバイスの内蔵システム カメラアプリには適用されず、Camera.PreviewCallback
を使用するサードパーティ アプリにのみ適用されます。
7.5.2. 前面カメラ
デバイス実装は前面カメラを含んでも構いません。デバイス実装が前面カメラを含む場合は、以下の要件が適用されます。
- 解像度が少なくとも VGA(つまり、640x480 ピクセル)でなければなりません。
- 前面カメラを Camera API のデフォルトとして使用してはなりません。つまり、Android 2.3 の Camera API には前面カメラに対する特定のサポートが含まれており、デバイス実装は、たとえデバイス上の唯一のカメラであったとしても、前面カメラをデフォルトの背面カメラとして扱うように API を構成してはなりません。
- セクション 7.5.1 に記載されているとおり、背面カメラで利用できる機能(オートフォーカス、フラッシュなど)を含めても問題ありません。
- 次に示すように、カメラ プレビューで、アプリによって表示されるストリームを水平方向に反映(つまりミラーリング)しなければなりません。
- デバイス実装がユーザーによる回転(たとえば、加速度計による自動的な回転またはユーザー入力による手動の回転)に対応している場合は、デバイスの現在の向きに対して水平にカメラ プレビューをミラーリングしなければなりません。
- 現在のアプリが
android.hardware.Camera.setDisplayOrientation()
[参考資料、40] メソッドを呼び出してカメラ ディスプレイの回転を明示的にリクエストした場合は、アプリが指定した向きに対して水平にカメラ プレビューをミラーリングしなければなりません。 - それ以外の場合は、デバイスのデフォルトの水平軸に沿ってプレビューをミラーリングしなければなりません。
- カメラ プレビューの画像ストリームと同じ方法で、「ポストビュー」カメラ コールバック ハンドラに返される画像データをミラーリングしなければなりません(デバイス実装がポストビュー コールバックをサポートしていない場合、この要件は明確には適用されません)。
- 最終的にキャプチャされた静止画像または動画ストリーム(アプリのコールバックに対して返されたか、メディア ストレージにコミットされたもの)をミラーリングしてはなりません。
7.5.3. カメラ 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 がデフォルトでなければなりません。
- デバイス実装は、前面カメラと背面カメラの両方のカメラ プレビュー用に YV12 形式(
android.graphics.ImageFormat.YV12
定数で表されます)をサポートすべきです。将来のバージョンの互換性定義では、この要件が「しなければならない」に変更される予定です。つまり、YV12 のサポートは、Android 2.3 では任意ですが、将来のバージョンでは必須になります。Android 2.3 を搭載した既存または新規のデバイスでは、Android 2.3 ではこの要件を満たすことが非常に強く推奨されます。そのようにしないと、将来のバージョンにアップグレードした場合に Android の互換性が実現されません。
デバイス実装では、デバイスにハードウェア オートフォーカスなどの機能があるかどうかにかかわらず、Android 2.3 SDK のドキュメント [参考資料、41] に含まれるカメラ API を完全に実装しなければなりません。たとえば、オートフォーカスのないカメラは、(オートフォーカスのないカメラには関係がなくとも)登録された
android.hardware.Camera.AutoFocusCallback
インスタンスを引き続き呼び出さなければなりません。なお、これは前面カメラに適用されます。たとえば、ほとんどの前面カメラはオートフォーカスをサポートしませんが、それでも前述のように API コールバックを「偽装」しなければなりません。デバイス実装は、基盤となるハードウェアがこの機能をサポートしている場合、
android.hardware.Camera.Parameters
クラスの定数として定義された各パラメータ名を認識し、尊重しなければなりません。デバイス ハードウェアが機能をサポートしていない場合、API はドキュメントに記載されているとおりに動作しなければなりません。逆に、デバイス実装はandroid.hardware.Camera.Parameters
で定数として記述されているもの以外の、android.hardware.Camera.setParameters()
メソッドに渡された文字列定数を使用または認識してはなりません。つまりデバイス実装は、ハードウェアが許すならば標準的なカメラ パラメータをすべてサポートしなければならず、カスタムのカメラ パラメータ タイプをサポートしてはなりません。7.5.4. カメラの向き
前面カメラと背面カメラは(存在する場合)、両方ともカメラの長辺が画面の長辺と揃うように向きを調整しなければなりません。つまり、デバイスが横向きで保持されている場合、カメラは横向きで画像をキャプチャしなければなりません。これは、デバイスの自然な向きに関係なく適用されます。つまり、横向き主体のデバイスにも、縦向き主体のデバイスにも適用されます。
7.6. メモリとストレージ
Android 2.3 の基本的な機能はアプリを実行することです。デバイス実装は、このセクションの要件を満たさなければならず、アプリが適切に動作するために十分なストレージとメモリを確保する必要があります。
7.6.1. 最小のメモリとストレージ
デバイス実装には、カーネルとユーザー空間で使用できるメモリが少なくとも 128 MB 存在しなければなりません。この 128 MB は、カーネルの制御下にない無線やメモリなどのハードウェア コンポーネント専用のメモリとは別に用意しなければなりません。
デバイス実装には、ユーザーデータに使用できる不揮発性ストレージが少なくとも 150 MB 存在しなければなりません。つまり、
/data
パーティションは少なくとも 150 MB でなければなりません。上記の要件に加えて、デバイス実装には、ユーザーデータに使用できる不揮発性ストレージが少なくとも 1 GB 存在すべきです。なお、この高い要件は、将来の Android バージョンでは必須の最小要件となる予定です。デバイス実装は、今すぐこれらの要件を満たすことが強く推奨されます。そのようにしないと、将来のバージョンの Android との互換性が得られなくなる可能性があります。
Android API には、アプリがデータファイルをダウンロードするために使用しても構わないダウンロード マネージャーが含まれています。ダウンロード マネージャーの実装は、サイズが 55 MB 以上の個々のファイルをダウンロードできなければなりません。ダウンロード マネージャーの実装は、サイズが 100 MB 以上の個々のファイルをダウンロードできるようにすべきです。
7.6.2. アプリ共有ストレージ
デバイス実装は、アプリに共有ストレージを提供しなければなりません。提供する共有ストレージのサイズは少なくとも 1 GB でなければなりません。
デバイス実装は、デフォルトでマウントされる共有ストレージをすぐに使えるように構成されていなければなりません。共有ストレージが Linux パス
/sdcard
にマウントされない場合、デバイスは、/sdcard
から実際のマウント ポイントへの Linux シンボリック リンクを含まなければなりません。デバイス実装は、この共有ストレージに対する
android.permission.WRITE_EXTERNAL_STORAGE
権限を、ドキュメントに記載されているとおりに適用しなければなりません。そうしない場合、共有ストレージは、その権限を取得するすべてのアプリから書き込み可能でなければなりません。デバイス実装は、ユーザーによるアクセスが可能なリムーバブル ストレージ(セキュア デジタル カードなど)のハードウェアを備えていても構いません。または、アプリ用の共有ストレージとして内部(非リムーバブル)ストレージを割り当てても構いません。
デバイス実装は、使用される共有ストレージの形式にかかわらず、USB マスストレージやメディア転送プロトコルなど、ホスト コンピュータから共有ストレージの内容にアクセスするなんらかのメカニズムを提供しなければなりません。
説明のために 2 つの一般的な例を示します。デバイス実装に共有ストレージ要件を満たす SD カード スロットが含まれる場合、FAT でフォーマットされた 1 GB 以上の SD カードがユーザーに販売されるデバイスに付属し、デフォルトでマウントされなければなりません。または、デバイス実装がこの要件を満たすために内部固定ストレージを使用する場合、そのストレージは 1 GB 以上で、
/sdcard
にマウントされなければなりません(/sdcard
は、物理的な場所以外にマウントされる場合、物理的な場所へのシンボリック リンクでなければなりません)。複数の共有ストレージパス(SD カードスロットと共有内部ストレージの両方など)を含むデバイス実装については、メディア スキャナや ContentProvider などのコアアプリを変更して、両方の場所に配置されたファイルを透過的にサポートするべきです。
7.7. USB
デバイス実装は:
- 標準の USB-A ポートで USB ホストに接続できる USB クライアントを実装しなければなりません。
- USB 経由の Android Debug Bridge を実装しなければなりません(セクション 7 を参照)。
- デバイスに接続されているホストが /sdcard ボリュームの内容にアクセスできるように、USB マスストレージの仕様を実装しなければなりません。
- デバイス側でマイクロ USB フォーム ファクタを使用すべきです。
- デバイス側に標準以外のポートを含めても構いませんが、その場合、カスタムピン配列を標準 USB-A ポートに接続できるケーブルが付属していなければなりません。
8. パフォーマンスの互換性
互換性のある実装は、デバイス上でアプリが単に正しく動作するだけでなく、妥当なパフォーマンスと全体的に優れたユーザー エクスペリエンスをアプリが提供できるようにしなければなりません。デバイス実装は、以下の表で定義されている Android 2.3 対応デバイスの主要なパフォーマンス指標を満たさなければなりません。
指標 パフォーマンスしきい値 コメント アプリ起動時間 次のアプリは、示された時間内に起動すべきです。 - ブラウザ: 1,300 ミリ秒未満
- MMS / SMS: 700 ミリ秒未満
- 目覚まし時計: 650 ミリ秒未満
起動時間は、アプリのデフォルト アクティビティの読み込みを完了するまでにかかる合計時間として測定されます。これには、Linux プロセスを開始し、Android パッケージを Dalvik VM に読み込み、onCreate を呼び出すのに要する時間が含まれます。 同時アプリ 複数のアプリが起動されている場合、起動後に実行中のアプリを再起動するまでにかかる時間は、元の起動時間より短くなければなりません。 9. セキュリティ モデルの互換性
デバイス実装は、Android デベロッパー向けドキュメントに含まれる API のセキュリティと権限に関するリファレンス ドキュメント [参考資料、42] で定義されている Android プラットフォームのセキュリティ モデルと整合するセキュリティ モデルを実装しなければなりません。デバイス実装は、サードパーティ / 認証局からの追加の許可 / 証明書を必要とすることなく、自己署名アプリのインストールをサポートしなければなりません。具体的には、互換性のあるデバイスは、以降のサブセクションに記載されているセキュリティ メカニズムをサポートしなければなりません。
9.1. 権限
デバイス実装は、Android デベロッパー向けドキュメント [参考資料、42] で定義されている Android 権限モデルをサポートしなければなりません。具体的には、SDK ドキュメントで規定されているとおり各権限を適用しなければならず、権限を省略、変更、無視することはできません。実装は、新しい権限 ID 文字列が android.* 名前空間になければ、権限を追加しても構いません。
9.2. UID とプロセスの分離
デバイス実装は、Android アプリ サンドボックス モデル(各アプリが個別のプロセスで一意の Unix 形式の UID として動作するモデル)をサポートしなければなりません。デバイス実装は、セキュリティと権限に関するリファレンス [参考資料、42] の規定に従ってアプリが適切に署名され、構築されている場合は、同じ Linux ユーザー ID での複数のアプリの実行をサポートしなければなりません。
9.3. ファイルシステムの権限
デバイス実装は、セキュリティと権限に関するリファレンス [参考資料、42] で規定されているとおり、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 など)をアプリが利用する必要がある場合、代替ランタイムは、アプリがそのリソースにアクセスできることをユーザーに通知しなければなりません。ランタイム環境がこの方法でアプリの機能を記録しない場合、ランタイム環境は、そのランタイムを使用してアプリをインストールするときに、そのランタイムが持つすべての権限をリストしなければなりません。
10. ソフトウェア互換性テスト
Android オープンソース プロジェクトには、デバイス実装に互換性があることを検証するためのさまざまなテストツールが含まれています。デバイス実装は、このセクションに記載されているすべてのテストに合格しなければなりません。
しかし、完全に包括的なソフトウェア テスト パッケージというものはありません。このため、デバイス実装者は、Android オープンソース プロジェクトから入手できる Android 2.3 のリファレンス実装と優先実装に対して行う変更を可能な限り最小限に抑えることを強くおすすめします。これにより、互換性の問題をもたらすバグが導入され、再作業やデバイスのアップデートが必要となるリスクを最小限に抑えることができます。
10.1. 互換性テストスイート
デバイス実装は、デバイス上の最終出荷ソフトウェアを使用して、Android オープンソース プロジェクトから入手できる Android 互換性テストスイート(CTS)[参考資料、2] に合格しなければなりません。さらに、デバイス実装者は可能な限り Android オープンソース ツリーのリファレンス実装を使用すべきであり、CTS で不明確な点があった場合やリファレンス ソースコードの一部を再実装する場合に互換性を確保しなければなりません。
CTS は、実際のデバイスで動作するように設計されています。他のソフトウェアと同様に、CTS 自体にもバグが含まれている可能性があります。CTS はこの互換性定義とは別にバージョニングされ、Android 2.3 用に CTS の複数のリビジョンがリリースされる可能性があります。デバイス実装は、デバイス ソフトウェアが完成した時点で利用可能な最新バージョンの CTS に合格しなければなりません。
デバイス実装のソフトウェアが完成した時点で利用可能な最新バージョンの Android 互換性テストスイート(CTS)に合格しなければなりません(CTS は、Android オープンソース プロジェクト [参考資料、2] の一部として公開されています)。CTS は、このドキュメントで説明するコンポーネントの多くをテストしますが、すべてではありません。
10.2. CTS 検証ツール
デバイス実装は、CTS 検証ツールですべての該当するケースを正しく実行しなければなりません。CTS 検証ツールは互換性テストスイートに付属しており、カメラとセンサーの正常な動作など、自動システムではテストできない機能をテストするために人間のオペレーターが実行します。
CTS 検証ツールには、オプションのハードウェアを含め、さまざまな種類のハードウェア用のテストがあります。デバイス実装は、搭載しているハードウェア用のすべてのテストに合格しなければなりません。たとえば、デバイスに加速度計が搭載されている場合は、CTS 検証ツールで加速度計のテストケースが正しく実行されなければなりません。この互換性定義ドキュメントで任意と記載されている機能のテストケースは、スキップまたは省略しても構いません。
前述のとおり、すべてのデバイスとすべてのビルドで、CTS 検証ツールが正しく実行されなければなりません。ただし、ビルドの多くは非常に類似しているため、デバイス実装者は、わずかな違いのみが存在するビルドで CTS 検証ツールを明示的に実行することは求められていません。具体的には、CTS 検証ツールに合格した実装との違いが、含まれるロケール、ブランディングなどのセットのみであるデバイス実装は、CTS 検証ツールのテストを省略しても問題ありません。
10.3. リファレンス アプリケーション
デバイス実装者は、次のオープンソース アプリを使用して実装の互換性をテストしなければなりません。
- 「Android 向けアプリ」アプリ [参考資料、43]。
- Replica Island(Android マーケットで入手可能、OpenGL ES 2.0 でサポートするデバイス実装の場合にのみ必須)
上記の各アプリは、実装が互換性を持つとみなされるように、実装で正しく起動して動作しなければなりません。
11. アップデート可能なソフトウェア
デバイス実装は、システム ソフトウェア全体を置き換えるメカニズムを含まなければなりません。このメカニズムは、「ライブ」アップグレードを実施する必要はありません。つまり、デバイスの再起動が必要となっても構いません。
デバイスにプリインストールされているソフトウェア全体を置き換えることができるのであれば、どの方法でも使用できます。たとえば、次のどの方法も、この要件を満たします。
- 再起動によるオフライン アップデートを伴う無線(OTA)ダウンロード
- ホスト PC から USB 経由で行う「テザリング」アップデート
- 再起動による「オフライン」アップデートとリムーバブル ストレージ上のファイルからのアップデート
使用するアップデート メカニズムは、ユーザーデータをワイプせずにアップデートをサポートしなければなりません。なお、アップストリームの Android ソフトウェアには、この要件を満たすアップデート メカニズムが含まれています。
リリース後に、ただし妥当な製品寿命の期間内にデバイス実装でエラーが見つかり、Android 互換性チームとの協議において、サードパーティ アプリの互換性に影響を与えると判断された場合、デバイス実装者は前述のメカニズムによって適用できる、利用可能なソフトウェア アップデートを介してエラーを修正しなければなりません。
12. お問い合わせ
ご不明な点やドキュメントでカバーされていないと思われる問題については、ドキュメントの作成者あてに compatibility@android.com までお問い合わせください。
付録 A - Bluetooth のテスト手順
互換性テストスイートには、Android RFCOMM Bluetooth API の基本的なオペレーションに関するケースが含まれます。ただし、Bluetooth はデバイス間の通信プロトコルであるため、1 台のデバイスで実行される単体テストで完全にテストすることはできません。したがって、デバイス実装は、以下に記載する人間による Bluetooth テスト手順にも適合していなければなりません。
テスト手順は、Android オープンソース プロジェクト ツリーに含まれている BluetoothChat サンプルアプリに基づいています。この手順では、次の 2 つのデバイスが必要です。
- テスト対象のソフトウェア ビルドを実行するデバイス実装候補
- 互換性があることがわかっている別のデバイス実装であって、テスト対象のデバイス実装のモデルであるもの(「既知の正常な」デバイス実装)
以下のテスト手順では、これらのデバイスをそれぞれ「候補」デバイス、「既知の正常な」デバイスと呼んでいます。
設定とインストール
- Android ソースコード ツリーの「make samples」を使用して BluetoothChat.apk をビルドします。
- 既知の正常なデバイスに BluetoothChat.apk をインストールします。
- 候補デバイスに BluetoothChat.apk をインストールします。
アプリによる Bluetooth コントロールのテスト
- Bluetooth を無効にした状態で、候補のデバイスで Bluetooth チャットを起動します。
- 候補デバイスが Bluetooth をオンにするか、Bluetooth をオンにするよう促すダイアログを表示することを確認します。
ペア設定と通信をテストする
- 両方のデバイスで Bluetooth チャットアプリを起動します。
- メニューを使用して既知の正常なデバイスを BluetoothChat 内で検出できるようにします。
- 候補デバイスで、メニューを使用して BluetoothChat 内から Bluetooth デバイスをスキャンし、既知の正常なデバイスとペア設定します。
- 各デバイスから 10 件以上のメッセージを送信し、別のデバイスで正しく受信されたことを確認します。
- 両方のデバイスの Bluetooth アプリをホームを押して閉じます。
- デバイス設定アプリを使用して、各デバイスとのペア設定を解除します。
逆方向のペア設定と通信をテストする
- 両方のデバイスで Bluetooth チャットアプリを起動します。
- Bluetooth チャットから候補デバイスを検出可能にします(メニューを使用)。
- 既知の正常なデバイスで、メニューを使用して Bluetooth チャット内で Bluetooth デバイスをスキャンし、候補デバイスとペア設定します。
- 各デバイスから 10 件のメッセージを送信し、別のデバイスで正しく受信していることを確認します。
- [戻る] を繰り返し押してランチャーに移動し、両方のデバイスの Bluetooth チャットアプリを閉じます。
テストの再リリース
- 両方のデバイスで Bluetooth チャットアプリを再起動します。
- 各デバイスから 10 件のメッセージを送信し、別のデバイスで正しく受信していることを確認します。
注: 上記のテストでは、ホームを使用してテスト セクションを終了するケースと、戻るセクションを使用するケースがあります。これらのテストは冗長ではなく、また任意ではありません。その目的は、アクティビティを明示的に終了した場合に(ユーザーが「戻る」を押して、finish() を呼び出すことで)Bluetooth API とスタックが正しく機能することを確認し、暗黙的にバックグラウンドに送信される(ユーザーがホームを押すことによって)ようにすることです。各テスト シーケンスは、説明のとおりに実行しなければなりません。
- 次の NFC 規格を使用して、NFC フォーラムのリーダー / ライター(NFC フォーラムの技術仕様 NFCForum-TS-DigitalProtocol-1.0 で定義)として動作できなければなりません。