1. 簡介
本文件列舉了裝置必須符合的條件,才能與 Android 11 相容。
使用「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」和「OPTIONAL」時,請遵循 RFC2119 中定義的 IETF 標準。
本文所用的「裝置實作者」或「實作者」是指開發搭載 Android 11 的硬體/軟體解決方案的人員或機構。「裝置實作」或「實作」是指所開發的硬體/軟體解決方案。
如要與 Android 11 相容,裝置實作方式必須符合本相容性定義中列明的規定,包括透過參考整合的任何文件。
如果這個定義或 第 10 節所述的軟體測試未明確說明或不完整,裝置導入者有責任確保與現有導入作業的相容性。
因此,Android 開放原始碼計畫是 Android 的參考和偏好實作項目。強烈建議裝置實作者盡可能以「上游」原始碼為基礎,從 Android 開放原始碼計畫取得原始碼。雖然部分元件可假設以其他實作項目取代,但強烈建議您不要採用這種做法,因為通過軟體測試的難度會大幅提高。實作者有責任確保與標準 Android 實作方式完全相容,包括相容性測試套件和其他測試。最後,請注意,本文件明確禁止某些元件的替換和修改。
本文所連結的許多資源都是直接或間接從 Android SDK 衍生而來,因此功能上與該 SDK 說明文件中的資訊相同。無論何時,如果本相容性定義或相容性測試套件與 SDK 說明文件不一致,SDK 說明文件都會視為權威來源。本文件中連結的資源提供的任何技術細節,都視為是本相容性定義的一部分。
1.1 文件結構
1.1.1. 依裝置類型劃分的規定
第 2 節包含適用於特定裝置類型的所有規定。第 2 節的每個子節專門說明特定裝置類型。
其他適用於所有 Android 裝置實作的規定,會列在 第 2 節後面的各個部分。本文件將這些需求稱為「核心需求」。
1.1.2. 需求 ID
系統會為「必須」需求指派需求 ID。
- 這個 ID 只會指派給「必須」規定。
- 強烈建議的規定會標示為 [SR],但不會指派 ID。
- 這個 ID 包含:裝置類型 ID - 條件 ID - 需求 ID (例如 C-0-1)。
每個 ID 的定義如下:
- 裝置類型 ID (詳情請參閱「2. 裝置類型)
- C:核心 (適用於任何 Android 裝置實作的規定)
- H:Android 手持裝置
- T:Android TV 裝置
- 答:Android Automotive 實作
- W:Android Watch 實作
- 分頁:Android 平板電腦實作
- 條件 ID
- 如果要求條件為無條件,則此 ID 會設為 0。
- 如果條件為條件式,系統會為第 1 個條件指派 1,並在同一節和相同裝置類型中將數字遞增 1。
- 需求 ID
- 這個 ID 會從 1 開始,在相同的部分和相同條件下遞增 1。
1.1.3. 2 節中的規範 ID
第 2 節中的規範 ID 開頭為對應的部分 ID,後面接著上方所述的規範 ID。
- 第 2 節中的 ID 包含以下內容:節 ID / 裝置類型 ID - 條件 ID - 需求 ID (例如 7.4.3/A-0-1)。
2. 裝置類型
雖然 Android 開放原始碼專案提供可用於各種裝置類型和板型規格的軟體堆疊,但仍有少數裝置類型擁有較完善的應用程式發行生態系統。
本節將說明這些裝置類型,以及適用於每種裝置類型的其他規定和建議。
所有不屬於任何所述裝置類型的 Android 裝置實作,仍須符合本相容性定義其他部分的所有規定。
2.1 裝置設定
如要瞭解不同裝置類型的硬體設定主要差異,請參閱本節後續的裝置專屬規定。
2.2. 手持裝置需求條件
Android 手持裝置是指通常需要手持的 Android 裝置實作,例如 mp3 播放器、手機或平板電腦。
如果 Android 裝置實作符合下列所有條件,就會歸類為手持裝置:
- 使用可隨身攜帶的電源,例如電池。
- 對角線螢幕尺寸介於 3.3 英寸 (或搭載 Android 11 以下 API 級別的裝置為 2.5 英寸) 至 8 英寸之間。
本節其餘部分的其他規定,適用於 Android 手持裝置的實作。
2.2.1. 硬體
手持裝置實作方式:
如果手持裝置實作項目支援軟體螢幕旋轉功能,則必須:
- [7.1.1.1/H-1-1]* 為第三方應用程式提供的邏輯螢幕,短邊至少須為 2 英寸,長邊至少須為 2.7 英寸。在 API 級別較低的裝置上推出的應用程式不受此規定限制。
如果手持裝置實作不支援軟體螢幕旋轉功能,則會發生以下情況:
- [7.1.1.1/H-2-1]* 為第三方應用程式提供的邏輯螢幕,其短邊至少須為 2.7 英寸。在 API 級別較低的裝置上推出的應用程式不受此規定限制。
如果手持裝置實作項目透過 Configuration.isScreenHdr()
聲稱支援高動態範圍螢幕,則會:
- [7.1.4.5/H-1-1] 必須宣傳支援
EGL_EXT_gl_colorspace_bt2020_pq
、EGL_EXT_surface_SMPTE2086_metadata
、EGL_EXT_surface_CTA861_3_metadata
、VK_EXT_swapchain_colorspace
和VK_EXT_hdr_metadata
擴充功能。
手持裝置實作方式:
- [7.1.4.6/H-0-1] 必須透過系統屬性
graphics.gpu.profiler.support
回報裝置是否支援 GPU 剖析功能。
如果手持裝置實作項目透過系統屬性 graphics.gpu.profiler.support
宣告支援,則會:
- [7.1.4.6/H-1-1] 必須將 protobuf 追蹤記錄做為輸出內容,且該追蹤記錄必須符合 Perfetto 說明文件中定義的 GPU 計數器和 GPU 轉譯階段的架構。
- [7.1.4.6/H-1-2] 必須依照 gpu 計數器追蹤封包 proto,回報裝置 GPU 計數器的符合規範值。
- [7.1.4.6/H-1-3] 必須根據轉譯階段追蹤資料包的 proto,回報裝置 GPU 轉譯階段的符合規範值。
- [7.1.4.6/H-1-4] 必須依照以下格式回報 GPU 頻率追蹤點:power/gpu_frequency。
手持裝置實作方式:
- [7.1.5/H-0-1] 必須支援由上游 Android 開放原始碼實作的舊版應用程式相容性模式。也就是說,裝置實作方式不得變更觸發條件或相容性模式的啟用門檻,也不得變更相容性模式本身的行為。
- [7.2.1/H-0-1] 必須支援第三方輸入法編輯器 (IME) 應用程式。
- [7.2.3/H-0-3] 在所有提供主畫面的 Android 相容螢幕上,必須提供「Home」功能。
- [7.2.3/H-0-4] 必須在所有 Android 相容螢幕上提供「返回」功能,並在至少一個 Android 相容螢幕上提供「近期」功能。
- [7.2.3/H-0-2] 必須將返回功能 (
KEYCODE_BACK
) 的一般和長按事件傳送至前景應用程式。系統絕對不應使用這些事件,但可由 Android 裝置以外的裝置觸發 (例如連接至 Android 裝置的外部硬體鍵盤)。 - [7.2.4/H-0-1] 必須支援觸控螢幕輸入。
- [7.2.4/H-SR] 強烈建議您啟動使用者選取的輔助應用程式,也就是實作 VoiceInteractionService 的應用程式,或是處理長按
KEYCODE_MEDIA_PLAY_PAUSE
或KEYCODE_HEADSETHOOK
時的ACTION_ASSIST
活動,如果前景活動未處理這些長按事件。 - [7.3.1/H-SR] 強烈建議加入 3 軸式加速度計。
如果手持裝置實作項目包含 3 軸式加速度計,則會執行以下操作:
- [7.3.1/H-1-1] 必須能夠回報至少 100 Hz 的事件頻率。
如果手持裝置實作方式包含 GPS/GNSS 接收器,並透過 android.hardware.location.gps
功能旗標向應用程式回報功能,則會:
- [7.3.3/H-2-1] 一旦偵測到 GNSS 測量資料,就必須立即回報,即使尚未回報透過 GPS/GNSS 計算的位置也一樣。
- [7.3.3/H-2-2] 必須回報 GNSS 偽距和偽距速率,在確定位置後,在無遮蔽天空的情況下,當裝置處於靜止狀態或以每秒 0.2 公尺以下的加速度移動時,至少 95% 的時間都能計算出位置和速度,且誤差範圍在 20 公尺以內。
如果手持裝置實作項目包含 3 軸陀螺儀,則必須:
可撥打語音通話並在 getPhoneType
中指示 PHONE_TYPE_NONE
以外任何值的手持裝置實作方式:
- [7.3.8/H] 應包含鄰近感應器。
手持裝置實作方式:
如果手持裝置實作項目包含計量連線,則會:
- [7.4.7/H-1-1] 必須提供數據節省模式。
如果手持裝置實作內容包含邏輯攝影機裝置,且該裝置使用 CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
列出功能,則會:
- [7.5.4/H-1-1] 預設必須有正常視野 (FOV),且視野必須介於 50 到 90 度之間。
手持裝置實作方式:
- [7.6.1/H-0-1] 必須至少有 4 GB 的非揮發性儲存空間,用於應用程式私人資料 (又稱「/data」分區)。
- [7.6.1/H-0-2] 當核心和使用者空間的可用記憶體少於 1 GB 時,必須為
ActivityManager.isLowRamDevice()
傳回「true」。
如果手持裝置實作項目宣告僅支援 32 位元 ABI:
-
[7.6.1/H-1-1] 如果預設螢幕使用高達 qHD 的 Framebuffer 解析度 (例如 FWVGA),則核心和使用者空間的可用記憶體必須至少為 416 MB。
-
[7.6.1/H-2-1] 如果預設螢幕使用高達 HD+ 的顯示緩衝區解析度 (例如 HD、WSVGA),則核心和使用者空間可用的記憶體必須至少為 592 MB。
-
[7.6.1/H-3-1] 如果預設螢幕使用高達 FHD 的顯示緩衝區解析度 (例如 WSXGA+),則核心和使用者空間可用的記憶體必須至少為 896 MB。
-
[7.6.1/H-4-1] 如果預設螢幕使用高達 QHD 的 framebuffer 解析度 (例如 QWXGA),則核心和使用者空間的可用記憶體必須至少為 1344 MB。
如果手持裝置實作項目宣告支援任何 64 位元 ABI (不論是否支援任何 32 位元 ABI):
-
[7.6.1/H-5-1] 如果預設螢幕使用高達 qHD 的影格緩衝區解析度 (例如 FWVGA),則核心和使用者空間可用的記憶體必須至少為 816 MB。
-
[7.6.1/H-6-1] 如果預設螢幕使用高達 HD+ 的顯示緩衝區解析度 (例如 HD、WSVGA),則核心和使用者空間可用的記憶體必須至少為 944 MB。
-
[7.6.1/H-7-1] 如果預設螢幕使用高達 FHD 的顯示緩衝區解析度 (例如 WSXGA+),則核心和使用者空間可用的記憶體必須至少為 1280 MB。
-
[7.6.1/H-8-1] 如果預設顯示器使用高達 QHD 的 framebuffer 解析度 (例如 QWXGA),則核心和使用者空間可用的記憶體必須至少為 1824 MB。
請注意,上述「核心和使用者空間可用的記憶體」是指除了已專用於硬體元件 (例如無線電、影片等) 的記憶體 (不在裝置實作中受核心控制) 之外,提供的記憶體空間。
如果手持裝置實作項目提供給核心和使用者空間的記憶體少於或等於 1 GB,則會發生以下情況:
- [7.6.1/H-9-1] 必須宣告功能旗標
android.hardware.ram.low
。 - [7.6.1/H-9-2] 應用程式私人資料 (又稱「/data」分區) 的非揮發性儲存空間,必須至少有 1.1 GB。
如果手持裝置實作項目提供給核心和使用者空間的記憶體超過 1 GB,則會發生以下情況:
- [7.6.1/H-10-1] 應用程式私人資料 (又稱「/data」分區) 必須至少有 4GB 的非揮發性儲存空間。
- 應宣告功能旗標
android.hardware.ram.normal
。
手持裝置實作方式:
如果手持裝置實作項目包含支援周邊模式的 USB 連接埠,則會:
- [7.7.1/H-1-1] 必須實作 Android Open Accessory (AOA) API。
如果手持裝置實作項目包含支援主機模式的 USB 連接埠,則會:
手持裝置實作方式:
如果手持裝置實作功能能夠滿足支援 VR 模式的所有效能需求,並且提供相關支援,則必須符合下列條件:
- [7.9.1/H-1-1] 必須宣告
android.hardware.vr.high_performance
功能旗標。 - [7.9.1/H-1-2] 應用程式必須實作
android.service.vr.VrListenerService
,且 VR 應用程式可透過android.app.Activity#setVrModeEnabled
啟用該應用程式。
如果手持裝置實作項目在主機模式下包含一或多個 USB-C 連接埠,並實作 (USB 音訊類別),則除了 7.7.2 節的規定外,還必須符合下列規定:
- [7.8.2.2/H-1-1] 必須提供下列 HID 代碼的軟體對應:
函式 | 對應 | 背景資訊 | 行為 |
---|---|---|---|
A |
HID 使用頁面:0x0C HID 用途:0x0CD 核心鍵: KEY_PLAYPAUSE Android 鍵: KEYCODE_MEDIA_PLAY_PAUSE
|
媒體播放 |
輸入:短按 輸出:播放或暫停 |
輸入:長按 輸出:啟動語音指令 傳送:如果裝置處於鎖定或螢幕關閉狀態,則傳送 android.speech.action.VOICE_SEARCH_HANDS_FREE ;否則傳送 android.speech.RecognizerIntent.ACTION_WEB_SEARCH
|
|||
來電 |
輸入:短按 輸出:接聽通話 |
||
輸入:長按 輸出:拒接通話 |
|||
通話中 |
輸入:短按 輸出:結束通話 |
||
輸入:長按 輸出:將麥克風設為靜音或取消靜音 |
|||
B |
HID 使用頁面:0x0C HID 用途:0x0E9 核心鍵: KEY_VOLUMEUP Android 鍵: VOLUME_UP
|
媒體播放、通話中 |
輸入:短按或長按 輸出:調高系統或耳機音量 |
C |
HID 使用頁面:0x0C HID 用途:0x0EA 核心鍵: KEY_VOLUMEDOWN Android 鍵: VOLUME_DOWN
|
媒體播放、通話中 |
輸入:短按或長按 輸出:降低系統或耳機音量 |
D |
HID 使用頁面:0x0C HID 用途:0x0CF 核心鍵: KEY_VOICECOMMAND Android 鍵: KEYCODE_VOICE_ASSIST
|
。可在任何例項中觸發。 |
輸入:短按或長按 輸出:啟動語音指令 |
- [7.8.2.2/H-1-2] 必須在插入插頭時觸發 ACTION_HEADSET_PLUG,但前提是 USB 音訊介面和端點已正確列舉,以便識別連接的終端類型。
偵測到 USB 音訊終端類型 0x0302 時,會發生以下情況:
- [7.8.2.2/H-2-1] 必須廣播 Intent ACTION_HEADSET_PLUG,並將「microphone」額外項目設為 0。
偵測到 USB 音訊終端類型 0x0402 時,會發生以下情況:
- [7.8.2.2/H-3-1] 必須廣播 Intent ACTION_HEADSET_PLUG,並將「microphone」額外資訊設為 1。
在 USB 周邊裝置連線時呼叫 API AudioManager.getDevices() 時,會發生以下情況:
-
[7.8.2.2/H-4-1] 如果 USB 音訊終端類型欄位為 0x0302,則必須列出類型為 AudioDeviceInfo.TYPE_USB_HEADSET 的裝置,且角色為 Sink()。
-
[7.8.2.2/H-4-2] 如果 USB 音訊終端類型欄位為 0x0402,則必須列出 AudioDeviceInfo.TYPE_USB_HEADSET 類型的裝置,且角色為 Sink()。
-
[7.8.2.2/H-4-3] 如果 USB 音訊終端類型欄位為 0x0402,則必須列出 AudioDeviceInfo.TYPE_USB_HEADSET 類型的裝置,並將角色設為 isSource()。
-
[7.8.2.2/H-4-4] 如果 USB 音訊終端類型欄位為 0x603,則必須列出類型為 AudioDeviceInfo.TYPE_USB_DEVICE 的裝置,且角色為 Sink()。
-
[7.8.2.2/H-4-5] 如果 USB 音訊終端類型欄位為 0x604,則必須列出 AudioDeviceInfo.TYPE_USB_DEVICE 類型的裝置,且角色為 isSource()。
-
[7.8.2.2/H-4-6] 如果 USB 音訊終端類型欄位為 0x400,則必須列出 AudioDeviceInfo.TYPE_USB_DEVICE 類型的裝置,且角色為 Sink()。
-
[7.8.2.2/H-4-7] 如果 USB 音訊終端類型欄位為 0x400,則必須列出 AudioDeviceInfo.TYPE_USB_DEVICE 類型的裝置,並將角色設為 isSource()。
-
[7.8.2.2/H-SR] 強烈建議在連接 USB-C 音訊外接裝置時,執行 USB 描述元列舉、識別終端機類型,並在 1000 毫秒內廣播 Intent ACTION_HEADSET_PLUG。
如果手持裝置實作包含至少一個觸覺感應致動器,則必須符合下列條件:
- [7.10/H-SR]* 強烈建議不要使用偏心旋轉質量 (ERM) 觸覺感應致動器(震動器)。
- [7.10/H]* 應將致動器放置在裝置通常握持或觸碰的位置附近。
- [7.10/H-SR]* 強烈建議您在 android.view.HapticFeedbackConstants 中實作所有公開常數,以便清晰觸覺回饋,也就是 CLOCK_TICK、CONTEXT_CLICK、KEYBOARD_PRESS、KEYBOARD_RELEASE、KEYBOARD_TAP、LONG_PRESS、TEXT_HANDLE_MOVE、VIRTUAL_KEY、VIRTUAL_KEY_RELEASE、CONFIRM、REJECT、GESTURE_START 和 GESTURE_END。
- [7.10/H-SR]* 強烈建議您在 android.os.VibrationEffect 中實作所有公共常數,以便提供清晰的觸覺回饋 (即 EFFECT_TICK、EFFECT_CLICK、EFFECT_HEAVY_CLICK 和 EFFECT_DOUBLE_CLICK),以及在 android.os.VibrationEffect.Composition 中實作所有公共常數,以便提供豐富的觸覺回饋 (即 PRIMITIVE_CLICK 和 PRIMITIVE_TICK)。
- [7.10/H-SR]* 強烈建議您使用這些連結的觸覺回饋常數對應。
- [7.10/H-SR]* 強烈建議您遵循 createOneShot() 和 createWaveform() API 的品質評估。
- [7.10/H-SR]* 強烈建議您執行 android.os.Vibrator.hasAmplitudeControl(),驗證振幅可擴展性功能。
線性諧振致動器 (LRA) 是單一質量彈簧系統,具有主導諧振頻率,可將質量轉換為所需運動方向。
如果手持裝置實作項目至少包含一個線性諧振致動器,則會:
- [7.10/H]* 應在直向模式的 X 軸中移動觸覺馬達。
如果手持裝置實作項目具有 X 軸線性諧振致動器 (LRA) 的觸覺致動器,則會:
- [7.10/H-SR]* 強烈建議 X 軸 LRA 的諧振頻率低於 200 Hz。
如果手持裝置實作符合觸覺常數對應,則會:
2.2.2. 多媒體
手持裝置實作方式必須支援下列音訊編碼和解碼格式,並提供給第三方應用程式:
- [5.1/H-0-1] AMR-NB
- [5.1/H-0-2] AMR-WB
- [5.1/H-0-3] MPEG-4 AAC 設定檔 (AAC LC)
- [5.1/H-0-4] MPEG-4 HE AAC Profile (AAC+)
- [5.1/H-0-5] AAC ELD (增強型低延遲 AAC)
手持裝置實作方式必須支援下列影片編碼格式,並將這些格式提供給第三方應用程式:
手持裝置實作方式必須支援下列影片解碼格式,並將這些格式提供給第三方應用程式:
2.2.3. 軟體
手持裝置實作方式:
- [3.2.3.1/H-0-1] 應用程式必須處理 SDK 文件中所述的
ACTION_GET_CONTENT
、ACTION_OPEN_DOCUMENT
、ACTION_OPEN_DOCUMENT_TREE
和ACTION_CREATE_DOCUMENT
意圖,並透過DocumentsProvider
API 提供使用者存取文件提供者資料的操作選項。 - [3.2.3.1/H-0-2]* 對於所有由以下應用程式意圖定義的公開意圖篩選器模式,必須使用意圖處理常式預先載入一或多個應用程式或服務元件。
- [3.2.3.1/H-SR] 強烈建議您預先載入可處理ACTION_SENDTO或ACTION_SEND或ACTION_SEND_MULTIPLE意圖的電子郵件應用程式,以便傳送電子郵件。
- [3.4.1/H-0-1] 必須提供
android.webkit.Webview
API 的完整實作。 - [3.4.2/H-0-1] 必須提供獨立的瀏覽器應用程式,供一般使用者瀏覽網頁。
- [3.8.1/H-SR] 強烈建議您實作可支援應用程式內捷徑、小工具和 widgetFeatures 固定功能的預設啟動器。
- [3.8.1/H-SR] 強烈建議您實作預設啟動器,透過 ShortcutManager API 快速存取第三方應用程式提供的其他捷徑。
- [3.8.1/H-SR] 強烈建議您加入預設啟動器應用程式,以便顯示應用程式圖示的徽章。
- [3.8.2/H-SR] 強烈建議支援第三方應用程式小工具。
- [3.8.3/H-0-1] 必須允許第三方應用程式透過
Notification
和NotificationManager
API 類別,通知使用者重要事件。 - [3.8.3/H-0-2] 必須支援複合式通知。
- [3.8.3/H-0-3] 必須支援抬頭通知。
- [3.8.3/H-0-4] 必須包含通知遮罩,讓使用者能夠透過使用者操作元素 (例如 AOSP 中實作的動作按鈕或控制面板) 直接控制通知 (例如回覆、暫緩、關閉、封鎖)。
- [3.8.3/H-0-5] 必須在通知遮罩中顯示透過
RemoteInput.Builder setChoices()
提供的選項。 - [3.8.3/H-SR] 強烈建議您在通知陰影中顯示透過
RemoteInput.Builder setChoices()
提供的第一個選項,而不需要額外的使用者互動。 - [3.8.3/H-SR] 強烈建議在使用者展開通知欄中的所有通知時,在通知欄中顯示透過
RemoteInput.Builder setChoices()
提供的所有選項。 - [3.8.3.1/H-SR] 強烈建議您為顯示動作設定
Notification.Action.Builder.setContextual
,並將其設為true
,以便與Notification.Remoteinput.Builder.setChoices
顯示的回覆內容保持一致。 - [3.8.4/H-SR] 強烈建議在裝置上實作助理,以便處理輔助動作。
如果手持裝置實作項目支援輔助動作,則會:
- [3.8.4/H-SR] 強烈建議您使用長按
HOME
鍵的指定互動方式啟動輔助應用程式,如第 7.2.3 節所述。必須啟動使用者選取的輔助應用程式,也就是實作VoiceInteractionService
的應用程式,或是處理ACTION_ASSIST
意圖的活動。
如果手持裝置導入作業支援 conversation notifications
,並將這類通知與警示和靜音非對話通知分開,則:
- [3.8.4/H-1-1]* 必須在非對話通知前顯示對話通知,但持續顯示的前景服務通知和 importance:high 通知除外。
如果 Android 手持裝置實作項目支援鎖定畫面,則必須符合下列條件:
- [3.8.10/H-1-1] 必須顯示螢幕鎖定畫面通知,包括媒體通知範本。
如果手持裝置實作項目支援安全的鎖定畫面,則必須符合下列條件:
- [3.9/H-1-1] 必須實作 Android SDK 說明文件中定義的所有裝置管理政策。
- [3.9/H-1-2] 必須透過
android.software.managed_users
功能旗標宣告受管理設定檔的支援情形,除非裝置已設定為回報自己為低 RAM 裝置,或將內部 (不可移除) 儲存空間分配為共用儲存空間。
如果手持裝置實作項目支援 ControlsProviderService
和 Control
API,並允許第三方應用程式發布裝置控制項,則:
- [3.8.16/H-1-1] 必須宣告功能旗標
android.software.controls
,並將其設為true
。 - [3.8.16/H-1-2] 必須提供使用者操作提示,讓使用者能夠從第三方應用程式透過
ControlsProviderService
和Control
API 註冊的控制項中,新增、編輯、選取及操作使用者喜愛的裝置控制項。 - [3.8.16/H-1-3] 必須在預設啟動器的三次互動中,提供此使用者操作元素的存取權。
- [3.8.16/H-1-4] 您必須在這個使用者操作元素中,正確顯示透過
ControlsProviderService
API 提供控制項的每個第三方應用程式的名稱和圖示,以及Control
API 提供的任何指定欄位。
相反地,如果手持裝置實作項目未導入這類控制項,則會發生以下情況:
- [3.8.16/H-2-1] 必須為
ControlsProviderService
和Control
API 回報null
。 - [3.8.16/H-2-2] 必須宣告功能旗標
android.software.controls
,並將其設為false
。
手持裝置實作方式:
- [3.10/H-0-1] 必須支援第三方無障礙服務。
- [3.10/H-SR] 強烈建議您在裝置上預先載入無障礙服務,這些服務的功能應與 Talkback 開放原始碼專案提供的切換控制功能和 TalkBack (針對預先安裝的文字轉語音引擎支援的語言) 無障礙服務相當,甚至更勝一籌。
- [3.11/H-0-1] 必須支援安裝第三方 TTS 引擎。
- [3.11/H-SR] 強烈建議您加入支援裝置上可用語言的 TTS 引擎。
- [3.13/H-SR] 強烈建議您加入快速設定 UI 元件。
如果 Android 手持裝置實作聲明支援 FEATURE_BLUETOOTH
或 FEATURE_WIFI
,則會:
- [3.16/H-1-1] 必須支援隨附裝置配對功能。
如果導覽功能是以畫面上以手勢為主的動作提供:
- [7.2.3/H] 從螢幕底部算起,主畫面功能的手勢辨識區域高度應不超過 32 個像素點。
如果手持裝置實作項目提供的導覽功能是從螢幕左側或右側邊緣的任一處以手勢操作:
- [7.2.3/H-0-1] 導覽功能的手勢區域兩側寬度不得超過 40 dp。根據預設,手勢區域的寬度應為 24 dp。
2.2.4. 效能和電源
- [8.1/H-0-1] 一致的畫面延遲。每秒影格延遲時間不一致或轉譯影格延遲的情況,不得超過每秒 5 個影格,且應低於每秒 1 個影格。
- [8.1/H-0-2] 使用者介面延遲。裝置實作項目必須在 36 秒內,透過捲動 Android 相容性測試套件 (CTS) 定義的 10,000 個清單項目,確保低延遲的使用者體驗。
- [8.1/H-0-3] 工作切換。啟動多個應用程式時,重新啟動已啟動的應用程式,其時間必須少於 1 秒。
手持裝置實作方式:
- [8.2/H-0-1] 必須確保循序寫入效能至少達到 5 MB/s。
- [8.2/H-0-2] 必須確保隨機寫入效能至少為 0.5 MB/s。
- [8.2/H-0-3] 必須確保循序讀取效能至少為 15 MB/s。
- [8.2/H-0-4] 必須確保隨機讀取效能至少為 3.5 MB/s。
如果手持裝置實作內容包含可改善裝置電源管理的功能 (或擴充 AOSP 中的功能),則必須符合下列條件:
手持裝置實作方式:
- [8.4/H-0-1] 必須提供個別元件的電源設定檔,定義每個硬體元件的電流消耗值,以及元件隨時間流逝而造成的電池耗電量估計值,如 Android 開放原始碼專案網站所述。
- [8.4/H-0-2] 必須以毫安培小時 (mAh) 為單位回報所有耗電量值。
- [8.4/H-0-3] 必須針對每個程序的 UID 回報 CPU 耗電量。Android 開放原始碼計畫透過
uid_cputime
核心模組實作項目滿足這項需求。 - [8.4/H-0-4] 應用程式開發人員必須透過
adb shell dumpsys batterystats
殼層指令提供此電量使用量。 - 如果無法將硬體元件的耗電量歸因於應用程式,則應將 [8.4/小時] 歸因於硬體元件本身。
如果手持裝置實作包含螢幕或影片輸出,則必須符合下列條件:
- [8.4/H-1-1] 必須遵循
android.intent.action.POWER_USAGE_SUMMARY
意圖,並顯示可顯示電力使用的設定選單。
2.2.5. 安全性模型
手持裝置實作方式:
- [9.1/H-0-1] 必須允許第三方應用程式透過
android.permission.PACKAGE_USAGE_STATS
權限存取使用統計資料,並提供使用者可存取的機制,以回應android.settings.ACTION_USAGE_ACCESS_SETTINGS
意圖,授予或撤銷此類應用程式的存取權。
手持裝置導入方式 (* 不適用於平板電腦):
- [9.11/H-0-2]* 必須使用獨立的執行環境備份金鑰存放區實作項目。
- [9.11/H-0-3]* 必須實作 RSA、AES、ECDSA 和 HMAC 加密演算法,以及 MD5、SHA1 和 SHA-2 系列雜湊函式,才能在與核心以上層級執行的程式碼安全隔離的區域中,正確支援 Android Keystore 系統支援的演算法。安全隔離功能必須封鎖所有潛在機制,以免核心或使用者空間程式碼存取隔離環境的內部狀態,包括 DMA。上游 Android 開放原始碼計畫 (AOSP) 使用 Trusty 實作項目來滿足這項規定,但其他以 ARM TrustZone 為基礎的解決方案,或第三方審查的安全實作項目,也是適當的虛擬機器人隔離方式。
- [9.11/H-0-4]* 必須在隔離執行環境中執行螢幕鎖定畫面驗證,且只有在驗證成功時,才允許使用與驗證綁定的金鑰。螢幕鎖定憑證必須以只允許隔離執行環境執行螢幕鎖定驗證的方式儲存。上游 Android 開放原始碼計畫提供 Gatekeeper 硬體抽象層 (HAL) 和 Trusty,可用於滿足這項需求。
- [9.11/H-0-5]* 必須支援金鑰認證,其中認證簽署金鑰受到安全硬體保護,且簽署作業是在安全硬體中執行。認證簽署金鑰必須在大量裝置上共用,以免被用作裝置 ID。如要符合這項規定,您可以共用相同的認證金鑰,除非您生產的特定 SKU 數量至少達 100,000 個。如果某個 SKU 的產量超過 100,000 個,則每 100,000 個單位可能會使用不同的鍵。
請注意,如果裝置實作已在較舊的 Android 版本上推出,則該裝置不必符合要求,即不必具備由隔離執行環境支援的金鑰存放區,也不必支援金鑰認證,除非該裝置宣告 android.hardware.fingerprint
功能,而該功能要求由隔離執行環境支援的金鑰存放區。
當手持裝置實作支援安全的螢幕鎖定功能時,會具備以下功能:
- [9.11/H-1-1] 必須允許使用者選擇最短的休眠逾時時間,也就是從解鎖到鎖定的轉換時間,不得超過 15 秒。
- [9.11/H-1-2] 必須提供使用者操作提示,以便隱藏通知,並停用所有形式的驗證 (除了 9.11.1 安全的螢幕鎖定畫面中所述的主要驗證)。AOSP 符合鎖定模式的規定。
如果手持裝置實作包含多位使用者,且未宣告 android.hardware.telephony
功能旗標,則會發生以下情況:
- [9.5/H-2-1] 必須支援受限設定檔,這項功能可讓裝置擁有者管理裝置上的其他使用者和他們的功能。透過受限設定檔,裝置擁有者可以快速設定其他使用者可使用的獨立環境,並在這些環境中管理應用程式的精細限制。
如果手持裝置實作包含多位使用者,並宣告 android.hardware.telephony
功能旗標,則會發生以下情況:
- [9.5/H-3-1] 不得支援受限制的設定檔,但必須與 AOSP 的控制項實作方式一致,以便啟用 /停用其他使用者存取語音通話和簡訊的權限。
2.2.6. 開發人員工具和選項相容性
手持裝置實作方式 (* 不適用於平板電腦):
- [6.1/H-0-1]* 必須支援 shell 指令
cmd testharness
。
手持裝置實作方式 (* 不適用於平板電腦):
-
Perfetto
- [6.1/H-0-2]* 必須向殼層使用者公開
/system/bin/perfetto
二進位檔,該 cmdline 必須符合 Perfetto 說明文件。 - [6.1/H-0-3]* Perfetto 二進位檔必須接受符合 Perfetto 說明文件中定義的結構定義的 protobuf 設定檔做為輸入內容。
- [6.1/H-0-4]* Perfetto 二進位檔必須將符合 Perfetto 說明文件中定義的結構定義,以輸出 protobuf 追蹤記錄。
- [6.1/H-0-5]* 必須透過 Perfeto 二進位檔提供至少 Perfeto 說明文件中所述的資料來源。
- [6.1/H-0-6]* 預設情況下,必須啟用 perfetto 追蹤精靈 (系統屬性
persist.traced.enable
)。
- [6.1/H-0-2]* 必須向殼層使用者公開
2.2.7 手持裝置媒體成效類別
請參閱第 7.11 節,瞭解媒體成效類別的定義。
2.2.7.1. 媒體
如果手持裝置實作項目針對 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
傳回 android.os.Build.VERSION_CODES.R
,則會:
- [5.1/H-1-1] 必須透過
CodecCapabilities.getMaxSupportedInstances()
和VideoCapabilities.getSupportedPerformancePoints()
方法,宣傳在任何編解碼器組合中可同時執行的硬體視訊解碼器工作階段數量上限。 - [5.1/H-1-2] 必須支援 6 個硬體視訊解碼器工作階段 (AVC 或 HEVC) 的例項,這些例項必須同時以 720p 解析度和 30 fps 的速度,搭配任何轉碼器組合執行。
- [5.1/H-1-3] 必須透過
CodecCapabilities.getMaxSupportedInstances()
和VideoCapabilities.getSupportedPerformancePoints()
方法,宣傳可在任何編解碼器組合中同時執行的硬體視訊編碼器工作階段數量上限。 - [5.1/H-1-4] 必須支援 6 個硬體視訊編碼器工作階段 (AVC 或 HEVC),同時以 720p 解析度@30 fps 的任何轉碼器組合執行。
- [5.1/H-1-5] 必須透過
CodecCapabilities.getMaxSupportedInstances()
和VideoCapabilities.getSupportedPerformancePoints()
方法,宣傳在任何編解碼器組合中可同時執行的硬體視訊編碼器和解碼器工作階段數量上限。 - [5.1/H-1-6] 必須支援 6 個硬體視訊解碼器和硬體視訊編碼器工作階段 (AVC 或 HEVC) 例項,同時執行任何轉碼器組合,解析度為 720p@30 fps。
- [5.1/H-1-7] 在負載時,所有硬體視訊編碼器 (杜比視界編碼器除外) 的 1080p 以下視訊編碼工作階段,編碼器初始化延遲時間必須為 65 毫秒以下。此處的負載定義為同時使用硬體視訊轉碼器進行 1080p 至 720p 的單一視訊轉碼工作階段,並搭配 1080p 音訊/視訊錄製初始化。
- [5.1/H-1-8] 在負載時,所有音訊編碼器的 128 kbps 以下位元率音訊編碼工作階段,轉碼器初始化延遲時間必須為 50 毫秒以下。此處的負載定義為使用硬體視訊轉碼器的 1080p 至 720p 並行的單一視訊轉碼工作階段,以及 1080p 音訊/視訊錄製初始化。
- [5.3/H-1-1] 在負載下,1080p 30 fps 影片工作階段不得在 10 秒內丟失超過 1 個影格 (即丟失影格不得超過 0.333%)。負載定義為使用硬體視訊轉碼器的 1080p 至 720p 並行視訊轉碼工作階段,以及 128 kbps AAC 音訊播放。
- [5.3/H-1-2] 在載入 30 fps 影片工作階段時,影片解析度變更時,不得在 10 秒內丟失超過 1 個影格。負載定義為同時使用硬體視訊編解碼器進行 1080p 至 720p 的單一影片轉碼工作階段,以及 128Kbps AAC 音訊播放。
- [5.6/H-1-1] 使用 OboeTester 輕觸音效測試或 CTS 驗證器輕觸音效測試時,輕觸音效延遲時間不得超過 100 毫秒。
2.2.7.2. 相機
如果手持裝置實作方式針對 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
傳回 android.os.Build.VERSION_CODES.R
,則會:
- [7.5/H-1-1] 必須配備解析度至少 1200 萬像素的主後置鏡頭,支援 4K@30fps 的影片錄製功能。主要後置鏡頭是相機 ID 最低的後置鏡頭。
- [7.5/H-1-2] 必須配備解析度至少 400 萬像素的主前置鏡頭,支援 1080p@30fps 的影片錄製功能。主要前置鏡頭是相機 ID 最小的前置鏡頭。
- [7.5/H-1-3] 必須支援 android.info.supportedHardwareLevel 屬性,並將後置主要相機設為 FULL 或更高,前置主要相機設為 LIMITED 或更高。
- [7.5/H-1-4] 必須為兩個主要相機支援 CameraMetadata.SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME。
- [7.5/H-1-5] 必須具備相機 2 JPEG 擷取延遲時間,在兩部主相機的 ITS 照明條件 (3000K) 下,透過 CTS 相機 PerformanceTest 測量,解析度為 1080p 時,延遲時間必須小於 1000ms。
- [7.5/H-1-6] 在兩個主要相機的 ITS 照明條件 (3000K) 下,相機 2 的啟動延遲 (從開啟相機到第一個預覽影格) 必須小於 600 毫秒,這項測試由 CTS 相機 PerformanceTest 執行。
2.2.7.3. 硬體
如果手持裝置實作項目針對 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
傳回 android.os.Build.VERSION_CODES.R
,則會:
- [7.1.1.1/H-1-1] 螢幕解析度必須至少為 1080p。
- [7.1.1.3/H-1-1] 螢幕密度必須至少為 400 dpi。
- [7.6.1/H-1-1] 必須至少有 6 GB 的實體記憶體。
2.2.7.4。成效
如果手持裝置實作項目針對 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
傳回 android.os.Build.VERSION_CODES.R
,則會:
- [8.2/H-1-1] 必須確保序列寫入效能至少達到 100 MB/s。
- [8.2/H-1-2] 必須確保隨機寫入效能至少達到 10 MB/s。
- [8.2/H-1-3] 必須確保序列讀取效能至少達到 200 MB/s。
- [8.2/H-1-4] 必須確保隨機讀取效能至少達到 25 MB/s。
2.3. 電視相關規定
Android 電視裝置是指 Android 裝置實作,為使用者提供娛樂介面,讓使用者坐在約 10 英尺 (約 3 公尺) 遠的地方觀看數位媒體、電影、遊戲、應用程式和/或電視直播內容 (稱為「躺椅」或「10 英尺使用者介面」)。
如果 Android 裝置實作符合下列所有條件,就會歸類為電視:
- 提供機制,可遠端控制螢幕上顯示的轉譯使用者介面,該螢幕可能距離使用者 10 英尺。
- 內建螢幕的對角線長度大於 24 吋,或內建 VGA、HDMI、DisplayPort 等視訊輸出埠,或內建顯示器的無線埠。
本節其餘部分的額外規定,適用於 Android TV 裝置的實作方式。
2.3.1. 硬體
電視裝置實作方式:
- [7.2.2/T-0-1] 必須支援 D-pad。
- [7.2.3/T-0-1] 必須提供「Home」和「Back」功能。
- [7.2.3/T-0-2] 必須將返回功能 (
KEYCODE_BACK
) 的一般和長按事件傳送至前景應用程式。 - [7.2.6.1/T-0-1] 必須支援遊戲控制器,並宣告
android.hardware.gamepad
功能旗標。 - [7.2.7/T] 應提供遠端控制器,讓使用者可以使用非觸控導覽和核心導覽鍵輸入方式。
如果電視裝置實作包含 3 軸式迴轉儀,則必須符合下列條件:
電視裝置實作方式:
如果電視裝置實作項目包含支援主機模式的 USB 連接埠,則會:
- [7.5.3/T-1-1] 必須支援透過此 USB 連接埠連線的外接相機,但不一定需要一直連線。
如果電視裝置實作為 32 位元:
-
[7.6.1/T-1-1] 如果使用下列任一密度,則核心和使用者空間可用的記憶體必須至少為 896 MB:
- 在小螢幕/一般螢幕上,解析度須達 400 dpi 以上
- 大型螢幕的 xhdpi 或更高
- 在超大螢幕上使用 tvdpi 或更高
如果電視裝置實作為 64 位元:
-
[7.6.1/T-2-1] 如果使用下列任一密度,則核心和使用者空間可用的記憶體必須至少為 1280 MB:
- 在小螢幕/一般螢幕上,解析度須達 400 dpi 以上
- 大型螢幕的 xhdpi 或更高
- 在超大螢幕上使用 tvdpi 或更高
請注意,上述「可供核心和使用者空間使用的記憶體」是指除了已專用於硬體元件 (例如無線電、影片等) 的記憶體 (不在裝置實作中受核心控制) 之外,提供的記憶體空間。
電視裝置實作方式:
2.3.2. 多媒體
電視裝置實作方式必須支援下列音訊編碼和解碼格式,並提供給第三方應用程式:
- [5.1/T-0-1] MPEG-4 AAC 設定檔 (AAC LC)
- [5.1/T-0-2] MPEG-4 HE AAC Profile (AAC+)
- [5.1/T-0-3] AAC ELD (增強型低延遲 AAC)
電視裝置實作方式必須支援下列影片編碼格式,並提供給第三方應用程式:
電視裝置實作方式:
- [5.2.2/T-SR] 強烈建議支援以每秒 30 格編碼 720p 和 1080p 解析度的 H.264 影片。
電視裝置實作必須支援下列影片解碼格式,並將這些格式提供給第三方應用程式:
- [5.3.3/T-0-1] MPEG-4 SP
- [5.3.4/T-0-2] H.264 AVC
- [5.3.5/T-0-3] H.265 HEVC
- [5.3.6/T-0-4] VP8
- [5.3.7/T-0-5] VP9
- [5.3.1/T-0-6] MPEG-2
電視裝置實作方式必須支援 MPEG-2 解碼,如第 5.3.1 節所述,以標準影片影格速率和解析度為限,包括:
- [5.3.1/T-1-1] 高畫質 1080p,每秒 29.97 格,採用主 Profile High Level。
- [5.3.1/T-1-2] HD 1080i,每秒 59.94 格,採用主 Profile High Level。必須解除交錯的 MPEG-2 影片,並提供給第三方應用程式。
電視裝置實作方式必須支援 H.264 解碼,詳情請參閱第 5.3.4 節,解碼時的標準影片影格速率和解析度必須為:
- [5.3.4/T-1-1] 以 Baseline Profile 播放 60 fps 的 HD 1080p 內容
- [5.3.4/T-1-2] 以 Main Profile 以每秒 60 格播放 HD 1080p
- [5.3.4/T-1-3] HD 1080p 以每秒 60 格影格搭配 High Profile Level 4.2
搭載 H.265 硬體解碼器的電視裝置實作方式,必須支援 H.265 解碼功能,詳情請參閱第 5.3.5 節,解碼功能的標準影片影格速率和解析度必須包含下列項目:
- [5.3.5/T-1-1] 以主 Profile Level 4.1 以每秒 60 影格播放 HD 1080p
如果搭載 H.265 硬體解碼器的電視裝置實作支援 H.265 解碼和 UHD 解碼設定檔,則會:
- [5.3.5/T-2-1] 必須支援 Main10 等級 5 的 Main 層級設定檔,以 60 張/秒的速度解碼 UHD 影片
電視裝置實作方式必須支援 VP8 解碼,如第 5.3.6 節所述,以標準影片影格速率和解析度為限,包括:
- [5.3.6/T-1-1] HD 1080p 以每秒 60 影格解碼設定檔
搭載 VP9 硬體解碼器的電視裝置實作方式,必須支援 VP9 解碼功能,如第 5.3.7 節所述,以標準的影片影格速率和解析度為限,包括:
- [5.3.7/T-1-1] HD 1080p 以每秒 60 格和設定檔 0 (8 位元色彩深度) 播放
如果搭載 VP9 硬體解碼器的電視裝置實作支援 VP9 解碼和 UHD 解碼設定檔,則會:
- [5.3.7/T-2-1] 必須支援 UHD 解碼設定檔,以每秒 60 格和設定檔 0 (8 位元色彩深度) 為準。
- [5.3.7/T-2-1] 強烈建議使用設定檔 2 (10 位元色彩深度),以每秒 60 影格數支援 UHD 解碼設定檔。
電視裝置實作方式:
- [5.5/T-0-1] 必須支援系統主音量,並在支援的輸出裝置上提供數位音訊輸出音量衰減功能,但壓縮音訊直通輸出 (在裝置上不會進行音訊解碼) 除外。
如果電視裝置實作項目沒有內建螢幕,但支援透過 HDMI 連接的外接螢幕,則必須符合下列條件:
- [5.8/T-0-1] 必須設定 HDMI 輸出模式,以便選取在 50Hz 或 60Hz 重新整理率下支援的最高解析度。
- [5.8/T-SR] 強烈建議提供可供使用者設定的 HDMI 更新率選取器。
- [5.8] 應將 HDMI 輸出模式的刷新率設為 50 Hz 或 60 Hz,視裝置銷售地區的影片刷新率而定。
如果電視裝置實作項目沒有內建螢幕,但支援透過 HDMI 連接的外接螢幕,則必須符合下列條件:
- [5.8/T-1-1] 必須支援 HDCP 2.2。
如果電視裝置實作不支援 UHD 解碼,但支援透過 HDMI 連接的外接螢幕,則會:
- [5.8/T-2-1] 必須支援 HDCP 1.4
2.3.3. 軟體
電視裝置實作方式:
- [3/T-0-1] 必須宣告
android.software.leanback
和android.hardware.type.television
功能。 - [3.2.3.1/T-0-1] 對於由以下列出應用程式意圖定義的所有公開意圖篩選器模式,必須使用意圖處理常式預先載入一或多個應用程式或服務元件。請參閱。
- [3.4.1/T-0-1] 必須提供
android.webkit.Webview
API 的完整實作。
如果 Android TV 裝置實作項目支援鎖定畫面,則會:
- [3.8.10/T-1-1] 必須顯示螢幕鎖定畫面通知,包括媒體通知範本。
電視裝置實作方式:
- [3.8.14/T-SR] 強烈建議您支援子母畫面 (PIP) 模式的多視窗。
- [3.10/T-0-1] 必須支援第三方無障礙服務。
- [3.10/T-SR] 強烈建議您在裝置上預先載入無障礙服務,功能應與 TalkBack 開放原始碼專案提供的切換控制和 TalkBack (針對預先安裝的文字轉語音引擎支援的語言) 無障礙服務相當或更優。
如果電視裝置實作項目回報 android.hardware.audio.output
功能,則會:
電視裝置實作方式:
- [3.12/T-0-1] 必須支援 TV Input Framework。
2.3.4. 效能和電源
- [8.1/T-0-1] 一致的畫面延遲。每秒影格延遲時間不一致或轉譯影格延遲的情況,不得超過每秒 5 個影格,且應低於每秒 1 個影格。
- [8.2/T-0-1] 必須確保序列寫入效能至少為 5 MB/s。
- [8.2/T-0-2] 必須確保隨機寫入效能至少為 0.5MB/s。
- [8.2/T-0-3] 必須確保循序讀取效能至少達到 15 MB/s。
- [8.2/T-0-4] 必須確保隨機讀取效能至少為 3.5MB/s。
如果電視裝置實作功能包含改善裝置電源管理的功能 (包含在 AOSP 中),或擴充 AOSP 中的功能,則必須符合下列條件:
- [8.3/T-1-1] 必須提供使用者操作提示,以便啟用及停用省電模式。
如果電視裝置實作項目沒有電池,則會發生以下情況:
如果電視裝置實作項目有電池,則:
- [8.3/T-1-3] 必須提供使用者操作提示,顯示所有不受應用程式待命和 Doze 省電模式影響的應用程式。
電視裝置實作方式:
- [8.4/T-0-1] 必須提供個別元件的電源設定檔,定義每個硬體元件的電流消耗值,以及元件隨時間推移造成的電池耗電量估計值,如 Android 開放原始碼計畫網站所述。
- [8.4/T-0-2] 必須以毫安培小時 (mAh) 回報所有耗電量值。
- [8.4/T-0-3] 必須針對每個程序的 UID 回報 CPU 耗電量。Android 開放原始碼計畫透過
uid_cputime
核心模組實作項目滿足這項需求。 - [8.4/T] 如果無法將硬體元件的耗電量歸因於應用程式,則應歸因於硬體元件本身。
- [8.4/T-0-4] 必須透過
adb shell dumpsys batterystats
殼層指令,向應用程式開發人員提供這項電量用量資訊。
2.3.5. 安全性模型
電視裝置實作方式:
- [9.11/T-0-1] 必須使用獨立的執行環境備份 KeyStore 實作。
- [9.11/T-0-2] 必須實作 RSA、AES、ECDSA 和 HMAC 加密演算法,以及 MD5、SHA1 和 SHA-2 系列雜湊函式,才能在與核心以上層級執行的程式碼安全隔離的區域,正確支援 Android Keystore 系統支援的演算法。安全隔離功能必須封鎖所有潛在機制,以免核心或使用者空間程式碼存取隔離環境的內部狀態,包括 DMA。上游 Android 開放原始碼計畫 (AOSP) 使用 Trusty 實作項目來滿足這項規定,但其他以 ARM TrustZone 為基礎的解決方案,或第三方審查的安全實作項目,也是適當的虛擬機器人隔離方式。
- [9.11/T-0-3] 必須在隔離的執行環境中執行螢幕鎖定畫面驗證,且只有在驗證成功時,才允許使用與驗證綁定的金鑰。螢幕鎖定憑證必須以只允許隔離執行環境執行螢幕鎖定驗證的方式儲存。上游 Android 開放原始碼計畫提供 Gatekeeper 硬體抽象層 (HAL) 和 Trusty,可用於滿足這項需求。
- [9.11/T-0-4] 必須支援金鑰認證,其中認證簽署金鑰受到安全硬體保護,且簽署作業是在安全硬體中執行。認證簽署金鑰必須在大量裝置間共用,以免被用作裝置 ID。如要符合這項規定,您可以共用相同的認證金鑰,除非您生產的特定 SKU 數量至少達 100,000 個。如果某個 SKU 的產量超過 100,000 個,則每 100,000 個單位可能會使用不同的鍵。
請注意,如果裝置實作已在較舊的 Android 版本上推出,則該裝置不必符合要求,即不必具備由隔離執行環境支援的金鑰存放區,也不必支援金鑰認證,除非該裝置宣告 android.hardware.fingerprint
功能,而該功能要求由隔離執行環境支援的金鑰存放區。
如果電視裝置實作支援安全的鎖定螢幕,則必須符合下列條件:
- [9.11/T-1-1] 必須允許使用者選擇休眠逾時值,以便從解鎖狀態切換為鎖定狀態,且最短逾時值不得超過 15 秒。
如果電視裝置實作包含多位使用者,且未宣告 android.hardware.telephony
功能旗標,則會發生以下情況:
- [9.5/T-2-1] 必須支援受限設定檔,這項功能可讓裝置擁有者管理裝置上的其他使用者和他們的功能。透過受限設定檔,裝置擁有者可以快速設定其他使用者可使用的獨立環境,並在這些環境中管理應用程式的精細限制。
如果電視裝置實作包含多位使用者,並宣告 android.hardware.telephony
功能旗標,則會發生以下情況:
- [9.5/T-3-1] 不得支援受限制的設定檔,但必須與 AOSP 的控制項實作方式一致,以便啟用 /停用其他使用者存取語音通話和簡訊的權限。
2.3.6. 開發人員工具和選項相容性
電視裝置實作方式:
-
Perfetto
- [6.1/T-0-1] 必須將
/system/bin/perfetto
二進位檔公開給殼層使用者,該使用者的 cmdline 必須符合 Perfetto 說明文件。 - [6.1/T-0-2] Perfetto 二進位檔必須接受符合 Perfetto 說明文件中定義的結構定義的 protobuf 設定檔做為輸入內容。
- [6.1/T-0-3] Perfetto 二進位檔必須將符合 Perfetto 說明文件中定義的結構定義,以 protobuf 追蹤記錄的形式輸出。
- [6.1/T-0-4] 您必須透過 Perfeto 二進位檔提供至少 Perfeto 說明文件中所述的資料來源。
- [6.1/T-0-1] 必須將
2.4. 智慧手錶需求
「Android Watch 裝置」是指可戴在身上 (例如手腕) 的 Android 裝置實作項目。
如果 Android 裝置實作符合下列所有條件,就會歸類為智慧手錶:
- 螢幕的對角線長度介於 1.1 到 2.5 英寸之間。
- 提供可配戴在身上的裝置機制。
本節其餘部分的額外規定,適用於 Android Watch 裝置的實作方式。
2.4.1. 硬體
Watch 裝置實作:
-
[7.1.1.1/W-0-1] 螢幕的實際對角線尺寸必須介於 1.1 到 2.5 英寸之間。
-
[7.2.3/W-0-1] 必須提供使用者「Home」功能,以及「Back」功能 (除非處於
UI_MODE_TYPE_WATCH
中)。 -
[7.2.4/W-0-1] 必須支援觸控螢幕輸入。
-
[7.3.1/W-SR] 強烈建議加入 3 軸加速度計。
如果手錶裝置實作內容包含 GPS/GNSS 接收器,並透過 android.hardware.location.gps
功能旗標向應用程式回報功能,則會:
- [7.3.3/W-1-1] 一旦偵測到 GNSS 測量資料,就必須立即回報,即使尚未回報透過 GPS/GNSS 計算的位置也一樣。
- [7.3.3/W-1-2] 必須回報 GNSS 偽距離和偽距離速率,在確定位置後,當裝置處於無遮蔽天空的環境中,且靜止或移動速度低於每秒平方 0.2 公尺的加速度時,至少有 95% 的時間,系統可計算出位置在 20 公尺以內,且速度在每秒 0.2 公尺以內。
如果 Watch 裝置實作包含 3 軸式迴轉儀,則會:
- [7.3.4/W-2-1] 必須能夠測量每秒最多 1000 度的方向變化。
Watch 裝置實作:
-
[7.4.3/W-0-1] 必須支援藍牙。
-
[7.6.1/W-0-1] 必須至少有 1 GB 的非揮發性儲存空間,用於應用程式私人資料 (又稱為「/data」分區)。
-
[7.6.1/W-0-2] 必須至少有 416 MB 記憶體可供核心和使用者空間使用。
-
[7.8.1/W-0-1] 必須包含麥克風。
-
[7.8.2/W] 可能會有音訊輸出。
2.4.2. 多媒體
無其他規定。
2.4.3. 軟體
Watch 裝置實作:
- [3/W-0-1] 必須宣告
android.hardware.type.watch
功能。 - [3/W-0-2] 必須支援 uiMode = UI_MODE_TYPE_WATCH。
- [3.2.3.1/W-0-1] 對於由以下列出此處的應用程式意圖定義的所有公開意圖篩選器模式,必須使用意圖處理常式預先載入一或多個應用程式或服務元件。
Watch 裝置實作:
檢視宣告 android.hardware.audio.output
功能標記的裝置實作項目:
- [3.10/W-1-1] 必須支援第三方無障礙服務。
- [3.10/W-SR] 強烈建議您在裝置上預先載入無障礙服務,這些服務的功能與 TalkBack 開放原始碼專案提供的切換控制和 TalkBack (針對預先安裝的文字轉語音引擎支援的語言) 無障礙服務相當,甚至更勝一籌。
如果手錶裝置實作項目回報 android.hardware.audio.output 功能,則會:
2.4.4. 效能和電源
如果手錶裝置實作內容包含可改善裝置電源管理的功能 (或擴充 AOSP 中的功能),則必須符合下列條件:
Watch 裝置實作:
- [8.4/W-0-1] 必須提供個別元件的電源設定檔,定義每個硬體元件的電流消耗值,以及這些元件隨時間推移所造成的電池耗電量估計值,詳情請參閱 Android 開放原始碼專案網站。
- [8.4/W-0-2] 必須以毫安培小時 (mAh) 為單位回報所有耗電量值。
- [8.4/W-0-3] 必須針對每個程序的 UID 回報 CPU 耗電量。Android 開放原始碼計畫透過
uid_cputime
核心模組實作項目滿足這項需求。 - [8.4/W-0-4] 必須透過
adb shell dumpsys batterystats
殼層指令,將此電量使用情形提供給應用程式開發人員。 - 如果無法將硬體元件的耗電量歸因於應用程式,則應將 [8.4/W] 歸因於硬體元件本身。
2.4.5. 安全性模型
如果手錶裝置實作包含多位使用者,且未宣告 android.hardware.telephony
功能旗標,則會發生以下情況:
- [9.5/W-1-1] 必須支援受限設定檔,這項功能可讓裝置擁有者管理裝置上的其他使用者和他們的功能。透過受限設定檔,裝置擁有者可以快速設定其他使用者可使用的獨立環境,並在這些環境中管理應用程式的精細限制。
如果手錶裝置實作包含多位使用者,並宣告 android.hardware.telephony
功能旗標,則會發生以下情況:
- [9.5/W-2-1] 不得支援受限制的設定檔,但必須與 AOSP 的控制項實作方式保持一致,以便允許 /停用其他使用者存取語音通話和簡訊。
2.5. 汽車業規定
Android Automotive 實作是指車輛音響主機,其運作系統為 Android,用於部分或全部系統和/或資訊娛樂功能。
如果 Android 裝置實作項目宣告 android.hardware.type.automotive
功能,或是符合下列所有條件,就會歸類為 Automotive。
- 已嵌入車輛或可插入車輛。
- 使用駕駛座椅列的螢幕做為主要顯示畫面。
本節其餘部分的額外規定,適用於 Android Automotive 裝置的實作方式。
2.5.1. 硬體
汽車裝置實作方式:
- [7.1.1.1/A-0-1] 螢幕的對角線尺寸必須至少為 6 英寸。
-
[7.1.1.1/A-0-2] 螢幕大小版面配置必須至少為 750 dp x 480 dp。
-
[7.2.3/A-0-1] 必須提供「Home」功能,並可提供「Back」和「Recent」功能。
- [7.2.3/A-0-2] 必須將返回功能 (
KEYCODE_BACK
) 的一般和長按事件傳送至前景應用程式。 - [7.3/A-0-1] 必須實作並回報
GEAR_SELECTION
、NIGHT_MODE
、PERF_VEHICLE_SPEED
和PARKING_BRAKE_ON
。 - [7.3/A-0-2]
NIGHT_MODE
標記的值必須與資訊主頁的晝夜模式一致,且應根據環境光感應器輸入值。基礎環境光度感應器可能與光度計相同。 - [7.3/A-0-3] 必須為每個提供的感應器,在 SensorAdditionalInfo 中提供感應器額外資訊欄位
TYPE_SENSOR_PLACEMENT
。 - [7.3/A-0-1] 可透過將 GPS/GNSS 與其他感應器結合,推測位置。如果位置是死算的,強烈建議您實作並回報對應的感應器類型和/或車輛屬性 ID。
- [7.3/A-0-2] 透過 LocationManager#requestLocationUpdates() 要求的位置不得與地圖比對。
如果車用裝置實作項目包含 3 軸式加速度計,則須符合下列條件:
如果車用裝置實作包含 3 軸式迴轉儀,則會:
- [7.3.4/A-2-1] 必須能夠回報至少 100 Hz 的事件頻率。
- [7.3.4/A-2-2] 也必須實作
TYPE_GYROSCOPE_UNCALIBRATED
感應器。 - [7.3.4/A-2-3] 必須能夠以每秒 250 度的速度測量方向變化。
- [7.3.4/A-SR] 強烈建議將陀螺儀的測量範圍設為 +/-250dps,以便盡可能提高解析度
如果車用裝置實作項目包含 GPS/GNSS 接收器,但不包含行動網路數據連線,則:
- [7.3.3/A-3-1] 必須在 GPS/GNSS 接收器首次開啟時,或在 4 天後的 60 秒內,判斷位置。
- [7.3.3/A-3-2] 必須符合 7.3.3/C-1-2 和 7.3.3/C-1-6 所述的時間到第一個修正案標準,適用於所有其他位置要求 (也就是不是第一次或超過 4 天後的要求)。在沒有行動網路資料連線的車輛中,通常會使用在接收器上計算的 GNSS 軌道預測值,或是使用車輛最後已知位置,並搭配至少 60 秒的死算推測能力,以滿足 7.3.3/C-1-3 的定位精確度,或是同時使用這兩種方法,滿足 7.3.3/C-1-2 的要求。
汽車裝置實作方式:
- [7.4.3/A-0-1] 必須支援藍牙,且應支援藍牙 LE。
- [7.4.3/A-0-2] Android Automotive 實作項目必須支援下列藍牙設定檔:
- 使用免持聽筒設定檔 (HFP) 撥打電話。
- 透過音訊分發設定檔 (A2DP) 播放媒體。
- 透過遠端控制設定檔 (AVRCP) 控制媒體播放。
- 使用電話簿存取權設定檔 (PBAP) 分享聯絡人。
-
[7.4.3/A-SR] 強烈建議支援 Message Access Profile (MAP)。
-
[7.4.5/A] 應支援以行動網路為基礎的資料連線。
- [7.4.5/A] 可針對系統應用程式可用的網路使用系統 API
NetworkCapabilities#NET_CAPABILITY_OEM_PAID
常數。
外部攝影機是指拍攝裝置外部場景的攝影機,例如車用攝影機。
汽車裝置實作方式:
- 應包含一或多部外部攝影機。
如果車用裝置實作項目包含外部鏡頭,則針對這類鏡頭,系統會:
- [7.5/A-1-1] 不得透過 Android Camera API 存取車外攝影機,除非該攝影機符合攝影機核心規定。
- [7.5/A-SR] 強烈建議不要旋轉或水平鏡像相機預覽畫面。
- [7.5.5/A-SR] 強烈建議將相機調整為水平方向,讓相機的長邊與地平線對齊。
- [7.5/A-SR] 強烈建議解析度至少為 1.3 百萬像素。
- 應具備固定焦或 EDOF (擴大景深) 硬體。
- 應支援 Android 同步處理架構。
- 相機驅動程式中可能會實作硬體自動對焦或軟體自動對焦功能。
汽車裝置實作方式:
-
[7.6.1/A-0-1] 必須至少有 4 GB 的非揮發性儲存空間,用於應用程式私人資料 (又稱「/data」分區)。
-
[7.6.1/A] 應格式化資料分區,以便提升快閃儲存裝置的效能和壽命,例如使用
f2fs
檔案系統。
如果車用裝置實作項目透過內部不可移除儲存空間的一部分提供共用外部儲存空間,則會:
- [7.6.1/A-SR] 強烈建議您減少在外部儲存空間上執行作業的 I/O 負擔,例如使用
SDCardFS
。
如果車用裝置實作項目為 32 位元:
-
[7.6.1/A-1-1] 如果使用下列任一密度,則核心和使用者空間可用的記憶體必須至少為 512 MB:
- 在小型/一般螢幕上,解析度為 280dpi 以下
- 超大螢幕的 ldpi 或更低
- 大型螢幕的 mdpi 或更低
-
[7.6.1/A-1-2] 如果使用下列任一密度,則核心和使用者空間可用的記憶體必須至少為 608 MB:
- 小型/一般螢幕:xhdpi 以上
- 大型螢幕須為 hdpi 或更高
- 超大螢幕的 mdpi 或更高
-
[7.6.1/A-1-3] 如果使用下列任一密度,則核心和使用者空間可用的記憶體必須至少為 896 MB:
- 在小螢幕/一般螢幕上,解析度須達 400 dpi 以上
- 大型螢幕的 xhdpi 或更高
- 在超大螢幕上使用 tvdpi 或更高
-
[7.6.1/A-1-4] 如果使用下列任一密度,則核心和使用者空間的可用記憶體必須至少為 1344 MB:
- 在小型/一般螢幕上,顯示解析度須達 560 dpi 以上
- 大型螢幕的解析度須高於 400dpi
- xhdpi 或更高 (超大螢幕)
如果車用裝置實作方式為 64 位元:
-
[7.6.1/A-2-1] 如果使用下列任一密度,則核心和使用者空間可用的記憶體必須至少為 816 MB:
- 在小型/一般螢幕上,解析度為 280dpi 以下
- 超大螢幕的 ldpi 或更低
- 大型螢幕的 mdpi 或更低
-
[7.6.1/A-2-2] 如果使用下列任一密度,核心和使用者空間可用的記憶體必須至少為 944 MB:
- 小型/一般螢幕:xhdpi 以上
- 大型螢幕須為 hdpi 或更高
- 超大螢幕的 mdpi 或更高
-
[7.6.1/A-2-3] 如果使用下列任一密度,則核心和使用者空間可用的記憶體必須至少為 1280 MB:
- 在小螢幕/一般螢幕上,解析度須達 400 dpi 以上
- 大型螢幕的 xhdpi 或更高
- 在超大螢幕上使用 tvdpi 或更高
-
[7.6.1/A-2-4] 如果使用下列任一密度,核心和使用者空間可用的記憶體必須至少為 1824 MB:
- 在小型/一般螢幕上,至少為 560 dpi
- 大型螢幕的解析度須高於 400dpi
- xhdpi 或更高 (超大螢幕)
請注意,上述「核心和使用者空間可用的記憶體」是指除了已專用於硬體元件 (例如無線電、影片等) 的記憶體 (不在核心的裝置實作控制之下) 之外,所提供的記憶體空間。
汽車裝置實作方式:
- [7.7.1/A] 應包含支援週邊裝置模式的 USB 連接埠。
汽車裝置實作方式:
- [7.8.1/A-0-1] 必須包含麥克風。
汽車裝置實作方式:
- [7.8.2/A-0-1] 必須有音訊輸出裝置並宣告
android.hardware.audio.output
。
2.5.2. 多媒體
車用裝置實作項目必須支援下列音訊編碼和解碼格式,並提供給第三方應用程式:
- [5.1/A-0-1] MPEG-4 AAC 設定檔 (AAC LC)
- [5.1/A-0-2] MPEG-4 HE AAC Profile (AAC+)
- [5.1/A-0-3] AAC ELD (增強型低延遲 AAC)
車用裝置實作項目必須支援下列影片編碼格式,並提供給第三方應用程式:
車用裝置實作項目必須支援下列影片解碼格式,並提供給第三方應用程式:
強烈建議車用裝置實作項目支援下列影片解碼功能:
- [5.3/A-SR] H.265 HEVC
2.5.3. 軟體
汽車裝置實作方式:
-
[3/A-0-2] 必須支援 uiMode =
UI_MODE_TYPE_CAR
。 -
[3/A-0-3] 必須支援
android.car.*
命名空間中的所有公開 API。
如果 Automotive 裝置實作項目使用 android.car.VehiclePropertyIds
搭配 android.car.CarPropertyManager
提供專屬 API,則會:
汽車裝置實作方式:
-
[3.2.3.1/A-0-1] 對於由以下列出「應用程式意圖」所定義的所有公開意圖篩選器模式,必須使用意圖處理常式預先載入一或多個應用程式或服務元件。
-
[3.4.1/A-0-1] 必須提供
android.webkit.Webview
API 的完整實作。 -
[3.8.3/A-0-1] 第三方應用程式要求時,必須顯示使用
Notification.CarExtender
API 的通知。
如果車用裝置實作包含按下通話按鈕,則必須:
- [3.8.4/A-1-1] 必須使用短暫按下按鈕的互動方式,啟動使用者選取的輔助應用程式,也就是實作
VoiceInteractionService
的應用程式。
汽車裝置實作方式:
- [3.8.3.1/A-0-1] 必須正確轉譯資源,如
Notifications on Automotive OS
SDK 說明文件所述。 - [3.8.3.1/A-0-2] 必須顯示「播放」和「靜音」通知動作,而非透過
Notification.Builder.addAction()
提供的動作 - [3.8.3.1/A] 應限制使用大量管理工作,例如個別通知管道的控制項。可針對每個應用程式使用 UI 可用性,以減少控制項。
汽車裝置實作方式:
- [3.14/A-0-1] 必須包含 UI 架構,以便支援使用媒體 API 的第三方應用程式,如 3.14 所述。
- [3.14/A-0-2] 必須允許使用者在行車時安全地與媒體應用程式互動。
- [3.14/A-0-3] 必須支援使用
CAR_EXTRA_MEDIA_PACKAGE
額外資料的CAR_INTENT_ACTION_MEDIA_TEMPLATE
隱含意圖動作。 - [3.14/A-0-4] 必須提供導覽至媒體應用程式偏好設定活動的操作元素,但只能在車輛使用者體驗限制無效時啟用。
- [3.14/A-0-5] 必須顯示媒體應用程式設定的錯誤訊息,且必須支援選用的額外項目
ERROR_RESOLUTION_ACTION_LABEL
和ERROR_RESOLUTION_ACTION_INTENT
。 - [3.14/A-0-6] 對於支援搜尋功能的應用程式,必須支援應用程式內搜尋操作元素。
- [3.14/A-0-7] 顯示 MediaBrowser 階層時,必須遵循
CONTENT_STYLE_BROWSABLE_HINT
和CONTENT_STYLE_PLAYABLE_HINT
定義。
如果車用裝置實作內容包含預設啟動器應用程式,則必須符合下列條件:
- [3.14/A-1-1] 必須納入媒體服務,並使用
CAR_INTENT_ACTION_MEDIA_TEMPLATE
意圖開啟這些服務。
汽車裝置實作方式:
- [3.8/A] 可限制應用程式要求進入全螢幕模式,如
immersive documentation
所述。 - [3.8/A] 可隨時顯示狀態列和導覽列。
- [3.8/A] 可限制應用程式要求變更系統 UI 元素背後的顏色,確保這些元素隨時都能清楚顯示。
2.5.4. 效能和電源
汽車裝置實作方式:
- [8.2/A-0-1] 必須針對每個程序的 UID 回報讀取及寫入至非揮發性儲存空間的位元組數量,以便開發人員透過系統 API
android.car.storagemonitoring.CarStorageMonitoringManager
取得統計資料。Android 開放原始碼計畫透過uid_sys_stats
核心模組滿足這項需求。 - [8.3/A-1-3] 必須支援車庫模式。
- [8.3/A] 每次行駛後應至少處於車庫模式 15 分鐘,除非:
- 電池電量耗盡。
- 系統不會排定閒置工作。
- 駕駛員退出車庫模式。
- [8.4/A-0-1] 必須提供個別元件的電源設定檔,定義每個硬體元件的電流消耗值,以及這些元件隨時間推移所造成的電池耗電量估計值,詳情請參閱 Android 開放原始碼專案網站。
- [8.4/A-0-2] 必須以毫安培小時 (mAh) 為單位回報所有耗電量值。
- [8.4/A-0-3] 必須針對每個程序的 UID 回報 CPU 耗電量。Android 開放原始碼計畫透過
uid_cputime
核心模組實作項目滿足這項需求。 - [8.4/A] 如果無法將硬體元件的耗電量歸因於應用程式,則應歸因於硬體元件本身。
- [8.4/A-0-4] 必須透過
adb shell dumpsys batterystats
殼層指令,將這項電量用量資訊提供給應用程式開發人員。
2.5.5. 安全性模型
如果 Automotive 裝置實作支援多位使用者,則必須符合下列條件:
- [9.5/A-1-1] 除了裝置佈建,請勿允許使用者與無頭系統使用者互動或切換至該使用者。
- [9.5/A-1-2] 必須在
BOOT_COMPLETED
之前切換至次要使用者。 - [9.5/A-1-3] 必須支援建立訪客使用者的功能,即使裝置上的使用者人數已達上限也一樣。
汽車裝置實作方式:
- [9.11/A-0-1] 必須使用獨立的執行環境備份 KeyStore 實作。
- [9.11/A-0-2] 必須實作 RSA、AES、ECDSA 和 HMAC 加密演算法,以及 MD5、SHA1 和 SHA-2 系列雜湊函式,才能在與核心以上層級執行的程式碼安全隔離的區域中,正確支援 Android Keystore 系統支援的演算法。安全隔離功能必須封鎖所有潛在機制,以免核心或使用者空間程式碼存取隔離環境的內部狀態,包括 DMA。上游 Android 開放原始碼計畫 (AOSP) 使用 Trusty 實作項目來滿足這項規定,但其他以 ARM TrustZone 為基礎的解決方案,或第三方審查的安全實作項目,也是適當的虛擬機器人隔離方式。
- [9.11/A-0-3] 必須在隔離的執行環境中執行螢幕鎖定畫面驗證,且只有在驗證成功時,才允許使用與驗證綁定的金鑰。螢幕鎖定憑證必須以只允許隔離執行環境執行螢幕鎖定驗證的方式儲存。上游 Android 開放原始碼計畫提供 Gatekeeper 硬體抽象層 (HAL) 和 Trusty,可用於滿足這項需求。
- [9.11/A-0-4] 必須支援金鑰認證,其中認證簽署金鑰受到安全硬體保護,且簽署作業是在安全硬體中執行。認證簽署金鑰必須在大量裝置上共用,以免被用作裝置 ID。如要符合這項規定,您可以共用相同的認證金鑰,除非您生產的特定 SKU 數量至少達 100,000 個。如果某個 SKU 的產量超過 100,000 個,則每 100,000 個單位可能會使用不同的鍵。
請注意,如果裝置實作已在較舊的 Android 版本上推出,則該裝置不必符合要求,即不必具備由隔離執行環境支援的金鑰存放區,也不必支援金鑰認證,除非該裝置宣告 android.hardware.fingerprint
功能,而該功能要求由隔離執行環境支援的金鑰存放區。
汽車裝置實作方式:
- [9.14/A-0-1] 必須從 Android 架構車輛子系統中保留訊息,例如將允許的訊息類型和訊息來源新增至許可清單。
- [9.14/A-0-2] 必須使用監控程式,防範來自 Android 架構或第三方應用程式的拒絕服務攻擊。這可防止惡意軟體透過流量大量傳送至車輛網路,進而導致車輛子系統發生故障。
2.5.6. 開發人員工具和選項相容性
汽車裝置實作方式:
-
Perfetto
- [6.1/A-0-1] 必須向殼層使用者公開
/system/bin/perfetto
二進位檔,該 cmdline 必須符合 Perfetto 說明文件。 - [6.1/A-0-2] Perfetto 二進位檔必須接受符合 Perfetto 說明文件中定義的結構定義的 protobuf 設定。
- [6.1/A-0-3] Perfetto 二進位檔必須將 protobuf 追蹤記錄寫入輸出,且該追蹤記錄必須符合 Perfetto 說明文件中定義的結構定義。
- [6.1/A-0-4] 必須透過 Perfeto 二進位檔提供至少 Perfeto 說明文件中所述的資料來源。
- [6.1/A-0-1] 必須向殼層使用者公開
2.6. 平板電腦需求條件
「Android 平板電腦裝置」是指通常符合下列所有條件的 Android 裝置實作方式:
- 使用時請雙手握住。
- 不支援折疊式或可轉換式設定。
- 與裝置搭配使用的實體鍵盤實作項目,透過標準連線方式 (例如 USB、藍牙) 連線。
- 具備可提供行動力的電源,例如電池。
- 螢幕對角線尺寸介於 7 到 18 英寸之間。
平板電腦裝置實作項目的相關要求與手持裝置實作項目相似。例外狀況會在該章節中以「*」標示,並在本節中列出供您參考。
2.6.1. 硬體
螢幕大小
- [7.1.1.1/Tab-0-1] 螢幕尺寸必須介於 7 到 18 吋。
陀螺儀
如果平板電腦裝置實作方式包含 3 軸陀螺儀,則會:
- [7.3.4/Tab-1-1] 必須能夠測量每秒最多 1000 度的方向變化。
最低記憶體和儲存空間 (第 7.6.1 節)
在手持裝置規格中,針對小螢幕/一般螢幕列出的螢幕密度不適用於平板電腦。
USB 周邊裝置模式 (第 7.7.1 節)
如果平板電腦裝置實作項目包含支援周邊模式的 USB 連接埠,則會:
- [7.7.1/Tab] 可實作 Android Open Accessory (AOA) API。
虛擬實境模式 (第 7.9.1 節)
虛擬實境高效能 (第 7.9.2 節)
虛擬實境規定不適用於平板電腦。
2.6.2. 安全性模型
金鑰和憑證 (第 9.11 節)
請參閱第 [9.11] 節。
如果平板電腦裝置實作包含多位使用者,且未宣告 android.hardware.telephony
功能旗標,則會發生以下情況:
- [9.5/T-1-1] 必須支援受限設定檔,這項功能可讓裝置擁有者管理裝置上的其他使用者和他們的功能。透過受限設定檔,裝置擁有者可以快速設定其他使用者可使用的獨立環境,並在這些環境中管理應用程式的精細限制。
如果平板電腦裝置實作包含多位使用者,並宣告 android.hardware.telephony
功能旗標,則會發生以下情況:
- [9.5/T-2-1] 不得支援受限制的設定檔,但必須與 AOSP 的控制項實作方式保持一致,以便啟用 /停用其他使用者存取語音通話和簡訊的權限。
2.6.2. 軟體
3. 軟體
3.1. 代管 API 相容性
受管理的 Dalvik 位元碼執行環境是 Android 應用程式的主要載具。Android 應用程式設計介面 (API) 是指向在受管理的執行階段環境中執行的應用程式公開的 Android 平台介面組合。
裝置實作方式:
-
[C-0-1] 必須提供完整的實作項目,包括所有已記錄行為,這些行為是指 Android SDK 公開的任何已記錄 API,或是在 Android 上游原始碼中加上「@SystemApi」標記的任何 API。
-
[C-0-2] 必須支援/保留所有標示為 TestApi 註解 (@TestApi) 的類別、方法和相關元素。
-
[C-0-3] 除非本相容性定義明確允許,否則不得省略任何受管理的 API、變更 API 介面或簽章、偏離說明的行為,或包含無操作。
-
[C-0-4] 即使 Android 省略了某些硬體功能的 API,也必須保留這些 API,並以合理的方式運作。如要瞭解此情境的具體規定,請參閱第 7 節。
-
[C-0-5] 不得允許第三方應用程式使用非 SDK 介面,這類介面是指 AOSP 啟動作業階段路徑集區中的 Java 語言套件中的方法和欄位,且不屬於公開 SDK 的一部分。這包括在 SDK 文件中所述,以
@hide
註解修飾但未以@SystemAPI
修飾的 API,以及私人和套件私人類別成員。 -
[C-0-6] 必須將每個非 SDK 介面與相同的受限制清單一併提供,這些清單是透過 AOSP 中適當 API 級別分支的
prebuilts/runtime/appcompat/hiddenapi-flags.csv
路徑,透過暫時性和拒絕清單旗標提供。 -
[C-0-7] 必須支援已簽署的設定檔動態更新機制,藉此使用 AOSP 中現有的公開金鑰,在任何 APK 中嵌入已簽署的設定檔,從受限制清單中移除非 SDK 介面。
不過,
- 可行,如果裝置實作中沒有隱藏的 API,或實作方式不同,請將隱藏的 API 移至拒絕清單,或從所有受限制的清單 (即淺灰、深灰、黑) 中略過。
- 可行,如果 AOSP 中沒有隱藏的 API,請將隱藏的 API 新增至任何受限制的清單 (即淺灰、深灰、黑)。
3.1.1. Android 擴充功能
Android 支援透過更新特定 API 級別的擴充功能版本,擴充特定 API 級別的受管理 API 途徑。如果有該 API 級別的擴充功能,android.os.ext.SdkExtensions.getExtensionVersion(int apiLevel)
API 會傳回提供的 apiLevel
擴充功能版本。
Android 裝置實作:
-
[C-0-1] 必須預先載入共用程式庫
ExtShared
和服務ExtServices
的 AOSP 實作項目,版本必須大於或等於各 API 級別允許的最低版本。舉例來說,搭載 Android 7.0 裝置實作項目 (執行 API 級別 24) 必須至少包含第 1 版。 -
[C-0-2] 僅可傳回 AOSP 定義的有效擴充功能版本號碼。
-
[C-0-3] 必須按照第 3.1 節的規定,以與其他受管理 API 相同的方式支援
android.os.ext.SdkExtensions.getExtensionVersion(int apiLevel)
傳回的擴充功能版本所定義的所有 API。
3.1.2. Android 程式庫
由於 Apache HTTP 用戶端已淘汰,因此裝置實作項目:
- [C-0-1] 請勿將
org.apache.http.legacy
程式庫放在 bootclasspath 中。 - [C-0-2] 只有在應用程式符合下列任一條件時,才須將
org.apache.http.legacy
程式庫新增至應用程式類別路徑:- 指定 API 級別 28 以下。
- 將
<uses-library>
的android:name
屬性設為org.apache.http.legacy
,在資訊清單中宣告需要程式庫。
AOSP 實作方式符合這些需求。
3.2. 軟體 API 相容性
除了第 3.1 節中的受管理 API,Android 也包含了重要的執行階段專屬「軟性」API,例如意圖、權限和其他無法在應用程式編譯期間強制執行的 Android 應用程式相關項目。
3.2.1. 權限
3.2.2. 建構參數
Android API 在 android.os.Build 類別上包含許多常數,用於描述目前的裝置。
- [C-0-1] 為在各裝置實作中提供一致且有意義的值,下表列出這些值的格式額外限制,裝置實作必須符合這些限制。
參數 | 詳細資料 |
---|---|
VERSION.RELEASE | 目前執行的 Android 系統版本,以人類可讀的格式表示。這個欄位必須包含 11 中定義的字串值之一。 |
VERSION.SDK | 目前執行的 Android 系統版本,格式可供第三方應用程式程式碼存取。對於 Android 11,這個欄位必須包含整數值 11_INT。 |
VERSION.SDK_INT | 目前執行的 Android 系統版本,格式可供第三方應用程式程式碼存取。對於 Android 11,這個欄位必須包含整數值 11_INT。 |
VERSION.INCREMENTAL | 裝置實作者選擇的值,用於指定目前執行中 Android 系統的特定版本,並以人類可讀的格式呈現。這個值不得重複用於提供給使用者的不同版本。這個欄位的常見用途是指出系統用來產生建構項目的建構編號或來源控管變更 ID。這個欄位的值必須能以可列印的 7 位元 ASCII 編碼,且符合規則運算式「^[^ :\/~]+$」。 |
BOARD | 裝置實作者選擇的值,用於識別裝置使用的特定內部硬體,格式為人類可讀的格式。這個欄位的可能用途是指出為裝置供電的板子特定修訂版本。這個欄位的值必須能以 7 位元 ASCII 編碼,且符合規則運算式「^[a-zA-Z0-9_-]+$」。 |
品牌 | 這個值會反映與裝置相關聯的品牌名稱,使用者可以透過這個名稱辨識裝置。必須採用人類可讀的格式,且應代表裝置的製造商,或裝置行銷時使用的公司品牌。這個欄位的值必須能以 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 | 原生程式碼的第二個指令集名稱 (CPU 類型 + ABI 慣例)。請參閱第 3.3 節。本機 API 相容性。 |
CPU_ABI | 原生程式碼的指令集名稱 (CPU 類型 + ABI 慣例)。請參閱第 3.3 節。本機 API 相容性。 |
CPU_ABI2 | 原生程式碼的第二個指令集名稱 (CPU 類型 + ABI 慣例)。請參閱第 3.3 節。本機 API 相容性。 |
裝置 | 裝置實作者選擇的值,其中包含開發名稱或代碼名稱,可識別裝置的硬體功能和工業設計設定。這個欄位的值必須能以 7 位元 ASCII 編碼,且符合規則運算式「^[a-zA-Z0-9_-]+$」。這個裝置名稱在產品的使用期間不得變更。 |
FINGERPRINT |
用於唯一識別此版本的字串。應以人類可讀的方式呈現。必須符合以下範本:
$(BRAND)/$(PRODUCT)/ 例如:
acme/myproduct/ 指紋不得包含空白字元。這個欄位的值必須能以 7 位元 ASCII 編碼。 |
硬體 | 硬體名稱 (來自核心命令列或 /proc)。應以人類可讀的方式呈現。這個欄位的值必須能以 7 位元 ASCII 編碼,且符合規則運算式「^[a-zA-Z0-9_-]+$」。 |
HOST | 這個字串可用於識別建構所在主機,並以人類可讀的格式呈現。這個欄位沒有特定格式規定,但不得為空值或空字串 ("")。 |
ID | 裝置實作者選擇的 ID,用於參照特定版本,並以人類可讀的格式呈現。這個欄位可以與 android.os.Build.VERSION.INCREMENTAL 相同,但應為使用者區分軟體版本時可充分利用的值。這個欄位的值必須能以 7 位元 ASCII 編碼,且符合規則運算式「^[a-zA-Z0-9._-]+$」。 |
製造商 | 產品的原始設備製造商 (OEM) 商號。這個欄位沒有特定格式規定,但不得為空值或空字串 ("")。這個欄位不得在產品生命週期內變更。 |
型號 | 裝置實作者選擇的值,包含使用者所知的裝置名稱。這個名稱應與向終端使用者行銷和銷售裝置時使用的名稱相同。這個欄位沒有特定格式規定,但不得為空值或空字串 ("")。這個欄位不得在產品生命週期內變更。 |
PRODUCT | 裝置實作者選擇的值,包含特定產品 (SKU) 的開發名稱或代碼名稱,且必須在同一個品牌中不重複。必須是人類可讀的形式,但不一定是供使用者查看。這個欄位的值必須能以 7 位元 ASCII 編碼,且符合規則運算式「^[a-zA-Z0-9_-]+$」。這個產品名稱在產品的生命週期內不得變更。 |
SERIAL | 必須傳回「UNKNOWN」。 |
標記 | 以半形逗號分隔的清單,列出裝置實作者選擇的標記,可進一步區分版本。標記必須能以 7 位元 ASCII 編碼,且符合規則運算式「^[a-zA-Z0-9._-]+」,且必須有一個值對應於三種典型的 Android 平台簽署設定:發布版金鑰、開發版金鑰和測試版金鑰。 |
時間 | 代表建構作業發生時間的時間戳記值。 |
類型 | 裝置實作者選擇的值,可指定建構作業的執行階段設定。這個欄位必須包含一個值,對應至三種典型的 Android 執行階段設定:user、userdebug 或 eng。 |
USER | 產生版本的使用者 (或自動化使用者) 的名稱或使用者 ID。這個欄位的格式沒有特定規定,但不得為空值或空字串 ("")。 |
VERSION.SECURITY_PATCH | 這個值表示版本的安全性修補程式等級。此標記必須表示此版本在任何情況下都不會受到指定 Android 公開安全性公告中所述問題的影響。格式必須為 [YYYY-MM-DD],且必須與 Android 安全性公告或Android 安全性警示中定義的字串相符,例如「2015-11-01」。 |
VERSION.BASE_OS | 這個值代表建構版本的 FINGERPRINT 參數,除了 Android 公開安全性公告中提供的修補程式外,其他都與此建構版本相同。必須回報正確的值,如果不存在此版本,則回報空字串 ("")。 |
BOOTLOADER | 裝置實作者選擇的值,用於識別裝置中使用的特定內部系統啟動載入程式版本,以人類可讀的格式呈現。這個欄位的值必須能以 7 位元 ASCII 編碼,且符合規則運算式「^[a-zA-Z0-9._-]+$」。 |
getRadioVersion() | 必須 (或傳回) 裝置實作者選擇的值,以人類可判讀的格式,識別裝置中使用的特定內部無線電/調變器版本。如果裝置沒有任何內部無線電/數據機,則必須傳回 NULL。這個欄位的值必須能以 7 位元 ASCII 編碼,且符合規則運算式「^[a-zA-Z0-9._-,]+$」。 |
getSerial() | 必須 (或傳回) 硬體序號,且該序號必須可用且在型號和製造商相同的裝置中不重複。這個欄位的值必須能以 7 位元 ASCII 編碼,且符合規則運算式「^[a-zA-Z0-9._-,]+$」。 |
3.2.3. 意圖相容性
3.2.3.1. 常見的應用程式意圖
Android 意圖可讓應用程式元件向其他 Android 元件要求功能。Android 上游專案包含了實作多種意圖模式以執行常見動作的應用程式清單。
裝置實作方式:
- [C-SR] 強烈建議您使用意圖處理常規,為「此處」列出的以下應用程式意圖定義的所有公開意圖篩選器模式預先載入一或多個應用程式或服務元件,並提供滿足開發人員對這些常見應用程式意圖的期望,如 SDK 所述。
如要瞭解各裝置類型的強制應用程式意圖,請參閱第 2 節。
3.2.3.2. 意圖解析
-
[C-0-1] 由於 Android 是可擴充的平台,因此裝置實作必須允許第三方應用程式覆寫 第 3.2.3.1 節中所參照的每個意圖模式 (「設定」除外)。根據預設,上游 Android 開放原始碼實作會允許這項操作。
-
[C-0-2] 裝置實作者不得為系統應用程式使用這些意圖模式時附加特殊權限,或禁止第三方應用程式繫結至這些模式並接管控制權。這項禁止行為包括但不限於停用「選擇器」使用者介面,因為該介面可讓使用者在多個應用程式中選擇,而這些應用程式都會處理相同的意圖模式。
-
[C-0-3] 裝置實作必須提供使用者介面,讓使用者修改意圖的預設活動。
-
不過,如果預設活動為資料 URI 提供更明確的屬性,裝置實作可能會為特定 URI 模式 (例如 http://play.google.com) 提供預設活動。舉例來說,指定資料 URI「http://www.android.com」的意圖篩選器模式比瀏覽器的「http://」核心意圖模式更為明確。
Android 也提供機制,讓第三方應用程式針對特定類型的網頁 URI 意圖,宣告可靠的預設應用程式連結行為。在應用程式意圖篩選器模式中定義這類權威宣告時,裝置實作方式如下:
- [C-0-4] 必須嘗試驗證任何意圖篩選器,方法是執行 Digital Asset Link 規格中定義的驗證步驟,並由上游 Android 開放原始碼專案中的 Package Manager 實作。
- [C-0-5] 在安裝應用程式時,您必須嘗試驗證意圖篩選器,並將所有已成功驗證的 URI 意圖篩選器設為其 URI 的預設應用程式處理常式。
- 可將特定 URI 意圖篩選器設為其 URI 的預設應用程式處理常式,前提是這些篩選器已成功驗證,但其他候選 URI 篩選器驗證失敗。如果裝置實作這項功能,就必須在設定選單中提供適當的 URI 模式覆寫值。
- 您必須在「設定」中為使用者提供個別應用程式 App Links 控制項,如下所示:
- [C-0-6] 使用者必須能夠全面覆寫應用程式的預設應用程式連結行為,以便選擇「一律開啟」、「一律詢問」或「一律不開啟」等選項,且這些選項必須一律套用至所有候選 URI 意圖篩選器。
- [C-0-7] 使用者必須能夠查看候選 URI 意圖篩選器的清單。
- 裝置實作可能會為使用者提供功能,讓他們能夠根據個別意圖篩選器,覆寫已成功驗證的特定候選 URI 意圖篩選器。
- [C-0-8] 如果裝置實作讓部分候選 URI 意圖篩選器通過驗證,而其他候選 URI 意圖篩選器則無法通過,則裝置實作必須提供使用者查看及覆寫特定候選 URI 意圖篩選器的功能。
3.2.3.3. 意圖命名空間
- [C-0-1] 裝置實作不得包含任何 Android 元件,該元件會使用 android. 或 com.android. 命名空間中的 ACTION、CATEGORY 或其他關鍵字串,遵循任何新的意圖或廣播意圖模式。
- [C-0-2] 裝置導入者不得在屬於其他機構的套件空間中,使用 ACTION、CATEGORY 或其他關鍵字串,納入任何遵循新意圖或廣播意圖模式的 Android 元件。
- [C-0-3] 裝置導入者不得變更或擴充第 3.2.3.1 節所列的任何意圖模式。
- 裝置實作可能會包含意圖模式,使用與其自身組織明確且明顯相關的命名空間。這項禁止規定與 第 3.6 節中針對 Java 語言類別所述的規定類似。
3.2.3.4. 廣播意圖
第三方應用程式會依賴平台發布特定意圖,以便通知硬體或軟體環境的變更。
裝置實作方式:
- [C-0-1] 必須根據 SDK 說明文件的說明,針對適當的系統事件廣播 此處列出的公開廣播意圖。請注意,這項規定不會與第 3.5 節相衝突,因為 SDK 說明文件中也說明瞭背景應用程式的限制。此外,某些廣播意圖需要硬體支援,如果裝置支援必要的硬體,就必須廣播意圖,並提供與 SDK 說明文件一致的行為。
3.2.3.5. 條件式應用程式意圖
Android 提供的設定可讓使用者輕鬆選取預設應用程式,例如主畫面或 SMS。
在適當情況下,裝置實作方式必須提供類似的設定選單,並與 SDK 說明文件中所述的意圖篩選器模式和 API 方法相容,如下所示。
如果裝置實作項目回報 android.software.home_screen
,則會:
- [C-1-1] 必須遵循
android.settings.HOME_SETTINGS
意圖,顯示主畫面的預設應用程式設定選單。
如果裝置實作項目回報 android.hardware.telephony
,則會:
-
[C-2-1] 必須提供設定選單,呼叫
android.provider.Telephony.ACTION_CHANGE_DEFAULT
意圖,以便顯示對話方塊,變更預設的簡訊應用程式。 -
[C-2-2] 必須遵循
android.telecom.action.CHANGE_DEFAULT_DIALER
意圖,顯示對話方塊,允許使用者變更預設的電話應用程式。- 接聽與撥打電話時,必須使用使用者選取的預設電話應用程式 UI,但緊急電話會使用預先安裝的電話應用程式。
-
[C-2-3] 必須遵循 android.telecom.action.CHANGE_PHONE_ACCOUNTS 意圖,提供使用者操作選項,讓使用者能夠設定與
PhoneAccounts
相關聯的ConnectionServices
,以及電信服務供應商用來撥打電話的預設 PhoneAccount。AOSP 實作項目在「通話」設定選單中加入「撥打帳戶選項」選單,以符合這項規定。 -
[C-2-4] 對於具備
android.app.role.CALL_REDIRECTION
角色的應用程式,必須允許android.telecom.CallRedirectionService
。 - [C-2-5] 必須提供使用者選取具備
android.app.role.CALL_REDIRECTION
角色的應用程式的操作元素。 - [C-2-6] 必須遵循 android.intent.action.SENDTO 和 android.intent.action.VIEW 意圖,並提供用於傳送/顯示簡訊的活動。
- [C-SR] 強烈建議您使用預先載入的撥號應用程式,處理 android.intent.action.ANSWER、android.intent.action.CALL、android.intent.action.CALL_BUTTON、android.intent.action.VIEW 和 android.intent.action.DIAL 意圖,並提供 SDK 所述的執行結果。
如果裝置實作項目回報 android.hardware.nfc.hce
,則會:
- [C-3-1] 必須遵循 android.settings.NFC_PAYMENT_SETTINGS 意圖,顯示感應式付款的預設應用程式設定選單。
- [C-3-2] 必須遵循 android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT 意圖,顯示活動,開啟對話方塊,要求使用者變更特定類別的預設卡片模擬服務,如 SDK 所述。
如果裝置實作項目回報 android.hardware.nfc
,則會:
- [C-4-1] 必須遵循以下意圖:android.nfc.action.NDEF_DISCOVERED、android.nfc.action.TAG_DISCOVERED 和 android.nfc.action.TECH_DISCOVERED,以顯示符合開發人員對 SDK 中所述意圖預期的活動。
如果裝置實作支援 VoiceInteractionService
,且同時安裝多個使用此 API 的應用程式,則會發生以下情況:
- [C-4-1] 必須遵循
android.settings.ACTION_VOICE_INPUT_SETTINGS
意圖,顯示語音輸入和協助功能的預設應用程式設定選單。
如果裝置實作項目回報 android.hardware.bluetooth
,則會:
- [C-5-1] 必須遵循 ‘android.bluetooth.adapter.action.REQUEST_ENABLE’ 意圖,並顯示系統活動,允許使用者開啟藍牙。
- [C-5-2] 必須遵循 ‘android.bluetooth.adapter.action.REQUEST_DISCOVERABLE’ 意圖,並顯示要求可偵測模式的系統活動。
如果裝置實作支援 DND 功能,則會:
- [C-6-1] 必須實作可回應意圖
ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS
的活動,如果是使用 UI_MODE_TYPE_NORMAL 的實作項目,則活動必須是使用者可授予或拒絕應用程式 DND 政策設定存取權的活動。
如果裝置實作允許使用者在裝置上使用第三方輸入法,使用者必須:
- [C-7-1] 必須提供使用者可存取的機制,以便在回應
android.settings.INPUT_METHOD_SETTINGS
意圖時新增及設定第三方輸入法。
如果裝置實作支援第三方無障礙服務,則必須符合下列條件:
- [C-8-1] 必須遵循
android.settings.ACCESSIBILITY_SETTINGS
意圖,提供可供使用者存取的機制,以便啟用及停用第三方無障礙服務,以及預先載入的無障礙服務。
如果裝置實作內容支援 Wi-Fi Easy Connect,並將這項功能公開給第三方應用程式,則必須:
- [C-9-1] 必須實作 Settings#ACTION_PROCESS_WIFI_EASY_CONNECT_URI 意圖 API,如 SDK 說明文件所述。
如果裝置實作提供資料節省模式,則必須符合以下規定:* [C-10-1] 設定中必須提供使用者介面,以便處理 Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
意圖,讓使用者可將應用程式新增至允許清單,或從清單中移除應用程式。
如果裝置實作方式未提供數據節省模式,則會發生以下情況:
- [C-11-1] 活動必須處理
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
意圖,但可將其實作為無操作。
如果裝置實作項目透過 android.hardware.camera.any
宣告支援攝影機,則會:
- [C-12-1] 必須遵循
android.media.action.STILL_IMAGE_CAMERA
和android.media.action.STILL_IMAGE_CAMERA_SECURE
意圖,並按照 SDK 說明,以靜態影像模式啟動相機。 - [C-12-2] 必須遵循
android.media.action.VIDEO_CAMERA
意圖,如 SDK 所述,以錄影模式啟動相機。 - [C-12-3] 必須遵守以下規定:只允許預先安裝的 Android 應用程式處理 SDK 文件中所述的以下意圖
MediaStore.ACTION_IMAGE_CAPTURE
、MediaStore.ACTION_IMAGE_CAPTURE_SECURE
和MediaStore.ACTION_VIDEO_CAPTURE
。
如果裝置實作項目回報 android.software.device_admin
,則會:
-
[C-13-1] 必須遵循意圖
android.app.action.ADD_DEVICE_ADMIN
的規則,叫用 UI 讓使用者將裝置管理員新增至系統 (或允許他們拒絕)。 -
[C-13-2] 必須遵循 android.app.action.ADMIN_POLICY_COMPLIANCE、android.app.action.GET_PROVISIONING_MODE、android.app.action.PROVISIONING_SUCCESSFUL、android.app.action.PROVISION_MANAGED_DEVICE、android.app.action.PROVISION_MANAGED_PROFILE、android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD、android.app.action.SET_NEW_PASSWORD 和 android.app.action.START_ENCRYPTION 的意圖,並提供活動來滿足這些意圖,如 這裡所述。
如果裝置實作宣告 android.software.autofill
功能旗標,則會:
- [C-14-1] 必須完整實作
AutofillService
和AutofillManager
API,並遵循 android.settings.REQUEST_SET_AUTOFILL_SERVICE 意圖,顯示預設應用程式設定選單,以便啟用/停用自動填入服務,並為使用者變更預設自動填入服務。
如果裝置實作內容包含預先安裝的應用程式,或希望允許第三方應用程式存取使用統計資料,則應採取以下做法:
- [C-SR] 強烈建議提供使用者可存取的機制,以便在使用者聲明
android.permission.PACKAGE_USAGE_STATS
權限時,授予或撤銷使用者對使用情形統計資料的存取權,以回應 android.settings.ACTION_USAGE_ACCESS_SETTINGS 意圖。
如果裝置實作方式不允許任何應用程式 (包括預先安裝的應用程式) 存取使用統計資料,則應採取以下做法:
- [C-15-1] 必須仍有處理 android.settings.ACTION_USAGE_ACCESS_SETTINGS 意圖模式的活動,但必須以無操作方式實作,也就是說,必須具備與使用者拒絕存取權時相同的行為。
如果裝置實作項目回報 android.hardware.audio.output
功能,則會:
- [C-SR] 強烈建議您為 android.intent.action.TTS_SERVICE、android.speech.tts.engine.INSTALL_TTS_DATA 和 android.speech.tts.engine.GET_SAMPLE_TEXT 意圖建立活動,以便為這些意圖提供執行結果,如 SDK 這裡所述。
Android 支援互動式螢幕保護程式 (先前稱為夢境)。當裝置連接至電源處於閒置狀態,或已連接至桌面底座時,使用者可以透過螢幕保護程式與應用程式互動。裝置實作方式:
- 應支援螢幕保護程式,並提供設定選項,讓使用者可根據
android.settings.DREAM_SETTINGS
意圖設定螢幕保護程式。
3.2.4. 輔助/多螢幕上的活動
如果裝置實作允許在多個螢幕上啟動一般 Android 活動,則會執行以下操作:
- [C-1-1] 必須設定
android.software.activities_on_secondary_displays
功能旗標。 - [C-1-2] 必須保證 API 相容性,類似於在主要螢幕上執行的活動。
- [C-1-3] 啟動新活動時,如果未透過
ActivityOptions.setLaunchDisplayId()
API 指定目標螢幕,則必須將新活動放置在啟動該活動的活動所使用的螢幕上。 - [C-1-4] 移除含有
Display.FLAG_PRIVATE
標記的螢幕時,必須銷毀所有活動。 - [C-1-5] 裝置鎖定時,除非應用程式選擇使用
Activity#setShowWhenLocked()
API 在鎖定畫面頂端顯示內容,否則必須在所有畫面上安全隱藏內容。 - 應具備與該螢幕相對應的
android.content.res.Configuration
,才能正確顯示、運作,並在活動在次要螢幕上啟動時維持相容性。
如果裝置實作可在次要螢幕上啟動一般 Android 活動,且次要螢幕具有 android.view.Display.FLAG_PRIVATE 標記:
- [C-3-1] 只有該螢幕的擁有者、系統和已在該螢幕上顯示的活動,才能啟動該螢幕。任何人都可以啟動具有 android.view.Display.FLAG_PUBLIC 標記的螢幕。
3.3. 原生 API 相容性
原生程式碼的相容性很難處理。因此,裝置實作者必須:
- [SR] 強烈建議您使用下列程式庫的實作項目,這些程式庫來自上游 Android 開放原始碼專案。
3.3.1. 應用程式二進位檔介面
受管理的 Dalvik 位元碼可呼叫應用程式 .apk
檔案提供的原生程式碼,做為針對適當裝置硬體架構編譯的 ELF .so
檔案。由於原生程式碼高度仰賴基礎處理器技術,因此 Android 會在 Android NDK 中定義多個應用程式二進位檔介面 (ABI)。
裝置實作方式:
- [C-0-1] 必須與一或多個已定義的 Android NDK ABI 相容。
- [C-0-2] 必須支援在受管理環境中執行的程式碼,以便使用標準 Java Native Interface (JNI) 語意,呼叫原生程式碼。
- [C-0-3] 必須與下列清單中的每個必要程式庫相容 (即標頭相容),並與 ABI 相容 (針對 ABI)。
- [C-0-5] 必須透過
android.os.Build.SUPPORTED_ABIS
、android.os.Build.SUPPORTED_32_BIT_ABIS
和android.os.Build.SUPPORTED_64_BIT_ABIS
參數,準確回報裝置支援的原生應用程式二進位檔介面 (ABI),每個參數都是以半形逗號分隔的 ABI 清單,並依優先順序排列。 -
[C-0-6] 必須透過上述參數回報下列 ABI 清單的子集,且不得回報清單中未列出的任何 ABI。
-
armeabi
(已不再受 NDK 支援) -
armeabi-v7a
-
arm64-v8a
-
x86
-
x86-64
-
-
[C-0-7] 必須為下列所有程式庫提供原生 API,讓包含原生程式碼的應用程式可使用:
- libaaudio.so (AAudio 原生音訊支援)
- libamidi.so (原生 MIDI 支援,如果聲明的功能是
android.software.midi
,請參閱第 5.9 節) - libandroid.so (原生 Android 活動支援)
- libc (C 程式庫)
- libcamera2ndk.so
- libdl (動態連結器)
- libEGL.so (原生 OpenGL 途徑管理)
- libGLESv1_CM.so (OpenGL ES 1.x)
- libGLESv2.so (OpenGL ES 2.0)
- libGLESv3.so (OpenGL ES 3.x)
- libicui18n.so
- libicuuc.so
- libjnigraphics.so
- liblog (Android 記錄)
- libmediandk.so (原生媒體 API 支援)
- libm (數學程式庫)
- libneuralnetworks.so (Neural Networks API)
- libOpenMAXAL.so (支援 OpenMAX AL 1.0.1)
- libOpenSLES.so (OpenSL ES 1.0.1 音訊支援)
- libRS.so
- libstdc++ (C++ 最基本支援)
- libvulkan.so (Vulkan)
- libz (Zlib 壓縮)
- JNI 介面
-
[C-0-8] 請勿為上述原生程式庫新增或移除公開函式。
- [C-0-9] 必須在
/vendor/etc/public.libraries.txt
中列出直接公開給第三方應用程式的其他非 AOSP 程式庫。 - [C-0-10] 不得將任何其他原生程式庫公開給指定 API 級別 24 以上版本的第三方應用程式,因為這些程式庫已保留。
- [C-0-11] 必須透過
libGLESv3.so
程式庫,匯出 NDK 中定義的所有 OpenGL ES 3.1 和 Android 擴充套件函式符號。請注意,雖然必須提供所有符號,但第 7.1.4.1 節會更詳細說明各個對應函式應在何時完全實作。 - [C-0-12] 必須透過
libvulkan.so
程式庫,為核心 Vulkan 1.0 函式符號和VK_KHR_surface
、VK_KHR_android_surface
、VK_KHR_swapchain
、VK_KHR_maintenance1
和VK_KHR_get_physical_device_properties2
擴充功能匯出函式符號。請注意,雖然必須提供所有符號,但第 7.1.4.2 節會更詳細說明各個對應函式應在何時完全實作。 - 應使用上游 Android 開放原始碼專案提供的原始碼和標頭檔案進行建構
請注意,日後推出的 Android 版本可能會支援更多 ABI。
3.3.2. 32 位元 ARM 原生程式碼相容性
如果裝置實作項目回報支援 armeabi
ABI,則會:
- [C-3-1] 也必須支援
armeabi-v7a
並回報支援情形,因為armeabi
僅用於與舊版應用程式的回溯相容性。
如果裝置實作項目回報支援 armeabi-v7a
ABI,則使用此 ABI 的應用程式會:
-
[C-2-1] 必須在
/proc/cpuinfo
中加入下列行,且不應變更相同裝置上的值,即使其他 ABI 讀取這些值也一樣。-
Features:
,接著是裝置支援的任何選用 ARMv7 CPU 功能清單。 -
CPU architecture:
,後面接著整數,說明裝置支援的最高 ARM 架構 (例如 如為 ARMv8 裝置,則為「8」)。
-
-
[C-2-2] 即使 ABI 是透過原生 CPU 支援或軟體模擬方式在 ARMv8 架構上實作,也必須隨時提供下列運算:
- SWP 和 SWPB 指令。
- SETEND 指令。
- CP15ISB、CP15DSB 和 CP15DMB 的阻隔操作。
-
[C-2-3] 必須支援 Advanced SIMD (又稱為 NEON) 擴充功能。
3.4. 網頁相容性
3.4.1. WebView 相容性
如果裝置實作項目提供完整的 android.webkit.Webview
API 實作項目,則會:
- [C-1-1] 必須回報
android.software.webview
。 - [C-1-2] 如要實作
android.webkit.WebView
API,請務必使用 Android 11 分支上源自上游 Android 開放原始碼計畫的 Chromium 專案版本。 -
[C-1-3] WebView 回報的使用者代理程式字串必須採用以下格式:
Mozilla/5.0 (Linux; Android $(VERSION); [$(MODEL)] [Build/$(BUILD)]; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 $(CHROMIUM_VER) Mobile Safari/537.36
- $(VERSION) 字串的值必須與 android.os.Build.VERSION.RELEASE 的值相同。
- $(MODEL) 字串可為空白,但如果不為空白,則必須與 android.os.Build.MODEL 的值相同。
- 「Build/$(BUILD)」可省略,但如果使用,$(BUILD) 字串必須與 android.os.Build.ID 的值相同。
- $(CHROMIUM_VER) 字串的值必須是上游 Android 開放原始碼專案中的 Chromium 版本。
- 裝置實作可能會在使用者代理程式字串中省略「Mobile」。
-
WebView 元件應盡可能支援 HTML5 功能,如果支援該功能,則應符合 HTML5 規格。
-
[C-1-3] 必須在與例項化 WebView 的應用程式不同的程序中,轉譯提供的內容或遠端網址內容。具體來說,獨立的轉譯器程序必須持有較低的權限、以獨立的使用者 ID 執行、無法存取應用程式的資料目錄,也無法直接存取網路,且只能透過 Binder 存取必要的系統服務。AOSP 實作的 WebView 符合這項規定。
請注意,如果裝置實作項目為 32 位元,或宣告功能旗標 android.hardware.ram.low
,則不受 C-1-3 的規範。
3.4.2. 瀏覽器相容性
如果裝置實作包含用於一般網頁瀏覽的獨立瀏覽器應用程式,則應符合下列條件:
- [C-1-1] 必須支援下列與 HTML5 相關的 API:
- [C-1-2] 必須支援 HTML5/W3C webstorage API,並應支援 HTML5/W3C IndexedDB API。請注意,由於網路開發標準機構正從 webstorage 轉向 IndexedDB,因此 IndexedDB 預計將成為日後 Android 版本的必要元件。
- 可在獨立的瀏覽器應用程式中提供自訂使用者代理程式字串。
- 應盡可能在獨立瀏覽器應用程式中實作 HTML5 支援功能 (無論是基於上游 WebKit 瀏覽器應用程式,還是第三方替代方案)。
不過,如果裝置實作項目不包含獨立的瀏覽器應用程式,則會發生以下情況:
- [C-2-1] 必須繼續支援 第 3.2.3.1 節所述的公開意圖模式。
3.5. API 行為相容性
裝置實作方式:
- [C-0-9] 必須確保所有已安裝的應用程式都適用 API 行為相容性,除非這些應用程式受到 第 3.5.1 節所述的限制。
- [C-0-10] 請勿實作許可清單方法,因為這類方法只會確保裝置實作者選取的應用程式與 API 行為相容。
每種 API 類型 (受管理、軟體、原生和網頁) 的行為都必須與上游 Android 開放原始碼專案的偏好實作方式一致。以下是部分相容性方面的注意事項:
- [C-0-1] 裝置不得變更標準意圖的行為或語意。
- [C-0-2] 裝置不得變更特定類型的系統元件 (例如 Service、Activity、ContentProvider 等) 的生命週期或生命週期語意。
- [C-0-3] 裝置絕對不得變更標準權限的語意。
- 裝置不得變更對背景應用程式強制執行的限制。具體來說,對於背景應用程式:
- [C-0-4] 必須停止執行應用程式註冊的回呼,以便接收
GnssMeasurement
和GnssNavigationMessage
的輸出內容。 - [C-0-5] 您必須透過
LocationManager
API 類別或WifiManager.startScan()
方法,限制應用程式收到更新的頻率。 - [C-0-6] 如果應用程式指定 API 級別 25 以上版本,則不得允許註冊廣播接收器,以便在應用程式資訊清單中接收標準 Android 意圖的隱含廣播訊息,除非廣播意圖需要
"signature"
或"signatureOrSystem"
protectionLevel
權限,或是位於豁免清單中。 - [C-0-7] 如果應用程式指定的目標 API 級別為 25 以上,則必須停止應用程式的背景服務,就像應用程式呼叫服務的
stopSelf()
方法一樣,除非應用程式已加入暫時許可清單,用於處理使用者可見的任務。 - [C-0-8] 如果應用程式指定的目標為 API 級別 25 以上版本,則必須釋出應用程式持有的喚醒鎖。
- [C-0-4] 必須停止執行應用程式註冊的回呼,以便接收
- [C-0-9] 裝置必須將下列安全性提供者,做為
Security.getProviders()
方法的前七個陣列值,以指定順序和名稱 (由Provider.getName()
傳回) 和類別傳回,除非應用程式已透過insertProviderAt()
或removeProvider()
修改清單。裝置可能會在下方指定的供應商清單後傳回其他供應商。-
AndroidNSSP -
android.security.net.config.NetworkSecurityConfigProvider
-
AndroidOpenSSL -
com.android.org.conscrypt.OpenSSLProvider
-
CertPathProvider -
sun.security.provider.CertPathProvider
-
AndroidKeyStoreBCWorkaround -
android.security.keystore.AndroidKeyStoreBCWorkaroundProvider
-
BC -
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
-
HarmonyJSSE -
com.android.org.conscrypt.JSSEProvider
-
AndroidKeyStore -
android.security.keystore.AndroidKeyStoreProvider
-
AndroidNSSP -
上方清單僅列舉部分內容,並未包含所有可能情況。Compatibility Test Suite (CTS) 會測試平台的大部分行為相容性,但並非全部。實作者有責任確保與 Android 開放原始碼專案的行為相容性。因此,裝置實作者應盡可能使用 Android 開放原始碼計畫提供的原始碼,而非重新實作系統的重要部分。
3.5.1. 應用程式限制
如果裝置實作導入專屬機制來限制應用程式,且該機制比「很少使用的應用程式待命值區」更嚴格,則會發生以下情況:
- [C-1-1] 必須提供使用者可用途,讓使用者查看受限制的應用程式清單。
- [C-1-2] 必須提供使用者操作元素,讓他們開啟 / 關閉各個應用程式的限制。
- [C-1-3] 如未發現系統健康行為不佳的證據,則不得自動套用限制,但在偵測到系統健康行為不佳 (例如 Wakelock 卡住、服務執行時間過長等) 時,則可對應用程式套用限制。裝置實作者可以決定標準,但必須與應用程式對系統健康狀態的影響有關。其他與系統健康無關的條件 (例如應用程式在市場上的受歡迎程度不足) 絕對不可用作判斷標準。
- [C-1-4] 使用者手動關閉應用程式限制時,應用程式不得自動套用限制,但可建議使用者套用限制。
- [C-1-5] 如果應用程式限制會自動套用至應用程式,則必須通知使用者。這類資訊必須在限制生效後的 24 小時內提供。
- [C-1-6] 受限制的應用程式呼叫此 API 時,必須為
ActivityManager.isBackgroundRestricted()
傳回true
。 - [C-1-7] 不得限制使用者明確使用的前景應用程式。
- [C-1-8] 當使用者明確開始使用曾經受限的應用程式時,應用程式會成為前景應用程式,且必須暫停對該應用程式的限制。
3.6. API 命名空間
Android 遵循 Java 程式設計語言定義的套件和類別命名空間慣例。為確保與第三方應用程式的相容性,裝置實作者不得對下列套件命名空間進行任何禁止的修改 (請見下文):
-
java.*
-
javax.*
-
sun.*
-
android.*
-
androidx.*
-
com.android.*
也就是:
- [C-0-1] 請勿透過變更任何方法或類別簽章,或移除類別或類別欄位,修改 Android 平台上公開的 API。
- [C-0-2] 請勿在上述命名空間的 API 中,新增任何公開的元素 (例如類別或介面、現有類別或介面的欄位或方法) 或測試或系統 API。「公開暴露的元素」是指任何未以「@hide」標記裝飾的建構,如同上游 Android 原始碼中所使用的標記。
裝置實作者可以修改 API 的基礎實作項目,但此類修改:
- [C-0-3] 不得影響任何公開 API 的行為和 Java 語言簽章。
- [C-0-4] 不得向開發人員宣傳或以其他方式公開。
不過,裝置實作者可以在標準 Android 命名空間之外新增自訂 API,但自訂 API 必須符合下列條件:
- [C-0-5] 不得位於其他機構擁有或參照的命名空間。舉例來說,裝置實作人員不得將 API 新增至
com.google.*
或類似的命名空間,只有 Google 可以這麼做。同樣地,Google 不得將 API 新增至其他公司的命名空間。 - [C-0-6] 必須封裝在 Android 共用程式庫中,這樣只有明確使用這些 API 的應用程式 (透過 <uses-library> 機制) 才會受到這些 API 記憶體用量增加的影響。
如果裝置實作者提出改善上述任一套件命名空間的建議 (例如在現有 API 中新增實用的新功能,或新增新的 API),則實作者應前往 source.android.com,並根據該網站上的資訊開始提供變更和程式碼。
請注意,上述限制與 Java 程式設計語言中 API 命名標準慣例相符。本節只是為了強化這些慣例,並透過納入此相容性定義來使其具有約束力。
3.7. 執行階段相容性
裝置實作方式:
-
[C-0-1] 必須支援完整的 Dalvik Executable (DEX) 格式和 Dalvik 位元碼規格和語義。
-
[C-0-2] 必須設定 Dalvik 執行階段,以便根據上游 Android 平台和下表所述,分配記憶體。(如要瞭解螢幕大小和螢幕密度的定義,請參閱 7.1.1 節)。
-
應使用 Android 執行階段 (ART)、Dalvik 執行檔格式的參考上游實作項目,以及參考實作項目的套件管理系統。
-
應在各種執行模式和目標架構下執行模糊測試,以確保執行階段的穩定性。請參閱 Android 開放原始碼計畫網站中的 JFuzz 和 DexFuzz。
請注意,下方指定的記憶體值視為最低值,且裝置實作可能會為每個應用程式分配更多記憶體。
螢幕版面配置 | 螢幕密度 | 應用程式記憶體下限 |
---|---|---|
Android 手錶 | 120 dpi (ldpi) | 32MB |
140 dpi (140dpi) | ||
160 dpi (mdpi) | ||
180 dpi (180dpi) | ||
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | 36MB | |
240 dpi (高解析度) | ||
280 dpi (280dpi) | ||
320 dpi (xhdpi) | 48MB | |
360 dpi (360dpi) | ||
400 dpi (400dpi) | 56MB | |
420 dpi (420dpi) | 64MB | |
480 dpi (xxhdpi) | 88MB | |
560 dpi (560dpi) | 112MB | |
640 dpi (xxxhdpi) | 154MB | |
小/正常 | 120 dpi (ldpi) | 32MB |
140 dpi (140dpi) | ||
160 dpi (mdpi) | ||
180 dpi (180dpi) | 48MB | |
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | ||
240 dpi (高解析度) | ||
280 dpi (280dpi) | ||
320 dpi (xhdpi) | 80MB | |
360 dpi (360dpi) | ||
400 dpi (400dpi) | 96MB | |
420 dpi (420dpi) | 112MB | |
480 dpi (xxhdpi) | 128MB | |
560 dpi (560dpi) | 192MB | |
640 dpi (xxxhdpi) | 256MB | |
大 | 120 dpi (ldpi) | 32MB |
140 dpi (140dpi) | 48MB | |
160 dpi (mdpi) | ||
180 dpi (180dpi) | 80MB | |
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | ||
240 dpi (高解析度) | ||
280 dpi (280dpi) | 96MB | |
320 dpi (xhdpi) | 128MB | |
360 dpi (360dpi) | 160MB | |
400 dpi (400dpi) | 192MB | |
420 dpi (420dpi) | 228MB | |
480 dpi (xxhdpi) | 256MB | |
560 dpi (560dpi) | 384MB | |
640 dpi (xxxhdpi) | 512MB | |
xlarge | 120 dpi (ldpi) | 48MB |
140 dpi (140dpi) | 80MB | |
160 dpi (mdpi) | ||
180 dpi (180dpi) | 96MB | |
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | ||
240 dpi (高解析度) | ||
280 dpi (280dpi) | 144MB | |
320 dpi (xhdpi) | 192MB | |
360 dpi (360dpi) | 240MB | |
400 dpi (400dpi) | 288MB | |
420 dpi (420dpi) | 336MB | |
480 dpi (xxhdpi) | 384MB | |
560 dpi (560dpi) | 576MB | |
640 dpi (xxxhdpi) | 768MB |
3.8. 使用者介面相容性
3.8.1. 啟動器 (主畫面)
Android 包含啟動器應用程式 (主畫面),並支援第三方應用程式取代裝置啟動器 (主畫面)。
如果裝置實作允許第三方應用程式取代裝置主畫面,則這些應用程式必須符合下列條件:
- [C-1-1] 必須宣告平台功能
android.software.home_screen
。 - [C-1-2] 當第三方應用程式使用
<adaptive-icon>
標記提供圖示,且呼叫用於擷取圖示的PackageManager
方法時,必須傳回AdaptiveIconDrawable
物件。
如果裝置實作內容包含支援應用程式內捷徑固定功能的預設啟動器,則必須符合下列條件:
- [C-2-1] 必須為
ShortcutManager.isRequestPinShortcutSupported()
回報true
。 - [C-2-2] 在透過
ShortcutManager.requestPinShortcut()
API 方法新增應用程式要求的捷徑前,必須提供使用者操作提示,要求使用者確認。 - [C-2-3] 必須支援固定捷徑,以及應用程式捷徑頁面所述的動態和靜態捷徑。
相反地,如果裝置實作不支援應用程式內的捷徑固定功能,則會發生以下情況:
- [C-3-1] 必須為
ShortcutManager.isRequestPinShortcutSupported()
回報false
。
如果裝置實作項目實作預設啟動器,可透過 ShortcutManager API 快速存取第三方應用程式提供的其他捷徑,則:
- [C-4-1] 必須支援所有已記錄的捷徑功能 (例如靜態和動態捷徑、固定捷徑),並完全實作
ShortcutManager
API 類別的 API。
如果裝置實作包含預設啟動器應用程式,可顯示應用程式圖示的徽章,則這些徽章必須符合下列規定:
- [C-5-1] 必須遵守
NotificationChannel.setShowBadge()
API 方法。換句話說,如果值設為true
,就會顯示與應用程式圖示相關的視覺提示,如果所有應用程式通知管道的值都設為false
,則不會顯示任何應用程式圖示徽章方案。 - 當第三方應用程式透過專屬 API 表示支援專屬徽章方案時,可以使用專屬徽章方案覆寫應用程式圖示徽章,但應使用 SDK 中所述的通知徽章 API 提供的資源和值,例如
Notification.Builder.setNumber()
和Notification.Builder.setBadgeIconType()
API。
3.8.2. 小工具
Android 透過定義元件類型和對應的 API 和生命週期,支援第三方應用程式小工具,讓應用程式可向使用者提供 「AppWidget」。
如果裝置實作支援第三方應用程式小工具,則必須符合下列條件:
- [C-1-1] 必須宣告支援平台功能
android.software.app_widgets
。 - [C-1-2] 必須內建 AppWidget 支援功能,並提供使用者介面操作元素,讓使用者直接在啟動器中新增、設定、查看及移除 AppWidget。
- [C-1-3] 必須能夠算繪 4 x 4 標準格狀大小的小工具。詳情請參閱 Android SDK 說明文件中的「App Widget 設計指南」。
- 可支援在螢幕鎖定畫面上顯示應用程式小工具。
如果裝置實作項目支援第三方應用程式小工具和應用程式內捷徑固定功能,則必須符合下列條件:
- [C-2-1] 必須為
AppWidgetManager.html.isRequestPinAppWidgetSupported()
回報true
。 - [C-2-2] 在透過
AppWidgetManager.requestPinAppWidget()
API 方法新增應用程式要求的捷徑前,必須提供使用者操作提示,詢問使用者是否同意。
3.8.3. 通知
Android 包含 Notification
和 NotificationManager
API,可讓第三方應用程式開發人員使用裝置的硬體元件 (例如聲音、震動和燈光) 和軟體功能 (例如通知陰影、系統列),通知使用者重要事件並吸引使用者注意。
3.8.3.1. 通知顯示方式
如果裝置實作允許第三方應用程式通知使用者重要事件,則必須符合下列條件:
- [C-1-1] 必須支援使用硬體功能的通知,如 SDK 說明文件所述,並盡可能支援裝置實作硬體。舉例來說,如果裝置實作項目包含震動器,則必須正確實作震動 API。如果裝置實作項目缺少硬體,則必須將對應的 API 實作為無作業。第 7 節會進一步說明這項行為。
- [C-1-2] 必須正確轉譯 API 或狀態/系統列圖示樣式指南中提供的所有資源 (圖示、動畫檔案等),雖然這些資源可能會提供與參考 Android 開放原始碼實作不同的通知使用者體驗。
- [C-1-3] 您必須正確遵循並實作 API 的行為描述,才能更新、移除及分組通知。
- [C-1-4] 必須提供 SDK 中說明的 NotificationChannel API 完整行為。
- [C-1-5] 必須提供使用者操作元素,讓使用者能夠依照每個管道和應用程式套件層級,封鎖及修改特定第三方應用程式的通知。
- [C-1-6] 也必須提供使用者操作提示,以便顯示已刪除的通知管道。
- [C-1-7] 必須在通知文字旁邊,透過 Notification.MessagingStyle 提供的所有資源 (圖片、貼圖、圖示等) 都必須正確顯示,且不需額外使用者互動。舉例來說,在透過 setGroupConversation 設定的群組對話中,必須顯示所有資源,包括透過 android.app.Person 提供的圖示。
- [C-SR] 強烈建議您在使用者多次關閉某個第三方應用程式通知後,自動顯示使用者可用項,以便針對每個管道和應用程式套件層級封鎖該通知。
- 應支援複合式通知。
- 應以抬頭通知的形式顯示優先順序較高的通知。
- 應提供使用者延後通知的操作提示。
- 僅可管理第三方應用程式通知使用者重要事件的可見度和時間,以減輕駕駛人分心等安全問題。
Android 11 推出對話通知支援功能,這類通知會使用 MessagingStyle,並提供已發布的 People 捷徑 ID。
裝置實作方式:
- [C-SR] 強烈建議您將
conversation notifications
歸類並顯示在非對話通知之前 (持續性前景服務通知和importance:high
通知除外)。
如果裝置實作支援 conversation notifications
,且應用程式提供 bubbles
所需的資料,則:
- [C-SR] 強烈建議以對話框形式顯示這項對話。AOSP 實作項目會使用預設的系統使用者介面、設定和啟動器,符合這些規定。
如果裝置實作項目支援豐富通知,則會:
- [C-2-1] 必須使用透過
Notification.Style
API 類別及其子類別提供的確切資源,用於呈現的資源元素。 - 應顯示
Notification.Style
API 類別及其子類別中定義的每個資源元素 (例如圖示、標題和摘要文字)。
如果裝置實作方式支援抬頭通知,則:
- [C-3-1] 在顯示抬頭通知時,必須使用
Notification.Builder
API 類別中所述的抬頭通知檢視畫面和資源。 - [C-3-2] 必須在通知內容中,顯示透過
Notification.Builder.addAction()
提供的動作,且無須額外使用者互動,如SDK 所述。
3.8.3.2. 通知接聽器服務
Android 提供 NotificationListenerService
API,可讓應用程式 (在使用者明確啟用後) 收到所有通知的副本,無論通知是否已發布或更新。
裝置實作方式:
- [C-0-1] 必須正確且迅速地將通知更新至所有已安裝且使用者啟用的事件監聽器服務,包括附加至 Notification 物件的所有中繼資料。
- [C-0-2] 必須遵循
snoozeNotification()
API 呼叫,並在 API 呼叫中設定的延遲時間過後關閉通知,並進行回呼。
如果裝置實作有延後通知的使用者操作元素,則應符合下列條件:
- [C-1-1] 必須透過
NotificationListenerService.getSnoozedNotifications()
等標準 API 正確反映延後通知狀態。 - [C-1-2] 必須提供此使用者操作選項,讓使用者暫緩安裝的各個第三方應用程式通知,除非這些通知來自持續性/前景服務。
3.8.3.3. DND (請勿打擾)
如果裝置實作支援 DND 功能,則會:
- [C-1-1] 必須:如果裝置實作已提供一種方式,讓使用者授予或拒絕第三方應用程式存取 DND 政策設定,請一併顯示應用程式建立的自動 DND 規則,以及使用者建立的預先定義規則。
- [C-1-3] 必須遵循
NotificationManager.Policy
傳遞的suppressedVisualEffects
值,如果應用程式已設定 SUPPRESSED_EFFECT_SCREEN_OFF 或 SUPPRESSED_EFFECT_SCREEN_ON 旗標,則應向使用者指出視覺效果已在 DND 設定選單中抑制。
3.8.4. 搜尋
Android 提供 API,可讓開發人員在應用程式中整合搜尋功能,並將應用程式資料公開至全球系統搜尋功能。一般來說,這項功能包含單一系統層級的使用者介面,可讓使用者輸入查詢,並在使用者輸入時顯示建議內容和結果。Android API 可讓開發人員重複使用這個介面,在自己的應用程式中提供搜尋功能,並將結果提供給常見的全球搜尋使用者介面。
- Android 裝置實作項目應包含全域搜尋功能,也就是單一共用系統層級搜尋使用者介面,可根據使用者輸入內容提供即時建議。
如果裝置實作導入全域搜尋介面,則會:
- [C-1-1] 必須實作 API,讓第三方應用程式在全球搜尋模式下執行時,能夠在搜尋框中新增建議。
如果沒有安裝使用全域搜尋的第三方應用程式:
- 預設行為應為顯示網路搜尋引擎結果和建議。
Android 也包含 Assist API,可讓應用程式選擇要與裝置上的 Google 助理共用多少目前情境資訊。
如果裝置實作支援 Assist 動作,則會:
- [C-2-1] 必須明確向使用者說明何時分享了背景資訊,方法如下:
- 每當小幫手應用程式存取情境時,會在螢幕邊緣顯示白色燈光,且亮度和持續時間符合或超過 Android 開放原始碼專案實作的亮度和持續時間。
- 針對預先安裝的輔助應用程式,提供使用者可用性,讓使用者只需兩次導覽即可前往預設語音輸入和 Google 助理應用程式設定選單,且只有在使用者透過熱字詞或輔助導覽鍵輸入內容時,才會分享內容。
- [C-2-2] 如第 7.2.3 節所述,啟動輔助應用程式的指定互動動作必須啟動使用者選取的輔助應用程式,也就是實作
VoiceInteractionService
的應用程式,或處理ACTION_ASSIST
意圖的活動。
3.8.5. 快訊和 Toast
應用程式可使用 Toast
API 向使用者顯示短暫的非模態字串,該字串會在短時間後消失,並使用 TYPE_APPLICATION_OVERLAY
視窗類型 API 將警示視窗顯示為其他應用程式的疊加層。
如果裝置實作包含螢幕或影片輸出,則必須符合下列條件:
-
[C-1-1] 您必須提供使用者操作提示,讓他們能夠封鎖應用程式使用
TYPE_APPLICATION_OVERLAY
顯示的警告視窗。AOSP 實作項目會在通知面板中提供控制項,以符合這項規定。 -
[C-1-2] 必須遵循 Toast API 規定,並以某種醒目的方式,向使用者顯示應用程式傳送的 Toast。
3.8.6。主題
Android 提供「主題」機制,讓應用程式在整個活動或應用程式中套用樣式。
Android 包含「Holo」和「Material」主題系列,提供一組定義樣式,供應用程式開發人員使用,以便符合 Android SDK 定義的 Holo 主題外觀。
如果裝置實作包含螢幕或影片輸出,則必須符合下列條件:
- [C-1-1] 不得變更應用程式公開的任何 Holo 主題屬性。
- [C-1-2] 必須支援「Material」主題系列,且不得變更任何 Material 主題屬性或向應用程式公開的相關資產。
- [C-1-3] 必須針對 Roboto 支援的語言,將「無襯線」字型系列設為 Roboto 2.x 版,或是提供使用者操作元素,以便針對 Roboto 支援的語言,將「無襯線」字型系列使用的字型變更為 Roboto 2.x 版。
Android 也提供「裝置預設」主題系列,提供一組定義的樣式,供應用程式開發人員使用,以便與裝置實作者定義的裝置主題外觀和感受相符。
- 裝置實作可能會修改向應用程式公開的裝置預設主題屬性。
Android 支援採用半透明系統列的變化主題,讓應用程式開發人員可在狀態列和導覽列後方填入應用程式內容。為了在這個設定中提供一致的開發人員體驗,請務必在不同裝置的實作項目中維持狀態列圖示樣式。
如果裝置實作項目包含系統狀態列,則會執行以下操作:
- [C-2-1] 系統狀態圖示 (例如訊號強度和電池電量) 和系統發出的通知,必須使用白色,除非圖示表示有問題的狀態,或應用程式使用 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 標記要求淺色狀態列。
- [C-2-2] 應用程式要求淺色狀態列時,Android 裝置實作項目必須將系統狀態圖示的顏色變更為黑色 (詳情請參閱 R.style)。
3.8.7. 動態桌布
Android 定義了元件類型和對應的 API 和生命週期,讓應用程式可向使用者提供一或多個「動態桌布」。動態桌布是動畫、圖案或類似圖片,具有有限的輸入功能,可做為桌布顯示在其他應用程式後方。
如果硬體可以以合理的幀率執行所有動態桌布,且不會對其他應用程式造成不良影響,就表示硬體可穩定執行動態桌布。如果硬體限制導致桌布和/或應用程式發生異常、耗用過多 CPU 或電池電力,或是以不合理的低幀率運作,則硬體就無法執行動態桌布。舉例來說,部分動態桌布可能會使用 OpenGL 2.0 或 3.x 背景處理內容。在未支援多個 OpenGL 情境的硬體上,即時桌布無法穩定執行,因為即時桌布使用 OpenGL 情境時,可能會與其他也使用 OpenGL 情境的應用程式發生衝突。
- 裝置實作項目如能如上所述,可靠地執行動態桌布,則應實作動態桌布。
如果裝置實作動態桌布,則必須:
- [C-1-1] 必須回報平台功能旗標 android.software.live_wallpaper。
3.8.8。活動切換
上游 Android 原始碼包含總覽畫面,這是系統層級使用者介面,可用於切換工作,並在使用者上次離開應用程式時,使用應用程式圖形狀態的縮圖圖片,顯示最近存取的活動和工作。
裝置實作 (包括「最近」功能導覽鍵,詳見第 7.2.3 節) 可能會變更介面。
如果裝置實作 (包括「最近」功能導覽鍵,詳見第 7.2.3 節) 變更介面,則應符合下列條件:
- [C-1-1] 必須支援至少 7 個顯示活動。
- 一次至少顯示 4 項活動的標題。
- [C-1-2] 必須實作螢幕固定行為,並為使用者提供可切換這項功能的設定選單。
- 應在「最近」中顯示醒目顯示顏色、圖示和畫面標題。
- 應顯示關閉操作元素 (「x」),但可在使用者與畫面互動前延遲顯示。
- 應實作捷徑,方便切換至先前的活動。
- 輕觸兩次「最近」功能鍵時,應會在最近兩個使用的應用程式之間觸發快速切換動作。
- 在長按「最近使用」按鈕時,應觸發分割畫面多視窗模式 (如果支援的話)。
- 可將相關聯的近期內容顯示為一組一起移動的內容。
- [SR] 強烈建議您在總覽畫面中使用上游 Android 使用者介面 (或類似的縮圖介面)。
3.8.9。輸入管理
Android 支援輸入管理功能,以及第三方輸入法編輯器。
如果裝置實作允許使用者在裝置上使用第三方輸入法,則使用者必須:
- [C-1-1] 必須宣告平台功能 android.software.input_methods,並支援 Android SDK 說明文件中定義的 IME API。
3.8.10。透過螢幕鎖定畫面控制媒體
從 Android 5.0 開始,我們已淘汰 Remote Control Client API,改用媒體通知範本,讓媒體應用程式可與螢幕鎖定畫面上顯示的播放控制項整合。
3.8.11. 螢幕保護程式 (原稱為「夢幻背景」)
如要設定螢幕保護程式,請參閱第 3.2.3.5 節的設定意圖。
3.8.12. 位置
如果裝置實作包含可提供位置座標的硬體感應器 (例如 GPS),則這些
3.8.13. Unicode 和字型
Android 支援 Unicode 10.0 中定義的表情符號。
如果裝置實作包含螢幕或影片輸出,則必須符合下列條件:
- [C-1-1] 必須能夠以彩色字形顯示這些表情符號字元。
- [C-1-2] 必須支援以下項目:
- 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 貨幣符號區塊中的所有字形。
- 應支援 Unicode 技術報告 #51 中指定的膚色和多元家庭表情符號。
如果裝置實作包含 IME,則會:
- 應為使用者提供這些表情符號的輸入方式。
Android 支援轉譯緬甸字型的功能。緬甸有幾種不符合 Unicode 規範的字型,通常稱為「Zawgyi」,用於顯示緬甸語言。
如果裝置實作內容支援緬甸文,則必須符合下列條件:
* [C-2-1] MUST render text with Unicode compliant font as default;
non-Unicode compliant font MUST NOT be set as default font unless the user
chooses it in the language picker.
* [C-2-2] MUST support a Unicode font and a non-Unicode compliant font if a
non-Unicode compliant font is supported on the device. Non-Unicode
compliant font MUST NOT remove or overwrite the Unicode font.
* [C-2-3] MUST render text with non-Unicode compliant font ONLY IF a
language code with [script code Qaag](
http://unicode.org/reports/tr35/#unicode_script_subtag_validity) is
specified (e.g. my-Qaag). No other ISO language or region codes (whether
assigned, unassigned, or reserved) can be used to refer to non-Unicode
compliant font for Myanmar. App developers and web page authors can
specify my-Qaag as the designated language code as they would for any
other language.
3.8.14。多視窗模式
如果裝置實作功能可同時顯示多項活動,則必須符合下列條件:
- [C-1-1] 必須根據 Android SDK 多視窗模式支援說明文件中所述的應用程式行為和 API 實作這類多視窗模式,並符合下列規定:
- [C-1-2] 必須遵循 這個 SDK 所述的做法,在
AndroidManifest.xml
檔案中遵循應用程式設定的android:resizeableActivity
。 - [C-1-3] 如果螢幕高度和寬度均小於 440 dp,則不得提供分割畫面或任意形式模式。
- [C-1-4] 在多視窗模式中,活動的大小不得縮小至 220dp 以下 (子母畫面模式除外)。
- 螢幕尺寸為
xlarge
的裝置實作項目應支援任意形式模式。
如果裝置實作支援多視窗模式和分割畫面模式,則會:
- [C-2-1] 必須預先載入可調整大小的啟動器做為預設值。
- [C-2-2] 如果啟動器應用程式是焦點視窗,則必須裁剪分割畫面多視窗的已固定活動,但應顯示部分內容。
- [C-2-3] 必須遵守第三方啟動器應用程式宣告的
AndroidManifestLayout_minWidth
和AndroidManifestLayout_minHeight
值,且不得在顯示已固定活動的部分內容時覆寫這些值。
如果裝置實作支援多視窗模式和子母畫面多視窗模式,則會:
- [C-3-1] 應用程式在以下情況下,必須以子母畫面多視窗模式啟動活動:* 指定 API 級別 26 以上版本並宣告
android:supportsPictureInPicture
* 指定 API 級別 25 以下版本並宣告android:resizeableActivity
和android:supportsPictureInPicture
。 - [C-3-2] 必須透過
setActions()
API,將目前 PIP 活動指定的動作公開至 SystemUI。 - [C-3-3] 必須支援 PIP 活動透過
setAspectRatio()
API 指定的 1:2.39 以上和 2.39:1 以下的顯示比例。 - [C-3-4] 必須使用
KeyEvent.KEYCODE_WINDOW
控制 PIP 視窗;如果未實作 PIP 模式,則前景活動必須可使用該鍵。 - [C-3-5] 必須提供使用者提示,以便阻止應用程式以 PIP 模式顯示;AOSP 實作項目在通知陰影中提供控制項,符合這項規定。
-
[C-3-6] 當應用程式未為
AndroidManifestLayout_minWidth
和AndroidManifestLayout_minHeight
宣告任何值時,必須為 PIP 視窗分配下列最小寬度和高度:- 如果裝置的 Configuration.uiMode 設定為
UI_MODE_TYPE_TELEVISION
以外的值,則必須分配最小寬度和高度為 108 dp。 - 如果裝置的 Configuration.uiMode 設為
UI_MODE_TYPE_TELEVISION
,則必須分配最小寬度 240 dp 和最小高度 135 dp。
- 如果裝置的 Configuration.uiMode 設定為
3.8.15。螢幕凹口
Android 支援顯示螢幕裁剪,詳情請參閱 SDK 文件。DisplayCutout
API 會定義螢幕邊緣的區域,該區域可能因螢幕缺口或邊緣的曲面螢幕而無法供應用程式使用。
如果裝置實作包含螢幕缺口,則必須符合下列條件:
- [C-1-5] 如果裝置的顯示比例為 1.0 (1:1),則不得有缺口。
- [C-1-2] 每個邊緣不得有超過一個裁剪區。
- [C-1-3] 必須遵守應用程式透過
WindowManager.LayoutParams
API 設定的顯示區域切除標記,如 SDK 所述。 - [C-1-4] 必須針對
DisplayCutout
API 中定義的所有截取指標回報正確值。
3.8.16. 裝置控制項
Android 提供 ControlsProviderService
和 Control
API,讓第三方應用程式發布裝置控制項,為使用者提供快速狀態和操作。
如要瞭解裝置專屬需求,請參閱第 2_2_3 節。
3.9. 裝置管理
Android 包含多項功能,可讓具備安全意識的應用程式透過 Android Device Administration API,在系統層級執行裝置管理功能,例如強制執行密碼政策或執行遠端資料清除。
如果裝置實作項目實作 Android SDK 說明文件中定義的所有裝置管理政策,則會:
- [C-1-1] 必須宣告
android.software.device_admin
。 - [C-1-2] 必須支援裝置擁有者佈建作業,如第 3.9.1 節和第 3.9.1.1 節所述。
3.9.1 裝置佈建
3.9.1.1 裝置擁有者佈建
如果裝置實作宣告 android.software.device_admin
,則會執行以下操作:
- [C-1-1] 必須支援將裝置政策用戶端 (DPC) 註冊為裝置擁有者應用程式,如下所述:
- 當裝置實作尚未有使用者資料時,會執行以下操作:
- [C-1-3] 必須為
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
回報true
。 - [C-1-4] 必須將 DPC 應用程式註冊為裝置擁有者應用程式,以回應意圖動作
android.app.action.PROVISION_MANAGED_DEVICE
。 - [C-1-5] 如果裝置透過功能旗標
android.hardware.nfc
宣告支援近距離無線通訊 (NFC),且收到的 NFC 訊息含有 MIME 類型MIME_TYPE_PROVISIONING_NFC
的記錄,則必須將 DPC 應用程式註冊為裝置擁有者應用程式。
- [C-1-3] 必須為
- 當裝置實作有使用者資料時,會執行以下操作:
- [C-1-6] 必須為
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
回報false
。 - [C-1-7] 不得再將任何 DPC 應用程式註冊為裝置擁有者應用程式。
- [C-1-6] 必須為
- 當裝置實作尚未有使用者資料時,會執行以下操作:
- [C-1-2] 在佈建程序前或期間,應用程式必須要求使用者採取明確的動作,才能同意將應用程式設為裝置擁有者。同意聲明可以透過使用者操作或某些程式輔助方式取得,但在啟動裝置擁有者佈建程序前,必須顯示適當的揭露通知 (如 AOSP 所述)。此外,企業用於裝置擁有者佈建的程式輔助裝置擁有者同意聲明機制,不得干擾非企業用途的開箱體驗。
- [C-1-3] 請勿硬式編碼同意聲明,或禁止使用其他裝置擁有者應用程式。
如果裝置實作宣告 android.software.device_admin
,但也包含專屬的裝置擁有者管理解決方案,並提供機制,將在解決方案中設定為「裝置擁有者等同」的應用程式,提升為標準 Android DevicePolicyManager API 所認定的標準「裝置擁有者」,則:
- [C-2-1] 必須設有程序,以便驗證所宣傳的特定應用程式屬於合法的企業裝置管理解決方案,且已在專屬解決方案中進行設定,擁有與「裝置擁有者」同等的權限。
- [C-2-2] 必須顯示與
android.app.action.PROVISION_MANAGED_DEVICE
啟動的流程相同的 AOSP 裝置擁有者同意聲明揭露事項,才能將 DPC 應用程式註冊為「裝置擁有者」。 - 在註冊 DPC 應用程式為「裝置擁有者」之前,裝置上可能會有使用者資料。
3.9.1.2 受管理設定檔佈建作業
如果裝置實作宣告 android.software.managed_users
,則會執行以下操作:
-
[C-1-1] 必須實作API,讓裝置政策控制器 (DPC) 應用程式成為新受管理設定檔的擁有者。
-
[C-1-2] 受管理的設定檔佈建程序 (由 android.app.action.PROVISION_MANAGED_PROFILE 啟動的流程) 使用者體驗必須與 AOSP 實作方式一致。
-
[C-1-3] 必須在「設定」中提供下列使用者操作元素,向使用者指出裝置政策控制器 (DPC) 已停用特定系統功能:
- 一致的圖示或其他使用者操作元素 (例如上游 AOSP 資訊圖示),用來表示特定設定遭到裝置管理員限制。
- 裝置管理員透過
setShortSupportMessage
提供的簡短說明訊息。 - DPC 應用程式的圖示。
3.9.2 受管理的設定檔支援
如果裝置實作宣告 android.software.managed_users
,則會執行以下操作:
- [C-1-1] 必須透過
android.app.admin.DevicePolicyManager
API 支援受管理的設定檔。 - [C-1-2] 必須允許建立一個受管理的設定檔。
- [C-1-3] 必須使用圖示徽章 (類似 AOSP 上游工作徽章) 代表受管理的應用程式和小工具,以及其他徽章 UI 元素,例如「最近」和「通知」。
- [C-1-4] 必須顯示通知圖示 (類似 AOSP 上游工作標記),指出使用者目前處於受管理設定檔應用程式中。
- [C-1-5] 如果裝置喚醒 (ACTION_USER_PRESENT) 且前景應用程式位於受管理的設定檔中,則必須顯示浮動視窗,指出使用者處於受管理的設定檔中。
- [C-1-6] 如果有受管理的設定檔,則必須在意圖「選擇器」中顯示視覺提示,讓使用者將意圖從受管理的設定檔轉寄給主要使用者,或反之 (如果已由裝置政策控制器啟用)。
- [C-1-7] 如果有受管理的設定檔,則必須為主要使用者和受管理的設定檔提供下列使用者操作功能:
- 為主要使用者和受管理的設定檔分別計算電池、位置、行動數據和儲存空間用量。
- 獨立管理主要使用者或受管理設定檔中安裝的 VPN 應用程式。
- 獨立管理主要使用者或受管理設定檔中安裝的應用程式。
- 獨立管理主要使用者或受管理設定檔中的帳戶。
- [C-1-8] 必須確保預先安裝的撥號、聯絡人和訊息應用程式,可搜尋及查看受管理設定檔 (如果有) 和主要設定檔的來電者資訊 (如果有) (如果裝置政策控制器允許)。
- [C-1-9] 必須確保其符合所有適用於啟用多使用者功能的裝置的安全性要求 (請參閱第 9.5 節),即使受管理的設定檔不計入主要使用者以外的其他使用者。
如果裝置實作項目宣告 android.software.managed_users
和 android.software.secure_lock_screen
,則會:
- [C-2-1] 必須支援指定符合下列規定的獨立鎖定畫面,以便只授予在受管理設定檔中執行的應用程式存取權。
- 裝置實作項目必須遵循
DevicePolicyManager.ACTION_SET_NEW_PASSWORD
意圖,並顯示介面,以便為受管理的設定檔設定個別的螢幕鎖定憑證。 - 如同 Android 開放原始碼專案網站所述,受管理設定檔的螢幕鎖定憑證必須使用與父項設定檔相同的憑證儲存和管理機制。
- 除非呼叫 getParentProfileInstance 傳回的
DevicePolicyManager
例項,否則 DPC 密碼政策一律只會套用至受管理設定檔的鎖定畫面憑證。
- 裝置實作項目必須遵循
- 當受管理的聯絡資料顯示在預先安裝的通話記錄、通話中的使用者介面、進行中的通話和未接來電通知、聯絡人和訊息應用程式中時,應使用與受管理的應用程式相同的徽章。
3.9.3 受管理使用者支援
如果裝置實作宣告 android.software.managed_users
,則會執行以下操作:
- [C-1-1] 在
isLogoutEnabled
傳回true
時,您務必提供使用者操作提示,讓使用者登出目前的使用者,並在多使用者工作階段中切換回主要使用者。使用者必須能夠在鎖定畫面上存取操作提示,且不必解鎖裝置。
3.10. 無障礙功能
Android 提供無障礙層,可協助身心障礙使用者更輕鬆地瀏覽裝置。此外,Android 提供平台 API,可讓無障礙服務實作項目接收使用者和系統事件的回呼,並產生其他回饋機制,例如文字轉語音、觸覺回饋和軌跡球/方向鍵導覽。
如果裝置實作支援第三方無障礙服務,則必須符合下列條件:
- [C-1-1] 必須提供 Android 無障礙功能架構的實作項目,如 無障礙功能 API SDK 說明文件所述。
- [C-1-2] 必須產生無障礙事件,並將適當的
AccessibilityEvent
傳送至所有已註冊的AccessibilityService
實作項目,如 SDK 中所述。 - [C-1-4] 必須在系統的導覽列中新增按鈕,讓使用者在啟用的無障礙服務宣告
AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON
時,控制無障礙服務。請注意,對於沒有系統導覽列的裝置實作,這項規定不適用,但裝置實作應提供使用者控制這些無障礙服務的操作元素。
如果裝置實作內容包含預先安裝的無障礙服務,則會發生以下情況:
- [C-2-1] 當資料儲存空間使用檔案為基礎的加密 (FBE) 加密時,必須將這些預先安裝的無障礙服務實作為直接啟動功能知曉應用程式。
- 應在開箱設定流程中提供機制,讓使用者啟用相關的無障礙服務,以及調整字型大小、顯示大小和放大手勢的選項。
3.11. Text-to-Speech
Android 包含 API,可讓應用程式使用文字轉語音 (TTS) 服務,並讓服務供應商提供 TTS 服務的實作項目。
如果裝置實作項目回報 android.hardware.audio.output 功能,則會:
- [C-1-1] 必須支援 Android TTS 架構 API。
如果裝置實作支援安裝第三方 TTS 引擎,則必須:
- [C-2-1] 必須提供使用者操作提示,讓使用者選取要用於系統層級的 TTS 引擎。
3.12. 電視輸入框架
Android Television 輸入架構 (TIF) 可簡化將直播內容傳送至 Android TV 裝置的程序。TIF 提供標準 API,可用於建立用於控制 Android 電視裝置的輸入模組。
如果裝置實作支援 TIF,則會:
- [C-1-1] 必須宣告平台功能
android.software.live_tv
。 - [C-1-2] 必須支援所有 TIF API,以便使用這些 API 和第三方 TIF 輸入服務的應用程式可在裝置上安裝及使用。
3.13. 快速設定
Android 提供快速設定 UI 元件,可快速存取常用或急需的動作。
如果裝置實作內容包含「快速設定」UI 元件,且支援第三方「快速設定」,則必須符合下列規定:
- [C-1-1] 您必須允許使用者透過第三方應用程式的
quicksettings
API 新增或移除資訊方塊。 - [C-1-2] 請勿自動將第三方應用程式的資訊方塊新增至快速設定。
- [C-1-3] 必須在系統提供的快速設定方塊旁,顯示所有使用者新增的第三方應用程式方塊。
3.14. 媒體 UI
如果裝置實作包含透過 MediaBrowser
或 MediaSession
與第三方應用程式互動的非語音啟動應用程式 (以下簡稱「應用程式」),則應用程式必須符合下列規定:
-
[C-1-2] 必須清楚顯示透過 getIconBitmap() 或 getIconUri() 取得的圖示,以及透過 getTitle() 取得的標題,如
MediaDescription
所述。為了遵守安全法規 (例如駕駛人分心),可以縮短標題。 -
[C-1-3] 凡是顯示第三方應用程式提供的內容,都必須顯示第三方應用程式圖示。
-
[C-1-4] 必須允許使用者與整個
MediaBrowser
階層互動。可限制部分階層的存取權,以符合安全性規定 (例如駕駛人分心),但不得基於內容或內容供應者給予優待。 -
[C-1-5] 必須將
KEYCODE_HEADSETHOOK
或KEYCODE_MEDIA_PLAY_PAUSE
的雙擊動作視為MediaSession.Callback#onMediaButtonEvent
的KEYCODE_MEDIA_NEXT
。
3.15. 免安裝應用程式
裝置實作方式必須符合下列規定:
- [C-0-1] 您只能將
android:protectionLevel
設為"instant"
,授予即時應用程式權限。 - [C-0-2] 除非符合下列任一條件,否則免安裝應用程式不得透過隱含意圖與已安裝的應用程式互動:
- 元件公開的意圖模式篩選器具有 CATEGORY_BROWSABLE
- 動作為 ACTION_SEND、ACTION_SENDTO 或 ACTION_SEND_MULTIPLE 之一
- 目標會透過 android:visibleToInstantApps 明確公開
- [C-0-3] 除非元件是透過 android:visibleToInstantApps 公開,否則免安裝應用程式不得與已安裝的應用程式明確互動。
- [C-0-4] 除非免安裝應用程式明確連結至已安裝的應用程式,否則已安裝的應用程式不得查看裝置上的免安裝應用程式詳細資料。
如果裝置實作項目支援即時應用程式,則會:
- [C-1-1] 您必須提供下列使用者操作元素,讓使用者與即時應用程式互動。AOSP 搭配預設的系統使用者介面、設定和啟動器,可符合相關規定。
- [C-1-2] 您必須提供使用者操作提示,讓使用者查看及刪除各個應用程式套件在本機快取的即時應用程式。
- [C-1-3] 您必須提供常駐使用者通知,在免安裝應用程式於前景執行時,使用者可以將通知收合。這則使用者通知必須說明免安裝應用程式不需要安裝,並提供使用者提示,引導使用者前往「設定」中的應用程式資訊畫面。針對透過網頁意圖啟動的免安裝應用程式 (使用意圖,並將動作設為 Intent.ACTION_VIEW,並使用「http」或「https」的配置),如果裝置上有可用的瀏覽器,則應提供額外的使用者操作選項,讓使用者不必啟動免安裝應用程式,而是透過已設定的網頁瀏覽器啟動相關連結。
- [C-1-4] 如果裝置支援「最近」功能,則必須允許使用者透過「最近」功能存取執行中的即時應用程式。
- [C-1-5] 您必須為 SDK 中列出的意圖,使用意圖處理常式預先載入一或多個應用程式或服務元件,並讓意圖對即時應用程式可見。
3.16. 配對裝置配對連線
Android 支援配件裝置配對功能,可更有效地管理與配件裝置的關聯,並提供 CompanionDeviceManager
API,讓應用程式存取這項功能。
如果裝置實作支援隨附裝置配對功能,則會:
- [C-1-1] 必須宣告功能旗標
FEATURE_COMPANION_DEVICE_SETUP
。 - [C-1-2] 務必確保
android.companion
套件中的 API 已完全實作。 - [C-1-3] 您必須提供使用者操作元素,讓使用者選取/確認配件裝置是否存在且可運作。
3.17. 重量級應用程式
如果裝置實作宣告 FEATURE_CANT_SAVE_STATE
功能,則會:
- [C-1-1] 一次只能有一個已安裝的應用程式指定
cantSaveState
在系統中執行。如果使用者離開這類應用程式時並未明確退出 (例如在系統中離開有效活動時按下主畫面,而不是在系統中沒有有效活動時按下返回按鈕),則裝置實作必須在 RAM 中將該應用程式設為優先,就像其他預期會持續執行的項目 (例如前景服務) 一樣。當這類應用程式處於背景執行時,系統仍可為其套用電源管理功能,例如限制 CPU 和網路存取。 - [C-1-2] 使用者啟動以
cantSaveState
屬性宣告的第二個應用程式後,應用程式必須提供 UI 操作元素,讓使用者選擇不參與一般狀態儲存/還原機制的應用程式。 - [C-1-3] 請勿將其他政策變更套用至指定
cantSaveState
的應用程式,例如變更 CPU 效能或變更排程優先順序。
如果裝置實作未宣告 FEATURE_CANT_SAVE_STATE
功能,則會發生以下情況:
- [C-1-1] 應用程式設定的
cantSaveState
屬性一律須予以忽略,且不得根據該屬性變更應用程式行為。
3.18. 聯絡人
Android 包含 Contacts Provider
API,可讓應用程式管理儲存在裝置上的聯絡資訊。直接輸入裝置的聯絡人資料通常會與網路服務同步,但資料也可能只會儲存在裝置本機上。只儲存在裝置上的聯絡人稱為本機聯絡人。
如果原始聯絡人的 ACCOUNT_NAME
和 ACCOUNT_TYPE
欄位與帳戶的 Account.name 和 Account.type 欄位相符,則原始聯絡人會「與」或「儲存在」帳戶中。
預設本機帳戶:這是用於原始聯絡人的帳戶,僅儲存在裝置上,且未與 AccountManager 中的帳戶建立關聯。這些帳戶是使用 ACCOUNT_NAME
和 ACCOUNT_TYPE
欄的空值建立。
自訂本機帳戶:此帳戶適用於僅儲存在裝置上且未與 AccountManager 中的帳戶相關聯的原始聯絡人,這些帳戶是使用 ACCOUNT_NAME
和 ACCOUNT_TYPE
資料欄的至少一個非空值建立。
裝置實作方式:
- [C-SR] 強烈建議您不要建立自訂本機帳戶。
如果裝置實作使用自訂本機帳戶:
- [C-1-1] 自訂本機帳戶的
ACCOUNT_NAME
必須由ContactsContract.RawContacts.getLocalAccountName
傳回 - [C-1-2] 自訂本機帳戶的
ACCOUNT_TYPE
必須由ContactsContract.RawContacts.getLocalAccountType
傳回 - [C-1-3] 第三方應用程式使用預設的本機帳戶插入的原始聯絡人 (也就是設定
ACCOUNT_NAME
和ACCOUNT_TYPE
的空值),必須插入自訂的本機帳戶。 - [C-1-4] 新增或移除帳戶時,不得移除插入自訂本機帳戶的原始聯絡人。
- [C-1-5] 針對自訂本機帳戶執行的刪除作業必須立即清除原始聯絡人 (就像
CALLER_IS_SYNCADAPTER
參數設為 true 一樣),即使CALLER\_IS\_SYNCADAPTER
參數設為 false 或未指定也一樣。
4. 應用程式封裝相容性
裝置實作方式:
- [C-0-1] 必須能夠安裝及執行由 官方 Android SDK 中「aapt」工具產生的 Android「.apk」檔案。
- 由於上述要求可能難以實現,因此建議裝置實作項目使用 AOSP 參考實作項目的套件管理系統。
裝置實作方式:
- [C-0-2] 必須支援使用 APK Signature Scheme v3、APK Signature Scheme v2 和 JAR 簽署 驗證「.apk」檔案。
- [C-0-3] 請勿擴充 .apk、Android 資訊清單、Dalvik 位元碼或 RenderScript 位元碼格式,以免這些檔案無法在其他相容裝置上正確安裝及執行。
-
[C-0-4] 除了套件的目前「正式安裝者」以外,其他應用程式不得在未經使用者確認的情況下,悄悄解除安裝應用程式,如
DELETE_PACKAGE
權限的 SDK 所述。唯一的例外狀況是系統套件驗證器應用程式處理 PACKAGE_NEEDS_VERIFICATION 意圖,以及儲存空間管理器應用程式處理 ACTION_MANAGE_STORAGE 意圖。 -
[C-0-5] 活動必須處理
android.settings.MANAGE_UNKNOWN_APP_SOURCES
意圖。 -
[C-0-6] 請勿從不明來源安裝應用程式套件,除非要求安裝的應用程式符合下列所有規定:
- 必須宣告
REQUEST_INSTALL_PACKAGES
權限,或是將android:targetSdkVersion
設為 24 以下。 - 使用者必須已授予權限,才能從不明來源安裝應用程式。
- 必須宣告
-
應為使用者提供操作選項,讓他們授予/撤銷從不明來源安裝應用程式的權限,但如果裝置實作不想讓使用者有此選擇,則可選擇將此操作設為無操作,並傳回
startActivityForResult()
的RESULT_CANCELED
。不過,即使在這種情況下,也應向使用者說明為何沒有顯示這類選項。 -
[C-0-7] 在應用程式中啟動活動前,必須顯示警告對話方塊,並透過系統 API
PackageManager.setHarmfulAppWarning
向使用者提供警告字串,該活動已由相同的系統 APIPackageManager.setHarmfulAppWarning
標示為可能有害。 -
應在警告對話方塊中提供使用者操作提示,讓使用者選擇解除安裝或啟動應用程式。
-
[C-0-8] 必須實作支援增量檔案系統的功能,如此處所述。
-
[C-0-9] 必須支援使用 APK Signature Scheme v4 驗證 .apk 檔案。
-
如果裝置實作已在舊版 Android 上推出,且無法透過系統軟體更新符合 [C-0-8] 和 [C-0-9] 規定,則可免除這些規定。
5. 多媒體相容性
裝置實作方式:
- [C-0-1] 必須支援
MediaCodecList
所宣告的每個編解碼器,並為其支援第 5.1 節所定義的媒體格式、編碼器、解碼器、檔案類型和容器格式。 - [C-0-2] 必須透過
MediaCodecList
宣告並回報第三方應用程式可用的編碼器和解碼器。 - [C-0-3] 必須能夠正確解碼,並向第三方應用程式提供所有可編碼的格式。包括編碼器產生的所有位元串流,以及在
CamcorderProfile
中回報的設定檔。
裝置實作方式:
- 應盡量縮短編碼器延遲時間,也就是說,應
- 不應使用及儲存輸入緩衝區,且只在處理後傳回輸入緩衝區。
- 應在標準 (例如 SPS) 指定的時間內,釋放解碼緩衝區。
- 不應將編碼緩衝區保留超過 GOP 結構所需的時間。
下文所列的所有編解碼器,均為 Android 開放原始碼計畫中偏好的 Android 實作項目提供的軟體實作項目。
請注意,Google 和開放手持裝置聯盟均未聲稱這些編解碼不受第三方專利約束。如要在硬體或軟體產品中使用這個原始碼,請注意,實作這個程式碼 (包括在開放原始碼軟體或共享軟體中) 可能需要取得相關專利持有人的專利授權。
5.1. 媒體轉碼器
5.1.1. 音訊編碼
詳情請參閱 5.1.3 音訊轉碼器詳細資料。
如果裝置實作項目宣告 android.hardware.microphone
,則必須支援編碼下列音訊格式,並提供給第三方應用程式:
- [C-1-1] PCM/WAVE
- [C-1-2] FLAC
- [C-1-3] Opus
所有音訊編碼器都必須支援下列項目:
- [C-3-1] 透過
android.media.MediaCodec
API 傳送 PCM 16 位元原生位元組順序音訊影格。
5.1.2. 音訊解碼
詳情請參閱 5.1.3 音訊轉碼器詳細資料。
如果裝置實作項目宣告支援 android.hardware.audio.output
功能,就必須支援解碼下列音訊格式:
- [C-1-1] MPEG-4 AAC 設定檔 (AAC LC)
- [C-1-2] MPEG-4 HE AAC Profile (AAC+)
- [C-1-3] MPEG-4 HE AACv2 設定檔 (增強型 AAC+)
- [C-1-4] AAC ELD (增強型低延遲 AAC)
- [C-1-11] xHE-AAC (ISO/IEC 23003-3 Extended HE AAC Profile,包含 USAC 基準設定檔,以及 ISO/IEC 23003-4 Dynamic Range Control Profile)
- [C-1-5] FLAC
- [C-1-6] MP3
- [C-1-7] MIDI
- [C-1-8] Vorbis
- [C-1-9] PCM/WAVE,包括高解析度音訊格式 (最高 24 位元、192 kHz 取樣率和 8 個頻道)。請注意,這項規定僅適用於解碼,且裝置可在播放階段進行降樣和降混。
- [C-1-10] Opus
如果裝置實作項目支援透過 android.media.MediaCodec
API 中的預設 AAC 音訊解碼器,將多聲道串流 (即超過兩個聲道) 的 AAC 輸入緩衝區解碼為 PCM,則必須支援下列項目:
- [C-2-1] 解碼時,不得進行下混 (例如 5.0 AAC 串流必須解碼為五聲道 PCM,5.1 AAC 串流必須解碼為六聲道 PCM)。
- [C-2-2] 動態範圍中繼資料必須符合 ISO/IEC 14496-3 中的「動態範圍控制 (DRC)」和
android.media.MediaFormat
DRC 鍵所定義的規範,以便設定音訊解碼器的動態範圍相關行為。AAC DRC 鍵是在 API 21 中推出,包括KEY_AAC_DRC_ATTENUATION_FACTOR
、KEY_AAC_DRC_BOOST_FACTOR
、KEY_AAC_DRC_HEAVY_COMPRESSION
、KEY_AAC_DRC_TARGET_REFERENCE_LEVEL
和KEY_AAC_ENCODED_TARGET_LEVEL
。 - [SR] 強烈建議所有 AAC 音訊解碼器都符合上述 C-2-1 和 C-2-2 規定。
解碼 USAC 音訊時,MPEG-D (ISO/IEC 23003-4):
- [C-3-1] 音量和 DRC 中繼資料必須根據 MPEG-D DRC 動態範圍控制設定檔第 1 級進行解讀及套用。
- [C-3-2] 解碼器必須根據以下
android.media.MediaFormat
鍵設定的設定運作:KEY_AAC_DRC_TARGET_REFERENCE_LEVEL
和KEY_AAC_DRC_EFFECT_TYPE
。
MPEG-4 AAC、HE AAC 和 HE AACv2 設定檔解碼器:
- 可使用 ISO/IEC 23003-4 動態範圍控制設定檔支援音量和動態範圍控制。
如果支援 ISO/IEC 23003-4,且解碼位元串流中同時存在 ISO/IEC 23003-4 和 ISO/IEC 14496-3 中繼資料,則:
- ISO/IEC 23003-4 中繼資料應優先採用。
所有音訊解碼器都必須支援輸出:
- [C-6-1] 透過
android.media.MediaCodec
API 傳送 PCM 16 位元原生位元組順序音訊影格。
5.1.3. 音訊轉碼器詳細資料
格式/編解碼 | 詳細資料 | 支援的檔案類型/容器格式 |
---|---|---|
MPEG-4 AAC 設定檔 (AAC LC) |
支援單聲道/立體聲/5.0/5.1 內容,取樣率為 8 到 48 kHz 的標準值。 |
|
MPEG-4 HE AAC 格式 (AAC+) | 支援單聲道/立體聲/5.0/5.1 內容,標準取樣率介於 16 到 48 kHz 之間。 |
|
MPEG-4 HE AACv2 Profile (增強型 AAC+) |
支援單聲道/立體聲/5.0/5.1 內容,標準取樣率介於 16 到 48 kHz 之間。 |
|
AAC ELD (增強型低延遲 AAC) | 支援單聲道/立體聲內容,取樣率為 16 到 48 kHz 的標準值。 |
|
USAC | 支援單聲道/立體聲內容,取樣率為 7.35 到 48 kHz 的標準取樣率。 | MPEG-4 (.mp4、.m4a) |
AMR-NB | 4.75 至 12.2 kbps,取樣頻率為 8 kHz | 3GPP (.3gp) |
AMR-WB | 9 個速率,從 6.60 kbit/s 到 23.85 kbit/s,取樣頻率為 16 kHz,如 AMR-WB、Adaptive Multi-Rate - Wideband Speech Codec 所定義 | 3GPP (.3gp) |
FLAC | 編碼器和解碼器:至少必須支援單聲道和立體聲模式。必須支援最高 192 kHz 的取樣率,且必須支援 16 位元和 24 位元的解析度。浮點音訊設定必須提供 FLAC 24 位元音訊資料處理功能。 |
|
MP3 | 單聲道/立體聲 8-320 Kbps 固定位元率 (CBR) 或可變位元率 (VBR) |
|
MIDI | MIDI 類型 0 和 1。DLS 1 和 2 版。XMF 和 Mobile XMF。支援鈴聲格式 RTTTL/RTX、OTA 和 iMelody |
|
Vorbis |
|
|
PCM/WAVE | PCM 編解碼器必須支援 16 位元線性 PCM 和 16 位元浮點。WAVE Extractor 必須支援 16 位元、24 位元、32 位元線性 PCM 和 32 位元浮點 (速率上限為硬體限制)。必須支援 8 kHz 到 192 kHz 的取樣率。 | WAVE (.wav) |
Opus |
解碼:支援單聲道、立體聲、5.0 和 5.1 內容,取樣率為 8000、12000、16000、24000 和 48000 Hz。 編碼:支援單聲道和立體聲內容,取樣率為 8000、12000、16000、24000 和 48000 Hz。 |
|
5.1.4. 圖片編碼
詳情請參閱 5.1.6。圖片編碼器詳細資料。
裝置實作項目必須支援下列圖片編碼:
- [C-0-1] JPEG
- [C-0-2] PNG
- [C-0-3] WebP
如果裝置實作項目支援透過 android.media.MediaCodec
為媒體類型 MIMETYPE_IMAGE_ANDROID_HEIC
進行 HEIC 編碼,則會:
- [C-1-1] 必須提供硬體加速 HEVC 編碼器編碼器,支援
BITRATE_MODE_CQ
位元率控制模式、HEVCProfileMainStill
設定檔和 512 x 512 像素的框架大小。
5.1.5. 圖片解碼
詳情請參閱 5.1.6。圖片編碼器詳細資料。
裝置實作項目必須支援解碼下列圖片編碼:
- [C-0-1] JPEG
- [C-0-2] GIF
- [C-0-3] PNG
- [C-0-4] BMP
- [C-0-5] WebP
- [C-0-6] 原始
如果裝置實作支援 HEVC 影片解碼,則必須符合以下規定:* [C-1-1] 必須支援 HEIF (HEIC) 圖片解碼。
支援高位元深度格式 (每個管道 9 位元以上) 的圖片解碼器:
- [C-2-1] 必須支援輸出應用程式要求的 8 位元等效格式,例如透過
android.graphics.Bitmap
的ARGB_8888
設定。
5.1.6. 圖片編碼器詳細資料
格式/編解碼 | 詳細資料 | 支援的檔案類型/容器格式 |
---|---|---|
JPEG | 基本 + 漸進式 | JPEG (.jpg) |
GIF | GIF (.gif) | |
PNG | PNG (.png) | |
BMP | BMP (.bmp) | |
WebP | WebP (.webp) | |
原始 | ARW (.arw)、CR2 (.cr2)、DNG (.dng)、NEF (.nef)、NRW (.nrw)、ORF (.orf)、PEF (.pef)、RAF (.raf)、RW2 (.rw2)、SRW (.srw) | |
HEIF | 圖片、圖片集合、圖片序列 | HEIF (.heif)、HEIC (.heic) |
透過 MediaCodec API 公開的圖片編碼器和解碼器
-
[C-1-1] 必須透過
CodecCapabilities
支援 YUV420 8:8:8 彈性色彩格式 (COLOR_FormatYUV420Flexible
)。 -
[SR] 強烈建議您支援輸入 Surface 模式的 RGB888 顏色格式。
-
[C-1-3] 必須支援至少一種平面或半平面 YUV420 8:8:8 色彩格式:
COLOR_FormatYUV420PackedPlanar
(等同於COLOR_FormatYUV420Planar
) 或COLOR_FormatYUV420PackedSemiPlanar
(等同於COLOR_FormatYUV420SemiPlanar
)。強烈建議同時支援這兩種格式。
5.1.7. 視訊轉碼器
- 為提供可接受的網路影片串流和視訊會議服務品質,裝置實作應使用符合規定的硬體 VP8 編解碼器。
如果裝置實作內容包含影片解碼器或編碼器:
-
[C-1-1] 視訊編碼器必須支援輸出和輸入位元組緩衝區大小,以便根據標準和設定容納可行的最大壓縮和未壓縮影格,但也不能超出分配範圍。
-
[C-1-2] 影片編碼器和解碼器必須透過
CodecCapabilities
支援 YUV420 8:8:8 彈性色彩格式 (COLOR_FormatYUV420Flexible
)。 -
[C-1-3] 影片編碼器和解碼器必須支援至少一種平面或半平面 YUV420 8:8:8 色彩格式:
COLOR_FormatYUV420PackedPlanar
(等同於COLOR_FormatYUV420Planar
) 或COLOR_FormatYUV420PackedSemiPlanar
(等同於COLOR_FormatYUV420SemiPlanar
)。強烈建議同時支援這兩種格式。 -
[SR] 強烈建議影片編碼器和解碼器至少支援一種硬體最佳化平面或半平面 YUV420 8:8:8 色彩格式 (YV12、NV12、NV21 或相等的供應商最佳化格式)。
-
[C-1-5] 支援高位元深度格式 (每個頻道 9 位元以上) 的影片解碼器,必須支援輸出應用程式要求的 8 位元等效格式。您必須透過
android.media.MediaCodecInfo
支援 YUV420 8:8:8 色彩格式,才能反映這項資訊。
如果裝置實作透過 Display.HdrCapabilities
宣傳 HDR 設定檔支援功能,則會:
- [C-2-1] 必須支援 HDR 靜態中繼資料的剖析和處理。
如果裝置實作項目透過 MediaCodecInfo.CodecCapabilities
類別中的 FEATURE_IntraRefresh
宣傳內部重新整理支援功能,則會:
- [C-3-1] 必須支援 10 到 60 影格範圍的重新整理週期,並在設定的重新整理週期 20% 內準確運作。
除非應用程式使用 KEY_COLOR_FORMAT
格式鍵指定其他格式,否則影片解碼器實作方式如下:
- [C-4-1] 如果使用 Surface 輸出設定,則必須預設為針對硬體顯示器最佳化的色彩格式。
- [C-4-2] 如果已設定為不使用 Surface 輸出,則必須預設為 YUV420 8:8:8 顏色格式,以便最佳化 CPU 讀取。
5.1.8. 視訊轉碼器清單
格式/編解碼 | 詳細資料 | 支援的檔案類型/容器格式 |
---|---|---|
H.263 |
|
|
H.264 AVC | 詳情請參閱 第 5.2 節和 5.3。 |
|
H.265 HEVC | 詳情請參閱第 5.3 節 |
|
MPEG-2 | 主要設定檔 |
|
MPEG-4 SP |
|
|
VP8 | 詳情請參閱 第 5.2 節和 5.3。 |
|
VP9 | 詳情請參閱第 5.3 節 |
|
5.1.9. 媒體轉碼器安全性
裝置實作項目必須確保符合下列媒體編解碼安全性功能。
Android 支援 OMX (跨平台多媒體加速 API),以及 Codec 2.0 (低負載多媒體加速 API)。
如果裝置實作支援多媒體,則必須:
- [C-1-1] 必須透過 OMX 或 Codec 2.0 API (或兩者皆是) 提供媒體編解碼器支援 (如同 Android 開放原始碼計畫),且不得停用或規避安全防護機制。這並非表示每個編碼器都必須使用 OMX 或 Codec 2.0 API,而是指至少必須支援其中一個 API,且支援的 API 必須包含現有的安全防護機制。
- [C-SR] 強烈建議納入對 Codec 2.0 API 的支援。
如果裝置實作不支援 Codec 2.0 API,則會發生以下情況:
- [C-2-1] 針對裝置支援的每種媒體格式和類型 (編碼器或解碼器),必須納入 Android 開放原始碼計畫的對應 OMX 軟體編碼器 (如有)。
- [C-2-2] 名稱開頭為「OMX.google.」的編解碼 必須以 Android 開放原始碼計畫的原始碼為基礎。
- [C-SR] 強烈建議您在無法存取記憶體對應器以外的硬體驅動程式中,執行 OMX 軟體編碼器。
如果裝置實作支援 Codec 2.0 API,則會:
- [C-3-1] 針對裝置支援的每種媒體格式和類型 (編碼器或解碼器),必須納入 Android 開放原始碼專案的對應 Codec 2.0 軟體編解碼器 (如有)。
- [C-3-2] 必須將 Codec 2.0 軟體編碼器安置於軟體編碼器處理程序中,如 Android 開放原始碼計畫所提供,以便更精確地授予軟體編碼器存取權。
- [C-3-3] 編解碼名稱開頭為「c2.android.」必須以 Android 開放原始碼計畫的原始碼為基礎。
5.1.10. 媒體轉碼器特性描述
如果裝置實作項目支援媒體編解碼器,則會:
- [C-1-1] 必須透過
MediaCodecInfo
API 傳回正確的媒體編解碼特性值。
具體而言:
- [C-1-2] 名稱開頭為「OMX.」的編解碼 必須使用 OMX API,且名稱必須符合 OMX IL 命名規範。
- [C-1-3] 名稱開頭為「c2.」的編解碼必須使用 Codec 2.0 API,且名稱必須符合 Android 的 Codec 2.0 命名規範。
- [C-1-4] 編解碼名稱開頭為「OMX.google.」或「c2.android.」不得以供應商或硬體加速器的形式呈現。
- [C-1-5] 在編解碼器程序 (供應商或系統) 中執行的編解碼器,如果能存取記憶體配置器和對應器以外的硬體驅動程式,則不得以「僅限軟體」為特徵。
- [C-1-6] 編解碼器若未出現在 Android 開放原始碼計畫中,或並非以該計畫中的原始碼為基礎,則必須標示為供應商。
- [C-1-7] 使用硬體加速的編解碼器必須以硬體加速的形式呈現。
- [C-1-8] 編解碼名稱不得誤導使用者。舉例來說,名為「decoders」的編解碼務必支援解碼,而名為「encoders」的編解碼則務必支援編碼。名稱含有媒體格式的編解碼器必須支援這些格式。
如果裝置實作項目支援影片編碼器:
- [C-2-1] 所有影片編碼器都必須針對下列轉碼器支援的大小,發布可達成的影格速率資料:
SD (低畫質) | SD (高畫質) | HD 720p | HD 1080p | UHD 超高畫質 | |
---|---|---|---|---|---|
影片解析度 |
|
|
|
1920 x 1080 像素 (MPEG4 以外) | 3840 x 2160 像素 (HEVC、VP9) |
- [C-2-2] 屬於硬體加速的視訊編碼器必須發布效能點資訊。除非已納入其他支援的標準成效點,否則每個成效點都必須列出所有支援的標準成效點 (列於
PerformancePoint
API 中)。 - 此外,如果他們支援持續的影片成效 (而非上述標準成效),就應發布擴充成效點數。
5.2. 影片編碼
如果裝置實作支援任何影片編碼器,並將其提供給第三方應用程式,則該裝置會:
- 在兩個滑動視窗中,不應超過每個內插影格 (I 影格) 間隔的 15% 以上。
- 在 1 秒的滑動視窗中,不得超過比特率的 100%。
如果裝置實作包含內嵌螢幕顯示器,且對角長度至少為 2.5 英寸,或包含視訊輸出埠,或透過 android.hardware.camera.any
功能旗標宣告支援相機,則:
- [C-1-1] 必須支援至少一種 VP8 或 H.264 影片編碼器,並提供給第三方應用程式使用。
- 應同時支援 VP8 和 H.264 視訊編碼器,並提供給第三方應用程式使用。
如果裝置實作支援 H.264、VP8、VP9 或 HEVC 視訊編碼器,並將其提供給第三方應用程式,則:
- [C-2-1] 必須支援可動態設定的比特率。
- 應支援可變的畫面更新率,其中影片編碼器應根據輸入緩衝區的時間戳記,判斷瞬間影格持續時間,並根據該影格持續時間分配位元值桶。
如果裝置實作支援 MPEG-4 SP 視訊編碼器,並將其提供給第三方應用程式,則:
- 應支援支援的編碼器的動態可設定位元率。
如果裝置實作提供硬體加速的視訊或圖片編碼器,並支援透過 android.camera
API 公開的一或多個已連接或可插入的硬體攝影機:
- [C-4-1] 所有硬體加速影片和圖片編碼器都必須支援從硬體攝影機編碼影格。
- 應透過所有影片或圖像編碼器,支援從硬體攝影機編碼影格。
5.2.1. H.263
如果裝置實作支援 H.263 編碼器,並將其提供給第三方應用程式,則:
- [C-1-1] 必須支援基準設定檔等級 45。
- 應支援支援的編碼器的動態可設定位元率。
5.2.2. H.264
如果裝置實作支援 H.264 轉碼器,則會:
- [C-1-1] 必須支援基準設定檔第 3 級。不過,您可以選擇是否支援 ASO (任意切片排序)、FMO (彈性區塊排序) 和 RS (重複切片)。此外,為維持與其他 Android 裝置的相容性,建議編碼器不要使用 ASO、FMO 和 RS 做為基準設定檔。
- [C-1-2] 必須支援下表中的 SD (標準畫質) 影片編碼設定檔。
- 應支援 Main Profile Level 4。
- 應支援下表所示的 HD (高畫質) 影片編碼設定檔。
如果裝置實作項目透過媒體 API 回報支援 720p 或 1080p 解析度的 H.264 編碼,則會:
- [C-2-1] 必須支援下表中的編碼設定檔。
SD (低畫質) | SD (高畫質) | HD 720p | HD 1080p | |
---|---|---|---|---|
影片解析度 | 320 x 240 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
影片影格速率 | 20 fps | 30 fps | 30 fps | 30 fps |
影片位元率 | 384 Kbps | 2 Mbps | 4 Mbps | 10 Mbps |
5.2.3. VP8
如果裝置實作支援 VP8 編解碼器,則會:
- [C-1-1] 必須支援 SD 影片編碼設定檔。
- 應支援下列 HD (高畫質) 影片編碼設定檔。
- [C-1-2] 必須支援寫入 Matroska WebM 檔案。
- 應提供符合 WebM 專案 RTC 硬體編碼需求的硬體 VP8 編解碼器,確保網路影片串流和視訊會議服務的品質。
如果裝置實作項目透過媒體 API 回報支援 720p 或 1080p 解析度影片的 VP8 編碼,則會:
- [C-2-1] 必須支援下表中的編碼設定檔。
SD (低畫質) | SD (高畫質) | HD 720p | HD 1080p | |
---|---|---|---|---|
影片解析度 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
影片影格速率 | 30 fps | 30 fps | 30 fps | 30 fps |
影片位元率 | 800 Kbps | 2 Mbps | 4 Mbps | 10 Mbps |
5.2.4. VP9
如果裝置實作支援 VP9 編解碼,則會:
- [C-1-2] 必須支援 Profile 0 Level 3。
- [C-1-1] 必須支援寫入 Matroska WebM 檔案。
- [C-1-3] 必須產生 CodecPrivate 資料。
- 應支援下表所示的 HD 解碼設定檔。
- 如果有硬體編碼器,強烈建議使用 [SR] 支援下表所示的高畫質解碼設定檔。
SD | HD 720p | HD 1080p | UHD 超高畫質 | |
---|---|---|---|---|
影片解析度 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
影片影格速率 | 30 fps | 30 fps | 30 fps | 30 fps |
影片位元率 | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
如果裝置實作聲稱透過 Media API 支援 Profile 2 或 Profile 3:
- 支援 12 位元格式為選用功能。
5.2.5. H.265
如果裝置實作支援 H.265 編解碼器,則會:
- [C-1-1] 必須支援主設定檔第 3 級。
- 應支援下表所示的 HD 編碼設定檔。
- 如果有硬體編碼器,強烈建議使用 [SR] 支援下表所示的高畫質編碼設定檔。
SD | HD 720p | HD 1080p | UHD 超高畫質 | |
---|---|---|---|---|
影片解析度 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
影片影格速率 | 30 fps | 30 fps | 30 fps | 30 fps |
影片位元率 | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
5.3. 影片解碼
如果裝置實作支援 VP8、VP9、H.264 或 H.265 轉碼器,則會:
- [C-1-1] 必須透過相同串流中的標準 Android API,支援所有 VP8、VP9、H.264 和 H.265 轉碼器的動態視訊解析度和影格速率切換,並即時支援裝置上每個轉碼器支援的最高解析度。
5.3.1. MPEG-2
如果裝置實作支援 MPEG-2 解碼器,則會:
- [C-1-1] 必須支援主設定檔高層級。
5.3.2. H.263
如果裝置實作支援 H.263 解碼器,則會:
- [C-1-1] 必須支援基準設定檔等級 30 和 45。
5.3.3. MPEG-4
如果裝置實作 MPEG-4 解碼器,則會:
- [C-1-1] 必須支援簡易設定檔第 3 級。
5.3.4. H.264
如果裝置實作支援 H.264 解碼器,則會:
- [C-1-1] 必須支援主設定檔等級 3.1 和基準設定檔。支援 ASO (任意切片排序)、FMO (彈性區塊排序) 和 RS (重複切片) 為選用功能。
- [C-1-2] 必須能夠解碼使用下表所列 SD (標準解析度) 設定檔的影片,且以基準設定檔和主設定檔 Level 3.1 (包括 720p30) 編碼。
- 應具備解碼 HD (高畫質) 設定檔的功能,如下表所示。
如果 Display.getSupportedModes()
方法回報的高度等於或大於影片解析度,裝置實作方式如下:
- [C-2-1] 必須支援下表中的 HD 720p 影片解碼設定檔。
- [C-2-2] 必須支援下表中的 HD 1080p 影片解碼設定檔。
SD (低畫質) | SD (高畫質) | HD 720p | HD 1080p | |
---|---|---|---|---|
影片解析度 | 320 x 240 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
影片影格速率 | 30 fps | 30 fps | 60 fps | 30 fps (60 fps電視) |
影片位元率 | 800 Kbps | 2 Mbps | 8 Mbps | 20 Mbps |
5.3.5. H.265 (HEVC)
如果裝置實作支援 H.265 編解碼器,則會:
- [C-1-1] 必須支援 Main Profile Level 3 Main 層級和 SD 影片解碼設定檔,如下表所示。
- 應支援下表所示的 HD 解碼設定檔。
- [C-1-2] 如果有硬體解碼器,則必須支援下表所示的 HD 解碼設定檔。
如果 Display.getSupportedModes()
方法回報的高度等於或大於影片解析度,則:
- [C-2-1] 裝置實作方式必須支援至少一種 H.265 或 VP9 解碼功能,以便解碼 720、1080 和 UHD 設定檔。
SD (低畫質) | SD (高畫質) | HD 720p | HD 1080p | UHD 超高畫質 | |
---|---|---|---|---|---|
影片解析度 | 352 x 288 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
影片影格速率 | 30 fps | 30 fps | 30 fps | 30/60 fps (60 fps 適用於支援 H.265 硬體解碼的電視) | 60 fps |
影片位元率 | 600 Kbps | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
如果裝置實作聲稱透過 Media API 支援 HDR 設定檔:
- [C-3-1] 裝置實作必須接受應用程式提供的必要 HDR 中繼資料,並支援從位元串流和/或容器中擷取及輸出必要的 HDR 中繼資料。
- [C-3-2] 裝置實作方式必須在裝置螢幕或標準影片輸出埠 (例如 HDMI)。
5.3.6. VP8
如果裝置實作支援 VP8 編解碼器,則會:
- [C-1-1] 必須支援下表中的 SD 解碼設定檔。
- 應使用符合規定的硬體 VP8 編解碼器。
- 應支援下表中的 HD 解碼設定檔。
如果 Display.getSupportedModes()
方法回報的高度等於或大於影片解析度,則:
- [C-2-1] 裝置實作項目必須支援下表中的 720p 設定檔。
- [C-2-2] 裝置實作方式必須支援下表中的 1080p 設定檔。
SD (低畫質) | SD (高畫質) | HD 720p | HD 1080p | |
---|---|---|---|---|
影片解析度 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
影片影格速率 | 30 fps | 30 fps | 30 fps (60 fps電視) | 30 (60 fps)電視 |
影片位元率 | 800 Kbps | 2 Mbps | 8 Mbps | 20 Mbps |
5.3.7. VP9
如果裝置實作支援 VP9 編解碼,則會:
- [C-1-1] 必須支援下表所示的 SD 影片解碼設定檔。
- 應支援下表所示的 HD 解碼設定檔。
如果裝置實作支援 VP9 編解碼器和硬體解碼器:
- [C-2-1] 必須支援下表所列的 HD 解碼設定檔。
如果 Display.getSupportedModes()
方法回報的高度等於或大於影片解析度,則:
- [C-3-1] 裝置實作方式必須至少支援一種 VP9 或 H.265 解碼功能,以便解碼 720、1080 和 UHD 設定檔。
SD (低畫質) | SD (高畫質) | HD 720p | HD 1080p | UHD 超高畫質 | |
---|---|---|---|---|---|
影片解析度 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
影片影格速率 | 30 fps | 30 fps | 30 fps | 30 fps (60 fps,支援 VP9 硬體解碼的電視) | 60 fps |
影片位元率 | 600 Kbps | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
如果裝置實作聲稱透過 'CodecProfileLevel' 媒體 API 支援 VP9Profile2
或 VP9Profile3
:
- 支援 12 位元格式為選用功能。
如果裝置實作聲稱透過媒體 API 支援 HDR 設定檔 (VP9Profile2HDR
、VP9Profile2HDR10Plus
、VP9Profile3HDR
、VP9Profile3HDR10Plus
):
- [C-4-1] 裝置實作必須接受應用程式提供的必要 HDR 中繼資料 (
KEY_HDR_STATIC_INFO
適用於所有 HDR 設定檔,以及 HDR10Plus 設定檔的 'KEY_HDR10_PLUS_INFO')。也必須支援從位元串流和/或容器中擷取及輸出必要的 HDR 中繼資料。 - [C-4-2] 裝置實作方式必須在裝置螢幕或標準影片輸出連接埠 (例如 HDMI)。
5.3.8. Dolby Vision
如果裝置實作透過 HDR_TYPE_DOLBY_VISION
宣告支援 Dolby Vision 解碼器,則會:
- [C-1-1] 必須提供支援 Dolby Vision 的擷取器。
- [C-1-2] 必須在裝置畫面或標準影片輸出埠 (例如 HDMI)。
- [C-1-3] 必須將向後相容的基本層的曲目索引 (如有) 設為與合併 Dolby Vision 層的曲目索引相同。
5.3.9. AV1
如果裝置實作支援 AV1 編解碼器,則會:
- [C-1-1] 必須支援 Profile 0,包括 10 位元內容。
5.4. 錄音
雖然本節列出的部分規定自 Android 4.3 起列為「建議」,但日後版本的相容性定義預計會將這些規定改為「必須」。現有和新款 Android 裝置強烈建議符合這些「應」列出的規定,否則升級至日後的版本時,將無法達到 Android 相容性。
5.4.1. 原始音訊擷取和麥克風資訊
如果裝置實作宣告 android.hardware.microphone
,則會執行以下操作:
-
[C-1-1] 必須允許擷取原始音訊內容,且具備下列特性:
- 格式:線性 PCM,16 位元
- 取樣率:8000、11025、16000、44100、48000 Hz
- 管道:單聲道
-
應允許擷取具有下列特性的原始音訊內容:
- 格式:線性 PCM、16 位元和 24 位元
- 取樣率:8000、11025、16000、22050、24000、32000、44100、48000 Hz
- 頻道:頻道數量等於裝置上的麥克風數量
-
[C-1-2] 必須以上述取樣率進行擷取,且不得向上取樣。
- [C-1-3] 使用上述取樣率進行降樣擷取時,必須加入適當的反鋸齒濾鏡。
-
應允許 AM 廣播和 DVD 品質擷取原始音訊內容,也就是下列特性:
- 格式:線性 PCM,16 位元
- 取樣率:22050、48000 Hz
- 聲道:立體聲
- [C-1-4] 必須遵循
MicrophoneInfo
API 規定,並適當填入裝置上可供第三方應用程式存取的音訊麥克風資訊,以及第三方應用程式可透過AudioManager.getMicrophones()
API 和AudioRecord.getActiveMicrophones()
與MediaRecorder.getActiveMicrophones()
API 存取的目前有效音訊麥克風資訊。如果裝置實作可讓 AM 廣播和 DVD 品質擷取原始音訊內容,則必須:
-
[C-2-1] 必須在無需向上取樣的情況下,以高於 16000:22050 或 44100:48000 的比例擷取。
- [C-2-2] 必須為所有升採樣或降採樣作業加入適當的反鋸齒濾鏡。
5.4.2. 語音辨識擷取
如果裝置實作宣告 android.hardware.microphone
,則會執行以下操作:
- [C-1-1] 必須以 44100 和 48000 等其中一個取樣率擷取
android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION
音訊來源。 - [C-1-2] 錄製
AudioSource.VOICE_RECOGNITION
音訊來源的音訊串流時,必須預設停用任何降噪音訊處理功能。 - [C-1-3] 錄製
AudioSource.VOICE_RECOGNITION
音訊來源的音訊串流時,必須預設停用任何自動增益控制功能。 - 應以大致平坦的振幅與頻率特性錄製語音辨識音訊串流,具體來說,從 100 Hz 到 4000 Hz 的頻率應為 ±3 dB。
- 應設定輸入靈敏度,以便在 1000 Hz 的 90 dB 聲音功率級別 (SPL) 來源,產生 16 位元樣本的 RMS 值 2500。
- 應記錄語音辨識音訊串流,以便 PCM 振幅等級以線性方式追蹤輸入 SPL 的變化,至少在麥克風的 90 dB SPL 下,從 -18 dB 到 +12 dB 變化。
- 應錄製語音辨識音訊串流,其中 1 kHz 的總諧波失真 (THD) 小於 1%,麥克風的輸入音量為 90 dB SPL。
如果裝置實作宣告為語音辨識調整的 android.hardware.microphone
和雜訊抑制 (降低) 技術,則會:
- [C-2-1] 必須允許使用
android.media.audiofx.NoiseSuppressor
API 控制此音效。 - [C-2-2] 必須透過
AudioEffect.Descriptor.uuid
欄位,明確識別每種噪音抑制技術的實作方式。
5.4.3. 擷取資料,以便重新導向播放內容
android.media.MediaRecorder.AudioSource
類別包含 REMOTE_SUBMIX
音訊來源。
如果裝置實作項目同時宣告 android.hardware.audio.output
和 android.hardware.microphone
,則會發生以下情況:
-
[C-1-1] 必須正確實作
REMOTE_SUBMIX
音訊來源,以便應用程式使用android.media.AudioRecord
API 從這個音訊來源錄製時,擷取所有音訊串流的混合內容,但下列內容除外:-
AudioManager.STREAM_RING
-
AudioManager.STREAM_ALARM
-
AudioManager.STREAM_NOTIFICATION
-
5.4.4. 聲學回音消除器
如果裝置實作宣告 android.hardware.microphone
,則會執行以下操作:
- 應實作聲學回音消除器 (AEC) 技術,並在使用
AudioSource.VOICE_COMMUNICATION
擷取時,將其套用至擷取路徑,以便針對語音通訊進行調整
如果裝置實作提供的 Acoustic Echo Canceler 會在選取 AudioSource.VOICE_COMMUNICATION
時插入擷取音訊路徑,則會執行以下操作:
- [C-SR] 強烈建議您透過 AcousticEchoCanceler API 方法 AcousticEchoCanceler.isAvailable() 宣告這項資訊。
- [C-SR] 強烈建議您使用 AcousticEchoCanceler API 控制此音效。
- [C-SR] 強烈建議您透過 AudioEffect.Descriptor.uuid 欄位,為每個 AEC 技術實作項目提供唯一識別資訊。
5.4.5. 並行擷取
如果裝置實作項目宣告 android.hardware.microphone
,則必須實作並行擷取功能,如這份文件所述。具體違規事項如下:
- [C-1-1] 必須允許使用
AudioSource.VOICE_RECOGNITION
擷取的無障礙服務和至少一個使用任何AudioSource
擷取的應用程式,同時存取麥克風。 - [C-1-2] 必須允許預先安裝的應用程式 (具有 Google 助理角色) 和至少一個應用程式 (使用
AudioSource
進行擷取,但不得使用AudioSource.VOICE_COMMUNICATION
或AudioSource.CAMCORDER
) 同時存取麥克風。 - [C-1-3] 應用程式使用
AudioSource.VOICE_COMMUNICATION
或AudioSource.CAMCORDER
擷取音訊時,必須將其他應用程式的音訊擷取功能設為靜音 (輔助服務除外)。不過,如果應用程式是透過AudioSource.VOICE_COMMUNICATION
擷取,且具有CAPTURE_AUDIO_OUTPUT
權限,則其他應用程式也可以擷取語音通話。 - [C-1-4] 如果有兩個以上的應用程式同時擷取,且兩個應用程式都沒有在頂端顯示 UI,則最近開始擷取的應用程式會接收音訊。
5.4.6. 麥克風增益層級
如果裝置實作宣告 android.hardware.microphone
,則會執行以下操作:
- 應在中頻範圍內顯示大致平坦的振幅與頻率特性:具體來說,每個用於錄製語音辨識音訊來源的麥克風,在 100 Hz 到 4000 Hz 之間的頻率範圍內,應顯示 ±3dB。
- 應設定音訊輸入靈敏度,以便在 90 分貝的聲壓級別 (SPL) 下播放 1000 Hz 正弦音源,針對用於錄製語音辨識音訊來源的每個麥克風,產生 16 位元取樣率的 RMS 2500 回應 (或浮點/雙精度取樣率的 -22.35 dB 全量)。
- 強烈建議使用 [C-SR] 顯示低頻範圍的振幅等級:具體來說,從 5 Hz 到 100 Hz 的振幅等級應為 ±20 dB,而非用於錄製語音辨識音訊來源的每個麥克風的中頻範圍。
- 強烈建議使用 [C-SR] 顯示高頻範圍的振幅等級:具體來說,從 4000 Hz 到 22 KHz 的振幅等級為 ±30 dB,而每個用於錄製語音辨識音訊來源的麥克風的頻率範圍則為中頻。
5.5. 音訊播放
Android 提供支援,可讓應用程式透過音訊輸出周邊播放音訊,如第 7.8.2 節所定義。
5.5.1. 原始音訊播放
如果裝置實作宣告 android.hardware.audio.output
,則會執行以下操作:
-
[C-1-1] 必須允許播放具有下列特性的原始音訊內容:
- 來源格式:線性 PCM、16 位元、8 位元、浮點
- 聲道:單聲道、立體聲、最多 8 聲道的有效多聲道設定
-
取樣率 (以 Hz 為單位):
- 8000、11025、16000、22050、32000、44100、48000 (以上述管道設定為準)
- 單聲道和立體聲 96000
-
應允許播放具有下列特性的原始音訊內容:
- 取樣率:24000、48000
5.5.2. 音效
Android 提供音訊效果 API,供裝置實作。
如果裝置實作宣告 android.hardware.audio.output
功能,則會:
- [C-1-1] 必須支援可透過 AudioEffect 子類別
Equalizer
和LoudnessEnhancer
控制的EFFECT_TYPE_EQUALIZER
和EFFECT_TYPE_LOUDNESS_ENHANCER
實作項目。 - [C-1-2] 必須支援可透過
Visualizer
類別控制的視覺化器 API 實作。 - [C-1-3] 必須支援可透過 AudioEffect 子類別
DynamicsProcessing
控制的EFFECT_TYPE_DYNAMICS_PROCESSING
實作。 - 應支援可透過
AudioEffect
子類別BassBoost
、EnvironmentalReverb
、PresetReverb
和Virtualizer
控制的EFFECT_TYPE_BASS_BOOST
、EFFECT_TYPE_ENV_REVERB
、EFFECT_TYPE_PRESET_REVERB
和EFFECT_TYPE_VIRTUALIZER
實作項目。 - [C-SR] 強烈建議支援浮點和多通道中的效果。
5.5.3. 音訊輸出音量
汽車裝置實作方式:
- 應允許使用 AudioAttributes 定義的內容類型或用途,以及
android.car.CarAudioManager
中公開定義的車輛音訊用途,分別調整每個音訊串流的音量。
5.6. 音訊延遲
音訊延遲是指音訊訊號在系統中傳輸時的延遲時間。許多類型的應用程式都需要短延遲時間,才能實現即時音效。
本節的定義如下:
- 輸出延遲。應用程式寫入 PCM 編碼資料的時間點,與裝置端轉換器或信號透過連接埠離開裝置並可在外部觀察到的時間點之間的間隔。
- 冷輸出延遲。在音訊輸出系統閒置且在要求前關閉電源的情況下,第一個影格的輸出延遲時間。
- 連續輸出延遲時間。裝置播放音訊後,後續影格輸出延遲時間。
- 輸入延遲。環境透過裝置端轉換器或信號透過連接埠進入裝置,到應用程式讀取相應 PCM 編碼資料影格之間的間隔。
- 輸入內容遺失。輸入信號的初始部分,無法使用或無法取得。
- 冷輸入延遲。當音訊輸入系統在要求前處於閒置狀態並關閉電源時,第一個影格輸入延遲時間和輸入延遲時間的總和。
- 持續輸入延遲。裝置擷取音訊時,後續影格輸入的延遲時間。
- 冷輸出抖動。冷輸出延遲值的個別測量值之間的變異。
- 冷輸入抖動。冷輸入延遲值的個別測量值之間的變異。
- 連續往返延遲時間。連續輸入延遲時間加上連續輸出延遲時間,再加上一個緩衝區時間。緩衝期可讓應用程式處理訊號,並減少輸入和輸出串流之間的相位差異。
- OpenSL ES PCM 緩衝區佇列 API。Android NDK 中的 PCM 相關 OpenSL ES API 集。
- AAudio 原生音訊 API。Android NDK 中的 AAudio API 組合。
- 時間戳記。這組資料包含串流中的相對影格位置,以及該影格進入或離開相關端點的音訊處理管道的預估時間。另請參閱 AudioTimestamp。
- glitch。音訊訊號中的暫時中斷或錯誤取樣值,通常是因為輸出端緩衝區不足、輸入端緩衝區溢位,或任何其他數位或類比雜訊來源所致。
如果裝置實作項目宣告 android.hardware.audio.output
,則必須符合或超越下列規定:
- [C-1-1] AudioTrack.getTimestamp 和
AAudioStream_getTimestamp
傳回的輸出時間戳記精確度為 +/- 2 毫秒。 - [C-1-2] 冷啟動輸出延遲時間為 500 毫秒以下。
如果裝置實作宣告 android.hardware.audio.output
,強烈建議您符合或超越下列規定:
- [C-SR] 冷啟動輸出延遲時間為 100 毫秒以下。強烈建議目前和新款搭載此 Android 版本的裝置,現在就符合這些規定。在 2021 年後推出的平台版本中,我們將要求冷輸出延遲時間必須低於 200 毫秒。
- [C-SR] 連續輸出延遲時間為 45 毫秒或更短的時間。
- [C-SR] 盡量減少冷輸出抖動。
- [C-SR] AudioTrack.getTimestamp 和
AAudioStream_getTimestamp
傳回的輸出時間戳記精確度為 +/- 1 毫秒。
如果裝置實作符合上述要求,在任何初始校正作業完成後,同時使用 OpenSL ES PCM 緩衝區佇列和 AAudio 原生音訊 API,針對至少一項支援的音訊輸出裝置,持續輸出延遲和冷輸出延遲如下:
- [C-SR] 強烈建議您宣告
android.hardware.audio.low_latency
功能旗標,以便回報低延遲音訊。 - [C-SR] 強烈建議您透過 AAudio API 滿足低延遲音訊的相關需求。
- [C-SR] 強烈建議您確保從
AAudioStream_getPerformanceMode()
傳回AAUDIO_PERFORMANCE_MODE_LOW_LATENCY
的串流,AAudioStream_getFramesPerBurst()
傳回的值小於或等於android.media.AudioManager.getProperty(String)
針對屬性鍵AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER
傳回的值。
如果裝置實作不符合透過 OpenSL ES PCM 緩衝區佇列和 AAudio 原生音訊 API 提供低延遲音訊的要求,則會發生以下情況:
- [C-2-1] 請勿回報支援低延遲音訊。
如果裝置實作內容包含 android.hardware.microphone
,則必須符合下列輸入音訊規定:
- [C-3-1] 將 AudioRecord.getTimestamp 或
AAudioStream_getTimestamp
傳回的輸入時間戳記誤差限制在 +/- 2 毫秒內。此處的「誤差」是指與正確值的偏差。 - [C-3-2] 冷啟動輸入延遲時間為 500 毫秒以下。
如果裝置實作內容包含 android.hardware.microphone
,強烈建議您遵守下列輸入音訊規定:
- [C-SR] 冷啟動輸入延遲時間為 100 毫秒以下。強烈建議目前和新款搭載此 Android 版本的裝置,現在就符合這些規定。在 2021 年推出的後續平台版本中,我們將要求冷輸入延遲時間必須低於 200 毫秒。
- [C-SR] 連續輸入延遲時間為 30 毫秒或更短。
- [C-SR] 連續往返延遲時間為 50 毫秒或更短。
- [C-SR] 盡量減少冷輸入抖動。
- [C-SR] 將 AudioRecord.getTimestamp 或
AAudioStream_getTimestamp
傳回的輸入時間戳記誤差限制在 +/- 1 毫秒內。
5.7. 網路通訊協定
裝置實作方式必須支援 Android SDK 說明文件中指定的媒體網路通訊協定,以便播放音訊和影片。
如果裝置實作包含音訊或視訊解碼器,則必須符合下列規定:
-
[C-1-1] 必須透過 HTTP(S) 支援第 5.1 節中所有必要的編解碼和容器格式。
-
[C-1-2] 必須支援下方媒體區段格式表格中列出的媒體區段格式,並採用 HTTP 即時串流草稿通訊協定第 7 版。
-
[C-1-3] 必須支援下列 RTSP 表格中的 RTP 音訊/視訊設定檔和相關編解碼。如需例外狀況,請參閱第 5.1 節中的表格附註。
媒體區段格式
區隔格式 | 參考資料 | 必要的轉碼器支援 |
---|---|---|
MPEG-2 傳輸串流 | ISO 13818 |
影片編碼器:
和 MPEG-2,請參閱 第 5.1.3 節。 音訊轉碼器:
|
AAC 搭配 ADTS 框架和 ID3 標記 | ISO 13818-7 | 如要進一步瞭解 AAC 及其變化版本,請參閱第 5.1.1 節 |
WebVTT | WebVTT |
RTSP (RTP、SDP)
設定檔名稱 | 參考資料 | 必要的轉碼器支援 |
---|---|---|
H264 AVC | RFC 6184 | 如要進一步瞭解 H264 AVC,請參閱第 5.1.3 節。 |
MP4A-LATM | RFC 6416 | 如要進一步瞭解 AAC 及其變化版本,請參閱第 5.1.1 節 |
H263-1998 |
RFC 3551 RFC 4629 RFC 2190 |
如要進一步瞭解 H263,請參閱第 5.1.3 節。 |
H263-2000 | RFC 4629 | 如要進一步瞭解 H263,請參閱第 5.1.3 節。 |
AMR | RFC 4867 | 如要瞭解 AMR-NB 的詳細資訊,請參閱第 5.1.1 節。 |
AMR-WB | RFC 4867 | 如要瞭解 AMR-WB 的詳細資訊,請參閱第 5.1.1 節。 |
MP4V-ES | RFC 6416 | 如要進一步瞭解 MPEG-4 SP,請參閱 第 5.1.3 節。 |
mpeg4-generic | RFC 3640 | 如要進一步瞭解 AAC 及其變化版本,請參閱第 5.1.1 節 |
MP2T | RFC 2250 | 詳情請參閱 HTTP 即時串流下方的「MPEG-2 傳輸串流」 |
5.8. 安全無虞的媒體服務
如果裝置實作支援安全視訊輸出,且能夠支援安全途徑,則會:
- [C-1-1] 必須宣告支援
Display.FLAG_SECURE
。
如果裝置實作宣告支援 Display.FLAG_SECURE
並支援無線螢幕顯示通訊協定,則會:
- [C-2-1] 對於透過 Miracast 等無線通訊協定連接的螢幕,必須使用 HDCP 2.x 以上版本的加密機制來保護連結。
如果裝置實作宣告支援 Display.FLAG_SECURE
且支援有線外接螢幕,則會:
- [C-3-1] 透過使用者可存取的有線埠連接的所有外接螢幕,都必須支援 HDCP 1.2 以上版本。
5.9. 樂器數位介面 (MIDI)
如果裝置實作項目透過 android.content.pm.PackageManager
類別回報支援 android.software.midi
功能,則會:
-
[C-1-1] 必須支援 MIDI 透過所有 MIDI 硬體傳輸裝置,這些傳輸裝置提供一般非 MIDI 連線功能,包括:
-
[C-1-2] 必須支援應用程式間的 MIDI 軟體傳輸 (虛擬 MIDI 裝置)
-
[C-1-3] 必須包含 libamidi.so (原生 MIDI 支援)
-
應支援 MIDI 透過 USB 周邊模式,第 7.7 節
5.10. 專業音訊
如果裝置實作項目透過 android.content.pm.PackageManager 類別回報支援 android.hardware.audio.pro
功能,則會:
- [C-1-1] 必須回報支援功能
android.hardware.audio.low_latency
。 - [C-1-2] 必須在 5.6 節音訊延遲中定義的持續性往返音訊延遲時間,必須為 20 毫秒以下,且應在至少一個支援的路徑中為 10 毫秒以下。
- [C-1-3] 必須提供支援 USB 主機模式和 USB 周邊模式的 USB 連接埠。
- [C-1-4] 必須回報支援功能
android.software.midi
。 - [C-1-5] 必須同時使用 OpenSL ES PCM 緩衝區佇列 API 和至少一個 AAudio 原生音訊 API 路徑,以符合延遲和 USB 音訊需求。
- [SR] 強烈建議使用 AAudio 原生音訊 API 透過 MMAP 路徑,以符合延遲和 USB 音訊需求。
- [C-1-6] 冷啟動輸出延遲時間不得超過 200 毫秒。
- [C-1-7] 冷輸入延遲時間不得超過 200 毫秒。
- [SR] 強烈建議在音訊處於活動狀態且 CPU 負載有所變化時,提供一致的 CPU 效能。請使用 SynthMark 的 Android 應用程式版本進行測試,其提交 ID 為 09b13c6f49ea089f8c31e5d035f912cc405b7ab8。SynthMark 會使用在模擬音訊架構上執行的軟體合成器,用於評估系統效能。您必須使用「自動化測試」選項執行 SynthMark 應用程式,並取得下列結果:
- voicemark.90 >= 32 voices
- latencymark.fixed.little <= 15 毫秒
- latencymark.dynamic.little <= 50 毫秒
請參閱 SynthMark 說明文件,瞭解基準測試。
- 應盡量減少音訊時鐘不準確和相對於標準時間的誤差。
- 在 CPU
CLOCK_MONOTONIC
和音訊時鐘同時運作時,應盡量減少音訊時鐘漂移。 - 應盡量縮短裝置端轉換器的音訊延遲時間。
- 應盡量減少透過 USB 數位音訊傳輸的音訊延遲時間。
- 應記錄所有路徑的音訊延遲時間測量結果。
- 應盡量減少音訊緩衝區完成回呼的輸入時間抖動,因為這會影響回呼所使用的 CPU 頻寬百分比。
- 在正常使用情況下,應在回報的延遲時間內提供零音訊錯誤。
- 應提供零的管道間延遲差異。
- 應盡量縮短所有傳輸方式的 MIDI 平均延遲時間。
- 應盡量減少所有傳輸途徑下負載 (抖動) 下的 MIDI 延遲變化。
- 應在所有傳輸途徑中提供準確的 MIDI 時間戳記。
- 應盡量減少裝置端轉換器的音訊信號雜訊,包括冷啟動後的一段時間。
- 在兩者皆處於啟用狀態時,應在對應端點的輸入和輸出端提供零音訊時鐘差。對應的端點範例包括裝置上的麥克風和喇叭,或音訊插孔輸入和輸出。
- 在同一個執行緒上,當輸入和輸出端的對應端點都處於活動狀態時,應處理音訊緩衝區完成回呼,並在輸入回呼傳回後立即進入輸出回呼。或者,如果無法在同一個執行緒上處理回呼,請在輸入回呼後立即輸入輸出回呼,讓應用程式在輸入和輸出端保持一致的時間。
- 應盡量減少 HAL 音訊緩衝區與對應端點輸入和輸出端的相位差異。
- 應盡量縮短觸控延遲時間。
- 應盡量減少負載下觸控延遲時間的變化 (抖動)。
- 觸控輸入到音訊輸出的延遲時間應小於或等於 40 毫秒。
如果裝置實作符合上述所有規定,則必須:
- [SR] 強烈建議您透過
android.content.pm.PackageManager
類別回報支援功能android.hardware.audio.pro
。
如果裝置實作包含 4 導體 3.5 公釐音訊插孔,則應符合下列條件:
- [C-2-1] 音訊插孔路徑的持續往返音訊延遲時間不得超過 20 毫秒。
- [SR] 強烈建議您遵循有線音訊耳機規格 (第 1.1 版)的「行動裝置 (插孔) 規格」部分。
- 音訊插孔路徑的持續往返音訊延遲時間應不超過 10 毫秒。
如果裝置實作項目省略 4 導體 3.5 公釐耳機插孔,並包含支援 USB 主機模式的 USB 連接埠,則:
- [C-3-1] 必須實作 USB 音訊類別。
- [C-3-2] 必須透過 USB 音訊類別,在 USB 主機模式連接埠上維持 20 毫秒或更短的音訊往返延遲時間。
- 使用 USB 音訊類別的 USB 主機模式通訊埠,持續往返音訊延遲時間應不超過 10 毫秒。
- [C-SR] 強烈建議在與支援這些需求的 USB 音訊外接裝置搭配使用時,同時支援每個方向最多 8 個通道的 I/O、96 kHz 取樣率和 24 位元或 32 位元深度。
如果裝置實作包含 HDMI 連接埠,則必須符合下列條件:
- 應支援以 20 位元或 24 位元深度和 192 kHz 的立體聲和八聲道輸出,且至少在一個設定中不損失位元深度或重新取樣。
5.11. 未處理的擷取畫面
Android 支援透過 android.media.MediaRecorder.AudioSource.UNPROCESSED
音訊來源錄製未經處理的音訊。在 OpenSL ES 中,您可以使用錄音預設值 SL_ANDROID_RECORDING_PRESET_UNPROCESSED
存取。
如果裝置實作意圖支援未經處理的音訊來源,並將其提供給第三方應用程式,則應:
-
[C-1-1] 必須透過
android.media.AudioManager
屬性 PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED 回報支援資訊。 -
[C-1-2] 必須在中頻範圍中顯示大致平坦的振幅與頻率特性:具體來說,每個用於錄製未經處理音訊來源的麥克風,在 100 Hz 至 7000 Hz 之間的振幅與頻率特性必須為 ±10 dB。
-
[C-1-3] 必須顯示低頻範圍的振幅等級:具體來說,從 5 Hz 到 100 Hz 的 ±20 dB 與用於錄製未經處理音訊來源的每個麥克風的中頻範圍相比。
-
[C-1-4] 必須顯示高頻率範圍的振幅等級:具體來說,從 7000 Hz 到 22 KHz 的振幅等級,必須與用於錄製未經處理音訊來源的每個麥克風的中頻範圍相符,且相差不得超過 ±30 dB。
-
[C-1-5] 必須設定音訊輸入靈敏度,以便在使用每個麥克風錄製未經處理的音訊來源時,以 94 dB 的聲壓級 (SPL) 播放 1000 Hz 正弦音源,產生 16 位元取樣 RMS 值 520 (或浮點/雙精度取樣值 -36 dB 全量) 的回應。
-
[C-1-6] 每個用於錄製未經處理音訊來源的麥克風,信噪比 (SNR) 必須達到 60 dB 以上。(而 SNR 是指 94 dB SPL 與等效 SPL 的差異,以 A 加權方式計算)。
-
[C-1-7] 每個用於錄製未經處理音訊來源的麥克風,在 90 dB SPL 輸入音量下,總諧波失真 (THD) 不得超過 1%。
-
除了將音量調整至所需範圍的音量乘數之外,路徑中不得有任何其他訊號處理 (例如自動增益控制、高通濾波器或回音消除)。換句話說:
- [C-1-8] 如果架構中因任何原因出現任何信號處理,則必須停用,並有效地為信號路徑引入零延遲或額外延遲。
- [C-1-9] 允許在路徑中使用音量調節器,但絕對不得導致信號路徑延遲或延遲。
所有 SPL 測量皆直接在測試中的麥克風旁進行。如果是多個麥克風設定,則這些規定適用於每個麥克風。
如果裝置實作宣告 android.hardware.microphone
,但不支援未經處理的音訊來源,則會發生以下情況:
- [C-2-1] 必須針對
AudioManager.getProperty(PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED)
API 方法傳回null
,以便正確指出缺乏支援。 - 我們仍強烈建議使用 [SR],以滿足未經處理錄音來源的信號路徑的許多要求。
6. 開發人員工具和選項相容性
6.1. 開發人員工具
裝置實作方式:
- [C-0-1] 必須支援 Android SDK 提供的 Android 開發人員工具。
-
- [C-0-2] 必須支援 Android SDK 說明中的 ADB 和 AOSP 提供的殼層指令,這些指令可供應用程式開發人員使用,包括
dumpsys
cmd stats
- [C-0-11] 必須支援殼層指令
cmd testharness
。從未提供持續性資料區塊的舊版 Android 升級裝置實作項目,可能會從 C-0-11 中豁免。 - [C-0-3] 不得透過 dumpsys 指令記錄的裝置系統事件 (batterystats、diskstats、fingerprint、graphicsstats、netstats、notification、procstats) 變更格式或內容。
- [C-0-10] 必須記錄下列事件,且不得遺漏,並讓
cmd stats
殼層指令和StatsManager
System API 類別能夠存取這些事件。- ActivityForegroundStateChanged
- AnomalyDetected
- AppBreadcrumbReported
- AppCrashOccurred
- AppStartOccurred
- BatteryLevelChanged
- BatterySaverModeStateChanged
- BleScanResultReceived
- BleScanStateChanged
- ChargingStateChanged
- DeviceIdleModeStateChanged
- ForegroundServiceStateChanged
- GpsScanStateChanged
- JobStateChanged
- PluggedStateChanged
- ScheduledJobStateChanged
- ScreenStateChanged
- SyncStateChanged
- SystemElapsedRealtime
- UidProcessStateChanged
- WakelockStateChanged
- WakeupAlarmOccurred
- WifiLockStateChanged
- WifiMulticastLockStateChanged
- WifiScanStateChanged
- [C-0-4] 裝置端 ADB 守護程序必須預設為停用,且必須提供使用者可存取的機制,以便開啟 Android 偵錯橋接器。
- [C-0-5] 必須支援安全的 ADB。Android 支援安全的 ADB。安全的 ADB 可在已知的已驗證主機上啟用 ADB。
- [C-0-6] 必須提供機制,允許從主機連線至 ADB。具體違規事項如下:
如果沒有 USB 連接埠的裝置實作項目支援周邊模式,則會發生以下情況:
- [C-3-1] 必須透過區域網路 (例如乙太網路或 Wi-Fi) 實作 ADB。
- [C-3-2] 必須提供 Windows 7、8 和 10 的驅動程式,讓開發人員可以使用 ADB 通訊協定連線至裝置。
如果裝置實作項目支援透過 Wi-Fi 連線至主機電腦的 ADB 連線,則會:
- [C-4-1]
AdbManager#isAdbWifiSupported()
方法務必傳回true
。
如果裝置實作支援透過 Wi-Fi 連線至主機的 ADB 連線,且包含至少一個相機,則:
- [C-5-1]
AdbManager#isAdbWifiQrSupported()
方法必須傳回true
。
- [C-0-2] 必須支援 Android SDK 說明中的 ADB 和 AOSP 提供的殼層指令,這些指令可供應用程式開發人員使用,包括
-
- [C-0-7] 必須支援 Android SDK 說明文件中所述的所有 ddms 功能。由於 ddm 使用 adb,因此 ddm 的支援功能應預設為停用,但在使用者啟用 Android Debug Bridge 時,必須支援 ddm,如上所述。
-
Monkey
- [C-0-8] 必須包含 Monkey 架構,並讓應用程式可使用該架構。
-
SysTrace
- [C-0-9] 必須支援 Android SDK 中的 systrace 工具。根據預設,Systrace 必須處於停用狀態,且必須提供使用者可存取的機制來開啟 Systrace。
-
Perfetto
- [C-SR] 強烈建議您將
/system/bin/perfetto
二進位檔公開給殼層使用者,該使用者可透過 cmdline 遵循 Perfetto 說明文件。 - [C-SR] 強烈建議您在輸入時,讓 Perfetto 二進位檔接受符合 Perfetto 說明文件中定義的結構定義的 protobuf 設定。
- [C-SR] 強烈建議您使用 Perfetto 二進位檔,以符合 Perfetto 說明文件中定義的結構定義,輸出符合規範的 protobuf 追蹤記錄。
- [C-SR] 強烈建議您透過 Perfeto 二進位檔提供至少 Perfeto 說明文件中所述的資料來源。
- [C-SR] 強烈建議您將
- 記憶體不足終止工具
-
測試控管工具模式 如果裝置實作支援 shell 指令
cmd testharness
並執行cmd testharness enable
,則會:- [C-2-1] 必須為
ActivityManager.isRunningInUserTestHarness()
傳回true
- [C-2-2] 必須按照「測試控管工具模式說明文件」所述實作測試控管工具模式。
- [C-2-1] 必須為
如果裝置實作項目透過 android.hardware.vulkan.version
功能旗標回報支援 Vulkan 1.0 以上版本,則會:
- [C-1-1] 應用程式開發人員必須能啟用/停用 GPU 偵錯圖層。
- [C-1-2] 必須在啟用 GPU 偵錯層時,列舉可偵錯應用程式基礎目錄中外部工具 (即不屬於平台或應用程式套件的部分) 提供的程式庫中的層,以支援 vkEnumerateInstanceLayerProperties() 和 vkCreateInstance() API 方法。
6.2. 開發人員選項
Android 提供開發人員可用來設定應用程式開發相關設定的支援功能。
裝置實作方式必須為開發人員選項提供一致的體驗,包括:
- [C-0-1] 必須遵循 android.settings.APPLICATION_DEVELOPMENT_SETTINGS 意圖,才能顯示應用程式開發相關設定。上游 Android 實作項目會預設隱藏「開發人員選項」選單,使用者只要依序輕觸「設定」 >「關於裝置」 >「版本號碼」選單項目七 (7) 次,即可啟動「開發人員選項」。
- [C-0-2] 必須預設隱藏開發人員選項。
- [C-0-3] 必須提供明確的機制,確保使用者在啟用開發人員選項時,不會偏袒某個第三方應用程式。必須提供可公開瀏覽的文件或網站,說明如何啟用開發人員選項。這份文件或網站必須可從 Android SDK 文件連結。
- 啟用開發人員選項且使用者安全有疑慮時,應向使用者顯示持續性的視覺通知。
- 可透過視覺隱藏或停用選單,暫時限制存取開發人員選項選單,以免在使用者安全性有疑慮的情況下造成干擾。
7. 硬體相容性
如果裝置包含特定硬體元件,且該元件有對應的 API 供第三方開發人員使用:
- [C-0-1] 裝置實作項目必須實作 Android SDK 說明文件中所述的 API。
如果 SDK 中的 API 與硬體元件互動,而該硬體元件為選用元件,且裝置實作不含該元件:
- [C-0-2] 您仍必須提供元件 API 的完整類別定義 (如 SDK 所述)。
- [C-0-3] API 的行為必須以某種合理的方式實作為無作業。
- [C-0-4] 在 SDK 說明文件允許的情況下,API 方法必須傳回空值。
- [C-0-5] API 方法必須傳回類別的無操作導入方式,因為 SDK 說明文件不允許空值。
- [C-0-6] API 方法不得擲回 SDK 說明文件未記錄的例外狀況。
- [C-0-7] 裝置實作項目必須針對相同的建構指紋,透過 android.content.pm.PackageManager 類別的
getSystemAvailableFeatures()
和hasSystemFeature(String)
方法,一貫回報正確的硬體設定資訊。
電話 API 就是適用這些規定的典型情境:即使是在非手機裝置上,這些 API 也必須以合理的無作業方式實作。
7.1. 顯示和圖形
Android 內建的設施可自動調整應用程式素材資源和 UI 版面配置,以便在各種硬體設定中順利執行第三方應用程式。在所有第三方 Android 相容應用程式都能執行的 Android 相容螢幕上,裝置實作方式必須正確實作這些 API 和行為,詳情請參閱本節。
本節中所參照的單位定義如下:
- 實體對角尺寸。螢幕照明部分兩個相對角落之間的距離,以英寸為單位。
- 每英寸像素數 (dpi)。以 1 英寸的線性橫向或縱向跨距所涵蓋的像素數量。如果列出 dpi 值,橫向和縱向 dpi 都必須落在範圍內。
- 顯示比例。螢幕長邊和短邊像素的比例。舉例來說,如果螢幕解析度為 480x854 像素,則寬高比為 854/480 = 1.779,或大約為「16:9」。
- 密度獨立像素 (dp)。虛擬像素單位已歸一化為 160 dpi 螢幕,計算方式如下:pixels = dps * (density/160)。
7.1.1. 螢幕設定
7.1.1.1. 螢幕大小和形狀
Android UI 架構支援各種邏輯螢幕版面配置大小,並允許應用程式透過 Configuration.screenLayout
搭配 SCREENLAYOUT_SIZE_MASK
和 Configuration.smallestScreenWidthDp
,查詢目前設定的螢幕版面配置大小。
裝置實作方式:
-
[C-0-1] 必須依照 Android SDK 說明文件中定義的內容,回報
Configuration.screenLayout
的正確版面配置大小。具體來說,裝置實作方式必須回報正確的邏輯密度獨立像素 (dp) 螢幕尺寸,如下所示:- 如果裝置的
Configuration.uiMode
設為 UI_MODE_TYPE_WATCH 以外的任何值,並回報Configuration.screenLayout
的small
大小,則該裝置必須至少有 426 dp x 320 dp。 - 回報
Configuration.screenLayout
normal
大小的裝置,必須至少有 480 dp x 320 dp。 - 回報
Configuration.screenLayout
large
大小的裝置,必須至少有 640 dp x 480 dp。 - 回報
Configuration.screenLayout
xlarge
大小的裝置,必須至少有 960 dp x 720 dp。
- 如果裝置的
-
[C-0-2] 必須正確遵循應用程式在 AndroidManifest.xml 中宣稱的螢幕尺寸支援情形,如 Android SDK 文件所述。<
supports-screens
> -
可使用圓角設計的 Android 相容螢幕。
如果裝置實作支援 UI_MODE_TYPE_NORMAL
,且包含與 Android 相容的圓角螢幕,則:
- [C-1-1] 必須確保至少符合下列其中一項規定:
- 圓角半徑小於或等於 38 dp。
-
當 15 x 15 個 dp 大小的方塊錨定在邏輯螢幕的每個角落時,每個方塊至少會在螢幕上顯示一個像素。
-
應提供使用者操作提示,讓使用者切換至具有矩形角落的顯示模式。
如果裝置實作包含可折疊的 Android 相容螢幕,或在多個顯示面板之間加入折疊式轉軸,並讓這類螢幕能夠算繪第三方應用程式,則這些裝置:
- [C-2-1] 必須實作最新的 extensions API 穩定版,或 sidecar API 穩定版,以供 Window Manager Jetpack 程式庫使用。
如果裝置實作項目包含可折疊的 Android 相容螢幕,或是在多個顯示面板之間設有折疊式轉軸,且轉軸或折疊處橫跨全螢幕應用程式視窗,則:
- [C-3-1] 必須透過擴充功能或 sidecar API 向應用程式回報摺疊或折疊的邊緣位置、邊界和狀態。
如要進一步瞭解如何正確實作 Sidecar 或擴充功能 API,請參閱 Window Manager Jetpack 的公開說明文件。
7.1.1.2. 螢幕顯示比例
雖然 Android 相容螢幕的實體螢幕顯示比例沒有限制,但在轉譯第三方應用程式的邏輯螢幕顯示比例(可從透過 view.Display
API 和 Configuration API 回報的高度和寬度值推算而得) 必須符合下列規定:
-
[C-0-1] 如果裝置實作項目的
Configuration.uiMode
設為UI_MODE_TYPE_NORMAL
,則顯示比例值必須小於或等於 1.86 (約 16:9),除非應用程式符合下列任一條件:- 應用程式已透過
android.max_aspect
中繼資料值宣告支援較大的螢幕顯示比例。 - 應用程式會透過 android:resizeableActivity 屬性宣告可調整大小。
- 應用程式指定的 API 級別為 24 以上,且未宣告會限制允許顯示比例的
android:maxAspectRatio
。
- 應用程式已透過
-
[C-0-2] 如果裝置實作項目將
Configuration.uiMode
設為UI_MODE_TYPE_NORMAL
,則顯示比例值必須大於或等於 1.3333 (4:3),除非應用程式可在符合下列任一條件時拉寬顯示比例:- 應用程式會透過 android:resizeableActivity 屬性宣告可調整大小。
- 應用程式會宣告
android:minAspectRatio
,限制允許的顯示比例。
-
[C-0-3] 將
Configuration.uiMode
設為UI_MODE_TYPE_WATCH
的裝置實作項目,其顯示比例值必須設為 1.0 (1:1)。
7.1.1.3. 螢幕密度
Android UI 架構定義了一組標準邏輯密度,協助應用程式開發人員指定應用程式資源。
-
[C-0-1] 根據預設,裝置實作必須透過
DENSITY_DEVICE_STABLE
API 回報DisplayMetrics
上列出的其中一個 Android 架構密度,且此值不得隨時變更;不過,裝置可能會根據使用者在初始啟動後所做的顯示設定變更 (例如顯示大小),回報不同的任意密度。 -
裝置實作項目應定義標準 Android 架構密度,這個密度應在數值上最接近螢幕的實體密度,除非這個邏輯密度會使回報的螢幕大小低於最低支援值。如果標準 Android 架構密度與實體密度數值最接近,但導致螢幕大小小於最小支援的相容螢幕大小 (320 dp 寬度),則裝置實作應回報下一個較低的標準 Android 架構密度。
如果有可用途徑可變更裝置的顯示大小:
- [C-1-1] 顯示大小不得大於原生密度的 1.5 倍,或產生小於 320dp (等同於資源限定詞 sw320dp) 的有效螢幕尺寸,以先到者為準。
- [C-1-2] 顯示器大小不得縮放至低於原生密度的 0.85 倍。
- 為確保良好的可用性和一致的字型大小,建議您提供下列原生顯示選項的縮放比例 (同時遵守上述限制)
- 小:0.85 倍
- 預設值:1x (原生顯示比例)
- 大:1.15 倍
- 較大:1.3 倍
- 最大 1.45 倍
7.1.2. 顯示指標
如果裝置實作內容包含 Android 相容的螢幕或將影片輸出至 Android 相容的螢幕,則必須符合下列條件:
- [C-1-1] 必須針對
android.util.DisplayMetrics
API 中定義的所有 Android 相容顯示指標,回報正確的值。
如果裝置實作內容不包含內嵌螢幕或影片輸出內容,則會發生以下情況:
- [C-2-1] 針對模擬的預設
view.Display
,必須回報 Android 相容螢幕的正確值,如android.util.DisplayMetrics
API 中所定義。
7.1.3. 螢幕方向
裝置實作方式:
- [C-0-1] 必須回報支援的螢幕方向 (
android.hardware.screen.portrait
和/或android.hardware.screen.landscape
),且必須回報至少一種支援的方向。舉例來說,如果裝置的螢幕方向固定為橫向 (例如電視或筆電),則應僅回報android.hardware.screen.landscape
。 - [C-0-2] 無論何時透過
android.content.res.Configuration.orientation
、android.view.Display.getOrientation()
或其他 API 查詢,都必須回報裝置目前的正確方向值。
如果裝置實作支援這兩種螢幕方向,則會:
- [C-1-1] 應用程式必須支援動態螢幕方向,也就是可切換為直向或橫向。也就是說,裝置必須遵循應用程式要求的特定螢幕方向。
- [C-1-2] 變更螢幕方向時,不得變更回報的螢幕大小或密度。
- 可選用直向或橫向方向做為預設。
7.1.4. 2D 和 3D 圖形加速功能
7.1.4.1 OpenGL ES
裝置實作方式:
- [C-0-1] 必須透過受管理的 API (例如透過
GLES10.getString()
方法) 和原生 API,正確識別支援的 OpenGL ES 版本 (1.1、2.0、3.0、3.1、3.2)。 - [C-0-2] 必須針對所支援的每個 OpenGL ES 版本,提供所有對應的受管理 API 和原生 API 支援。
如果裝置實作包含螢幕或影片輸出,則必須符合下列條件:
- [C-1-1] 必須同時支援 OpenGL ES 1.1 和 2.0,如 Android SDK 說明文件所述及詳述。
- [C-SR] 強烈建議支援 OpenGL ES 3.1。
- 應支援 OpenGL ES 3.2。
如果裝置實作項目支援任何 OpenGL ES 版本,則會:
- [C-2-1] 必須透過 OpenGL ES 管理 API 和原生 API 回報已實作的任何其他 OpenGL ES 擴充功能,反之,則不得回報不支援的擴充功能字串。
- [C-2-2] 必須支援
EGL_KHR_image
、EGL_KHR_image_base
、EGL_ANDROID_image_native_buffer
、EGL_ANDROID_get_native_client_buffer
、EGL_KHR_wait_sync
、EGL_KHR_get_all_proc_addresses
、EGL_ANDROID_presentation_time
、EGL_KHR_swap_buffers_with_damage
、EGL_ANDROID_recordable
和EGL_ANDROID_GLES_layers
擴充功能。 - [C-SR] 強烈建議支援
EGL_KHR_partial_update
和OES_EGL_image_external
擴充功能。 - 應透過
getString()
方法,準確回報任何支援的紋理壓縮格式,這通常是特定供應商的格式。
如果裝置實作宣告支援 OpenGL ES 3.0、3.1 或 3.2,則會:
- [C-3-1] 除了 libGLESv2.so 程式庫中的 OpenGL ES 2.0 函式符號外,您必須為這些版本匯出相應的函式符號。
- [SR] 強烈建議支援
OES_EGL_image_external_essl3
擴充功能。
如果裝置實作項目支援 OpenGL ES 3.2,則會:
- [C-4-1] 必須完整支援 OpenGL ES Android 擴充套件。
如果裝置實作項目支援 OpenGL ES Android 擴充套件的完整內容,則:
- [C-5-1] 必須透過
android.hardware.opengles.aep
功能旗標識別支援。
如果裝置實作作業公開支援 EGL_KHR_mutable_render_buffer
擴充功能,則會:
- [C-6-1] 也必須支援
EGL_ANDROID_front_buffer_auto_refresh
擴充功能。
7.1.4.2 Vulkan
Android 支援 Vulkan,這是一款用於高效能 3D 圖形的低成本跨平台 API。
如果裝置實作項目支援 OpenGL ES 3.1,則會:
- [SR] 強烈建議納入對 Vulkan 1.1 的支援。
如果裝置實作包含螢幕或影片輸出,則必須符合下列條件:
- 應支援 Vulkan 1.1。
Vulkan dEQP 測試會分割為多個測試清單,每個清單都會與相關日期/版本建立關聯。這些檔案位於 external/deqp/android/cts/main/vk-master-YYYY-MM-DD.txt
的 Android 原始碼樹中。如果裝置支援自報級別的 Vulkan,表示裝置可通過所有測試清單中的 dEQP 測試,且可通過的級別為此級別或更早。
如果裝置實作項目支援 Vulkan 1.0 以上版本,則會:
- [C-1-1] 必須使用
android.hardware.vulkan.level
和android.hardware.vulkan.version
功能旗標回報正確的整數值。 - [C-1-2] 必須為 Vulkan 原生 API
vkEnumeratePhysicalDevices()
列舉至少一個VkPhysicalDevice
。 - [C-1-3] 必須針對每個列舉的
VkPhysicalDevice
完全實作 Vulkan 1.0 API。 - [C-1-4] 您必須透過 Vulkan 原生 API
vkEnumerateInstanceLayerProperties()
和vkEnumerateDeviceLayerProperties()
,列舉應用程式套件原生資料庫目錄中名為libVkLayer*.so
的原生資料庫所包含的圖層。 - [C-1-5] 除非應用程式已將
android:debuggable
屬性設為true
,否則不得列舉應用程式套件以外的程式庫所提供的圖層,或提供其他追蹤或攔截 Vulkan API 的方法。 - [C-1-6] 必須透過 Vulkan 原生 API 回報所有支援的擴充功能字串,反之,則不得回報不支援的擴充功能字串。
- [C-1-7] 必須支援 VK_KHR_surface、VK_KHR_android_surface、VK_KHR_swapchain 和 VK_KHR_incremental_present 擴充功能。
- [C-1-8] 必須透過
android.software.vulkan.deqp.level
功能旗標回報 Vulkan dEQP 測試支援的最高版本。 - [C-1-9] 必須至少支援
132317953
版本 (自 2019 年 3 月 1 日起),如android.software.vulkan.deqp.level
功能旗標所述。 - [C-1-10] 必須在
132317953
版本和android.software.vulkan.deqp.level
功能旗標中指定的版本之間,通過測試清單中的所有 Vulkan dEQP 測試。 - [C-SR] 強烈建議支援 VK_KHR_driver_properties 和 VK_GOOGLE_display_timing 擴充功能。
如果裝置實作項目不支援 Vulkan 1.0,則會發生以下情況:
- [C-2-1] 請勿宣告任何 Vulkan 功能旗標 (例如
android.hardware.vulkan.level
、android.hardware.vulkan.version
)。 - [C-2-2] 不得為 Vulkan 原生 API
vkEnumeratePhysicalDevices()
列舉任何VkPhysicalDevice
。
如果裝置實作包含 Vulkan 1.1 的支援,並宣告任何 Vulkan 功能旗標,則會:
- [C-3-1] 必須公開支援
SYNC_FD
外部訊號量和句柄類型,以及VK_ANDROID_external_memory_android_hardware_buffer
擴充功能。
7.1.4.3 RenderScript
- [C-0-1] 裝置實作方式必須支援 Android RenderScript,詳情請參閱 Android SDK 說明文件。
7.1.4.4 2D 圖形加速
Android 提供一種機制,可讓應用程式宣告要在應用程式、活動、視窗或 View 層級為 2D 圖形啟用硬體加速功能,方法是使用資訊清單標記 android:hardwareAccelerated 或直接 API 呼叫。
裝置實作方式:
- [C-0-1] 必須預設啟用硬體加速功能,且如果開發人員要求,則必須停用硬體加速功能,方法是將 android:hardwareAccelerated 設為「false」,或直接透過 Android View API 停用硬體加速功能。
- [C-0-2] 必須顯示與 Android SDK 說明文件一致的硬體加速行為。
Android 包含 TextureView 物件,可讓開發人員直接將硬體加速的 OpenGL ES 材質整合為 UI 階層中的算繪目標。
裝置實作方式:
- [C-0-3] 必須支援 TextureView API,且必須與上游 Android 實作項目的行為一致。
7.1.4.5 廣色域螢幕
如果裝置實作項目透過 Configuration.isScreenWideColorGamut()
聲稱支援廣色域螢幕,則會:
- [C-1-1] 螢幕必須經過色彩校正。
- [C-1-2] 螢幕的色域必須涵蓋 CIE 1931 xyY 色域中的完整 sRGB 色域。
- [C-1-3] 螢幕的色域範圍必須至少涵蓋 CIE 1931 xyY 空間的 90% DCI-P3。
- [C-1-4] 必須支援 OpenGL ES 3.1 或 3.2,並正確回報。
- [C-1-5] 必須宣傳支援
EGL_KHR_no_config_context
、EGL_EXT_pixel_format_float
、EGL_KHR_gl_colorspace
、EGL_EXT_gl_colorspace_scrgb
、EGL_EXT_gl_colorspace_scrgb_linear
、EGL_EXT_gl_colorspace_display_p3
、EGL_EXT_gl_colorspace_display_p3_linear
和EGL_EXT_gl_colorspace_display_p3_passthrough
擴充功能。 - [C-SR] 強烈建議支援
GL_EXT_sRGB
。
相反地,如果裝置實作不支援廣色域螢幕,則會發生以下情況:
- [C-2-1] 應涵蓋 CIE 1931 xyY 色域中 100% 以上的 sRGB,但畫面色彩範圍未定義。
7.1.5. 舊版應用程式相容性模式
Android 會指定「相容模式」,其中架構會以「正常」螢幕大小等效 (320 dp 寬度) 模式運作,以利舊版應用程式 (非針對舊版 Android 開發,且不支援螢幕大小獨立性)。
7.1.6. 螢幕技術
Android 平台包含 API,可讓應用程式在 Android 相容螢幕上算繪豐富的圖形。除非本文件特別允許,否則裝置必須支援 Android SDK 定義的所有 API。
裝置實作項目的所有 Android 相容螢幕:
- [C-0-1] 必須能夠算繪 16 位元色彩圖形。
- 應支援可顯示 24 位元色彩圖形的螢幕。
- [C-0-2] 必須能夠算繪動畫。
- [C-0-3] 像素顯示比例 (PAR) 必須介於 0.9 到 1.15 之間。也就是說,像素顯示比例必須接近正方形 (1.0),容許值為 10% 至 15%。
7.1.7. 次要螢幕
Android 支援與 Android 相容的次要螢幕,可啟用媒體分享功能和存取外部螢幕的開發人員 API。
如果裝置實作項目支援透過有線、無線或內嵌額外螢幕連線的外接螢幕,則必須符合下列條件:
- [C-1-1] 必須實作 Android SDK 說明文件中所述的
DisplayManager
系統服務和 API。
7.2. 輸入裝置
裝置實作方式:
7.2.1. 鍵盤
如果裝置實作項目支援第三方輸入法編輯器 (IME) 應用程式,則必須符合下列條件:
- [C-1-1] 您必須宣告
android.software.input_methods
功能旗標。 - [C-1-2] 必須完全實作
Input Management Framework
- [C-1-3] 必須預先安裝軟體鍵盤。
裝置實作:* [C-0-1] 請勿加入不符合 android.content.res.Configuration.keyboard 中指定格式 (QWERTY 或 12 鍵) 的實體鍵盤。* 應納入其他螢幕鍵盤實作。* 可能包含硬體鍵盤。
7.2.2. 非觸控導覽
Android 支援 d-pad、軌跡球和輪盤,做為非觸控導覽機制。
裝置實作方式:
- [C-0-1] 必須回報 android.content.res.Configuration.navigation 的正確值。
如果裝置實作項目缺少非觸控式導覽功能,則會發生以下情況:
- [C-1-1] 您必須提供合理的替代使用者介面機制,讓使用者選取及編輯文字,且該機制必須與輸入管理引擎相容。上游 Android 開放原始碼實作內容包含選取機制,適合用於缺乏非觸控導覽輸入功能的裝置。
7.2.3. 瀏覽鍵
主畫面、最近使用和返回功能通常是透過與專屬實體按鈕或觸控螢幕的特定部分互動來提供,對 Android 導覽模式和裝置實作而言,這些功能至關重要:
- [C-0-1] 必須提供使用者操作提示,以便啟動已安裝應用程式,其中活動的
<intent-filter>
已設為ACTION=MAIN
和CATEGORY=LAUNCHER
,或CATEGORY=LEANBACK_LAUNCHER
(適用於電視裝置實作)。主畫面功能應是這項使用者操作功能的機制。 - 應提供「最近」和「返回」功能的按鈕。
如果提供「Home」、「Recents」或「Back」功能,則應符合下列條件:
- [C-1-1] 必須透過單一動作 (例如輕觸、按兩下或手勢) 即可存取,且該動作必須可供使用。
- [C-1-2] 必須清楚指出哪個單一動作會觸發每個函式。例如在按鈕上顯示可見的圖示、在螢幕的導覽列部分顯示軟體圖示,或是在開箱設定體驗期間,引導使用者逐步操作示範流程。
裝置實作方式:
- [SR] 強烈建議您不要為 Menu 函式提供輸入機制,因為自 Android 4.0 起,這項功能已淘汰,改為使用動作列。
如果裝置實作提供選單功能,則會:
- [C-2-1] 只要行動溢位選單彈出式視窗不為空白,且行動列可見,就必須顯示行動溢位按鈕。
- [C-2-2] 請勿透過選取動作列中的溢位按鈕,修改顯示的動作溢位彈出式視窗位置,但您可以透過選取「Menu」功能,在畫面上以經過修改的位置顯示動作溢位彈出式視窗。
如果裝置實作未提供 Menu 函式,為了兼顧回溯相容性,裝置會:
- [C-3-1] 當
targetSdkVersion
小於 10 時,應用程式必須透過實體按鈕、軟體鍵或手勢提供「Menu」功能。除非與其他導覽功能一併隱藏,否則應可存取此 Menu 功能。
如果裝置實作提供輔助函式,則會執行以下操作:
- [C-4-1] 在可使用其他導覽鍵時,必須透過單一動作 (例如輕觸、雙擊或手勢) 即可存取輔助功能。
- [SR] 強烈建議使用長按「HOME」功能做為指定互動。
如果裝置實作會使用螢幕的不同部分來顯示導覽鍵,則必須符合下列條件:
- [C-5-1] 導覽鍵必須使用螢幕的獨立部分,不得供應用程式使用,且不得遮蓋或以其他方式干擾應用程式可用的螢幕部分。
- [C-5-2] 必須向符合第 7.1.1 節規定的應用程式提供部分顯示畫面。
- [C-5-3] 應用程式必須遵循透過
View.setSystemUiVisibility()
API 方法設定的標記,以便正確隱藏畫面中的這個獨特部分 (即導覽列),如 SDK 說明文件所述。
如果導覽功能是以畫面上以手勢為主的動作提供:
- [C-6-1]
WindowInsets#getMandatorySystemGestureInsets()
只能用於回報 Google Home 手勢辨識區域。 - [C-6-2] 手勢開始於前景應用程式透過
View#setSystemGestureExclusionRects()
提供的排除矩形內,但位於WindowInsets#getMandatorySystemGestureInsets()
外,只要排除矩形符合View#setSystemGestureExclusionRects()
說明文件中指定的最大排除限制,就絕對不能為導覽功能攔截。 - [C-6-3] 如果前景應用程式先前已傳送
MotionEvent.ACTION_DOWN
事件,則在系統手勢開始攔截觸控動作時,應用程式必須傳送MotionEvent.ACTION_CANCEL
事件。 - [C-6-4] 您必須提供使用者切換至螢幕上按鈕式導覽的操作提示 (例如在「設定」中)。
- 應提供主畫面功能,也就是從螢幕目前方向的底部邊緣向上滑動。
- 應提供「最近」功能,讓使用者在 Home 手勢相同的區域,向上滑動並按住後再放開。
- 在
WindowInsets#getMandatorySystemGestureInsets()
內開始的手勢,不應受到前景應用程式透過View#setSystemGestureExclusionRects()
提供的排除矩形影響。
如果在螢幕目前方向的左側和右側邊緣任一處提供導覽功能:
- [C-7-1] 導覽功能必須是返回,且必須提供從螢幕目前方向的左側和右側邊緣滑動。
- [C-7-2] 如果在左側或右側邊緣提供可滑動的自訂系統面板,則必須將這些面板放在畫面頂端的 1/3 處,並以清晰且持續顯示的視覺效果,表示拖曳會叫用上述面板,而非返回鍵。使用者可以將系統面板設定為位於螢幕頂端 1/3 邊緣下方,但系統面板不得超過 1/3 邊緣。
- [C-7-3] 如果前景應用程式已設定
View.SYSTEM_UI_FLAG_IMMERSIVE
或View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
標記,從邊緣滑動時的行為必須與 AOSP 中實作的行為相同,相關說明請參閱 SDK。 - [C-7-4] 當前景應用程式設定
View.SYSTEM_UI_FLAG_IMMERSIVE
或View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
標記時,自訂可滑動系統面板必須在使用者導入 AOSP 中實作的系統列 (又稱為導覽和狀態列) 前隱藏。
7.2.4. 觸控螢幕輸入
Android 支援多種指標輸入系統,例如觸控螢幕、觸控板和假觸控輸入裝置。以觸控螢幕為基礎的裝置實作會與螢幕相關聯,讓使用者有直接操作畫面上項目的感受。由於使用者是直接觸碰螢幕,系統不需要任何額外的操作元素來指出要操作的物件。
裝置實作方式:
- 應具備某種指標輸入系統 (類似滑鼠或觸控)。
- 應支援完全獨立追蹤的指標。
如果裝置實作內容包含在 Android 相容螢幕上提供的觸控螢幕 (單點觸控或更高),則必須符合下列條件:
- [C-1-1] 必須為
Configuration.touchscreen
API 欄位回報TOUCHSCREEN_FINGER
。 - [C-1-2] 必須回報
android.hardware.touchscreen
和android.hardware.faketouch
功能旗標。
如果裝置實作項目包含觸控螢幕,且可在主要 Android 相容螢幕上追蹤多個觸控動作,則必須符合下列條件:
- [C-2-1] 必須回報適當的功能旗標
android.hardware.touchscreen.multitouch
、android.hardware.touchscreen.multitouch.distinct
、android.hardware.touchscreen.multitouch.jazzhand
,對應至裝置上的特定觸控螢幕類型。
如果裝置實作項目仰賴外部輸入裝置 (例如滑鼠或軌跡球,也就是不直接觸碰螢幕) 在主要 Android 相容螢幕上輸入內容,且符合第 7.2.5 節的假觸控要求,則必須:
- [C-3-1] 請勿回報任何以
android.hardware.touchscreen
開頭的功能旗標。 - [C-3-2] 請務必只回報
android.hardware.faketouch
。 - [C-3-3] 必須為
Configuration.touchscreen
API 欄位回報TOUCHSCREEN_NOTOUCH
。
7.2.5. 觸控模擬輸入
觸控模擬介面會提供使用者輸入系統,可模擬觸控螢幕的部分功能。舉例來說,滑鼠或遙控器驅動螢幕上的游標,類似於觸控操作,但使用者必須先指向或聚焦,然後再點選。滑鼠、觸控板、陀螺儀空中滑鼠、陀螺儀指標、搖桿和多點觸控觸控板等許多輸入裝置,都支援觸控模擬互動。Android 包含功能常數 android.hardware.faketouch,對應至高保真非觸控 (以滑鼠為基礎) 輸入裝置,例如滑鼠或觸控板,可充分模擬以觸控為基礎的輸入 (包括基本手勢支援),並指出裝置支援模擬的觸控螢幕功能子集。
如果裝置實作項目不含觸控螢幕,但包含其他可用的指標輸入系統,則必須:
- 應宣告支援
android.hardware.faketouch
功能旗標。
如果裝置實作項目宣告支援 android.hardware.faketouch
,則會:
- [C-1-1] 必須回報指標位置的絕對 X 和 Y 螢幕位置,並在畫面上顯示視覺指標。
- [C-1-2] 您必須使用動作代碼回報觸控事件,指定在指標在螢幕上往下或往上移動時發生的狀態變更。
- [C-1-3] 必須支援在螢幕上對物件向上下移動指標,讓使用者模擬輕觸螢幕上的物件。
- [C-1-4] 必須在時間門檻內,支援在螢幕上同一個物件上,以指標下、指標上、指標下、指標上的順序操作,讓使用者模擬雙擊螢幕上的物件。
- [C-1-5] 必須支援在螢幕上任意點按下,然後將游標移至螢幕上任意其他點,接著再將游標移至上方,讓使用者模擬觸控拖曳動作。
- [C-1-6] 必須支援指標向下,然後允許使用者快速將物件移至螢幕上的不同位置,然後指標向上,讓使用者在螢幕上揮動物件。
如果裝置實作項目宣告支援 android.hardware.faketouch.multitouch.distinct
,則會:
- [C-2-1] 必須宣告支援
android.hardware.faketouch
。 - [C-2-2] 必須支援對兩個或更多獨立指標輸入進行個別追蹤。
如果裝置實作項目宣告支援 android.hardware.faketouch.multitouch.jazzhand
,則會:
- [C-3-1] 必須宣告支援
android.hardware.faketouch
。 - [C-3-2] 必須支援 5 個 (追蹤手指) 或更多獨立的游標輸入裝置。
7.2.6. 遊戲控制器支援功能
7.2.6.1. 按鈕對應
裝置實作方式:
- [C-1-1] 必須能夠將 HID 事件對應至下表所列的對應
InputEvent
常數。上游 Android 實作項目符合這項規定。
如果裝置實作方式是內嵌控制器,或在盒中附上單獨的控制器,以便輸入下表所列的所有事件,則必須:
- [C-2-1] 必須宣告功能旗標
android.hardware.gamepad
按鈕 | HID 用途2 | Android 按鈕 |
---|---|---|
A1 | 0x09 0x0001 | KEYCODE_BUTTON_A (96) |
B1 | 0x09 0x0002 | KEYCODE_BUTTON_B (97) |
X1 | 0x09 0x0004 | KEYCODE_BUTTON_X (99) |
是1 | 0x09 0x0005 | KEYCODE_BUTTON_Y (100) |
方向鍵向上1 方向鍵向下1 |
0x01 0x00393 | AXIS_HAT_Y4 |
D-pad 左1 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 個 KeyEvent
2 上述 HID 用途必須在遊戲控制器 CA (0x01 0x0005) 中宣告。
3 此用法必須具備以下屬性:邏輯最小值 0、邏輯最大值 7、實體最小值 0、實體最大值 315、單位為度,以及回報大小為 4。邏輯值的定義是從垂直軸順時針旋轉;例如,邏輯值 0 代表沒有旋轉,且按下向上鍵,而邏輯值 1 代表旋轉 45 度,且同時按下向上鍵和向左鍵。
類比控制項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 |
7.2.7. 遙控器
如要瞭解裝置專屬需求,請參閱第 2.3.1 節。
7.3. 感應器
如果裝置實作包含特定感應器類型,且該類型具有適用於第三方開發人員的相應 API,則裝置實作必須按照 Android SDK 說明文件和 Android 開放原始碼說明文件中關於感應器的說明,實作該 API。
裝置實作方式:
- [C-0-1] 必須根據
android.content.pm.PackageManager
類別,準確回報感應器是否存在。 - [C-0-2] 必須透過
SensorManager.getSensorList()
和類似方法,傳回支援的正確感應器清單。 - [C-0-3] 必須針對所有其他感應器 API 合理運作 (例如,在應用程式嘗試註冊事件監聽器時,適當地傳回
true
或false
;在沒有對應感應器時,不呼叫感應器事件監聽器等)。
如果裝置實作包含特定感應器類型,且該類型有對應的 API 供第三方開發人員使用,則:
- [C-1-1] 必須使用 Android SDK 說明文件中定義的各感應器類型相關國際單位制 (公制) 值,回報所有感應器測量值。
- [C-1-2] 應用程式處理器處於活動狀態時,如果感應器串流的最大要求延遲時間為 0 毫秒,則感應器串流的最大延遲時間為 100 毫秒 + 2 * sample_time。這項延遲不含任何篩選延遲。
- [C-1-3] 必須在感應器啟用後的 400 毫秒 + 2 * sample_time 內回報第一個感應器樣本。這個樣本的精確度為 0 是可接受的。
- [C-1-4] 對於 Android SDK 說明文件中指出的任何「連續感應器」 API,裝置實作必須持續提供定期資料樣本,且抖動應低於 3%,其中抖動是指連續事件之間回報的時間戳記值差異的標準差。
- [C-1-5] 請務必確保感應器事件串流不得阻止裝置 CPU 進入休眠狀態或喚醒休眠狀態。
- [C-1-6] 必須按照 Android SDK 說明文件的定義,以奈秒為單位回報事件時間,代表事件發生的時間,並與 SystemClock.elapsedRealtimeNano() 時鐘同步。
- [C-SR] 強烈建議將時間戳記同步錯誤值控制在 100 毫秒以下,且應將時間戳記同步錯誤值控制在 1 毫秒以下。
- 啟用多個感應器時,電力消耗量不得超過個別感應器回報的電力消耗量總和。
上述清單並非完整列出所有情況;請參閱 Android SDK 的說明文件和 Android 開放原始碼文件中關於感應器的行為,以便瞭解相關資訊。
如果裝置實作包含特定感應器類型,且該類型有對應的 API 供第三方開發人員使用,則:
- [C-1-6] 必須為所有感應器設定非零解析度,並透過
Sensor.getResolution()
API 方法回報值。
某些感應器類型為複合類型,也就是說,它們可以衍生自一或多個其他感應器提供的資料。(例如方向感應器和線性加速度感應器)。
裝置實作方式:
- 當這些感應器類型包含「感應器類型」一文所述的必要實體感應器時,應實作這些感應器類型。
如果裝置實作包含複合感應器,則會執行以下操作:
- [C-2-1] 必須按照 Android 開放原始碼說明文件中關於複合感應器的說明,實作感應器。
如果裝置實作包含特定感應器類型,且該類型有對應的 API 供第三方開發人員使用,而感應器只會回報一個值,則裝置實作會:
- [C-3-1] 必須將感應器的解析度設為 1,並透過
Sensor.getResolution()
API 方法回報值。
如果裝置實作包含支援 SensorAdditionalInfo#TYPE_VEC3_CALIBRATION 的特定感應器類型,且該感應器會公開給第三方開發人員,則他們會:
- [C-4-1] 在提供的資料中,不得包含任何固定的、由工廠決定的校正參數。
如果裝置實作包含 3 軸加速計、3 軸陀螺儀感應器或磁力儀感應器的組合,則為:
- [C-SR] 強烈建議您確保加速計、陀螺儀和磁力計具有固定的相對位置,以便在裝置可變形 (例如可折疊) 時,感應器軸會在所有可能的裝置變形狀態下保持對齊和一致,與感應器座標系統保持一致。
7.3.1. 加速計
裝置實作方式:
- [C-SR] 強烈建議加入 3 軸式加速度計。
如果裝置實作包含 3 軸式加速度計,則會:
- [C-1-1] 必須能夠回報至少 50 Hz 的事件頻率。
- [C-1-2] 必須實作並回報
TYPE_ACCELEROMETER
感應器。 - [C-1-3] 必須遵循 Android API 中詳述的 Android 感應器座標系統。
- [C-1-4] 必須能夠在任何軸線上測量自由落體,最高可達重力(4g) 的四倍。
- [C-1-5] 解析度須至少為 12 位元。
- [C-1-6] 標準差不得超過 0.05 m/s^,且應以最快的取樣率,在至少 3 秒的時間內,針對每個軸計算樣本的標準差。
- [SR] 強烈建議您導入
TYPE_SIGNIFICANT_MOTION
複合感應器。 - [SR] 強烈建議您導入並回報
TYPE_ACCELEROMETER_UNCALIBRATED
感應器。強烈建議 Android 裝置符合這項規定,以便升級至日後可能需要符合此規定的平台版本。 - 應實作 Android SDK 文件中所述的
TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
、TYPE_STEP_COUNTER
複合感應器。 - 應回報的事件頻率應至少為 200 Hz。
- 應具有至少 16 位元的解析度。
- 如果特性在生命週期內發生變化,且已進行補償,則應在使用期間進行校正,並在裝置重新啟動時保留補償參數。
- 應進行溫度補償。
如果裝置實作項目包含 3 軸加速度計,且實作了 TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
或 TYPE_STEP_COUNTER
的複合感應器:
- [C-2-1] 耗電量的總和必須一律低於 4 毫瓦。
- 當裝置處於動態或靜態狀態時,每個值應低於 2 毫瓦和 0.5 毫瓦。
如果裝置實作包含 3 軸加速計和 3 軸陀螺儀感應器,則會:
- [C-3-1] 必須實作
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
複合感應器。 - [C-SR] 強烈建議您實作
TYPE_GAME_ROTATION_VECTOR
複合感應器。
如果裝置實作包含 3 軸加速計、3 軸陀螺儀感應器和磁力儀感應器,則會:
- [C-4-1] 必須實作
TYPE_ROTATION_VECTOR
複合感應器。
7.3.2. 磁力儀
裝置實作方式:
- [C-SR] 強烈建議加入 3 軸式磁力計 (指南針)。
如果裝置實作包含 3 軸磁力計,則會執行以下操作:
- [C-1-1] 必須實作
TYPE_MAGNETIC_FIELD
感應器。 - [C-1-2] 必須能夠回報至少 10 Hz 的事件頻率,並且應回報至少 50 Hz 的事件頻率。
- [C-1-3] 必須遵循 Android API 中詳述的 Android 感應器座標系統。
- [C-1-4] 必須能夠在飽和前,測量每個軸上的 -900 µT 和 +900 µT 之間的值。
- [C-1-5] 硬鐵偏移值必須小於 700 µT,且應小於 200 µT,方法是將磁力計置於遠離動態 (電流誘導) 和靜態 (磁鐵誘導) 磁場的位置。
- [C-1-6] 解析度必須等於或大於 0.6 µT。
- [C-1-7] 必須支援硬體偏差的線上校正和補償,並在裝置重新啟動時保留補償參數。
- [C-1-8] 必須套用軟鐵補償,可在使用中或裝置生產期間進行校正。
- [C-1-9] 必須有標準差,以最快的取樣率,在至少 3 秒的時間內收集樣本,計算每個軸的標準差,不得超過 1.5 µT;標準差應不超過 0.5 µT。
- [C-SR] 強烈建議您導入
TYPE_MAGNETIC_FIELD_UNCALIBRATED
感應器。
如果裝置實作包含 3 軸磁力儀、加速計感應器和 3 軸陀螺儀感應器,則必須符合下列條件:
- [C-2-1] 必須實作
TYPE_ROTATION_VECTOR
複合感應器。
如果裝置實作包含 3 軸磁力計和加速度計,則會:
- 可實作
TYPE_GEOMAGNETIC_ROTATION_VECTOR
感應器。
如果裝置實作包含 3 軸磁力儀、加速計和 TYPE_GEOMAGNETIC_ROTATION_VECTOR
感應器,則會:
- [C-3-1] 耗電量不得超過 10 毫瓦。
- 感應器以 10 Hz 的頻率註冊批次模式時,耗電量應低於 3 毫瓦。
7.3.3. GPS
裝置實作方式:
- [C-SR] 強烈建議加入 GPS/GNSS 接收器。
如果裝置實作內容包含 GPS/GNSS 接收器,並透過 android.hardware.location.gps
功能旗標向應用程式回報功能,則會:
- [C-1-1] 必須支援透過
LocationManager#requestLocationUpdate
要求時,以至少 1 Hz 的頻率輸出位置資訊。 - [C-1-2] 必須能夠在 10 秒內 (快速定位時間) 在開放天空的情況下 (訊號強、多路徑效應微乎其微、HDOP 小於 2) 判定位置,前提是裝置已連上 0.5 Mbps 以上速度的網際網路連線。通常會透過使用某種形式的輔助或預測 GPS/GNSS 技術,以盡可能縮短 GPS/GNSS 鎖定時間 (輔助資料包括參考時間、參考位置和衛星歷元/時鐘),以符合這項規定。
- [C-1-6] 進行這類位置計算後,裝置實作項目必須在 5 秒內,在開放天空中,在位置要求重新啟動時,在初始位置計算後最多一小時內,即使後續要求是在沒有資料連線和/或重新開機後,也必須確定其位置。
-
在空曠地區確定位置後,如果裝置處於靜止狀態或以每秒平方公尺 1 公尺以下的加速度移動,則:
- [C-1-3] 必須能夠在至少 95% 的時間內,判斷出 20 公尺以內的位置,以及每秒 0.5 公尺以內的速度。
- [C-1-4] 必須透過
GnssStatus.Callback
同時追蹤及回報單一星座至少 8 顆衛星。 - 應可同時追蹤至少 24 顆衛星,來自多個星座 (例如 GPS + 至少一個 GLONASS、北斗、Galileo)。
- [C-SR] 在緊急電話通話期間,強烈建議您繼續透過 GNSS 位置供應器 API 提供正常的 GPS/GNSS 位置輸出內容。
- [C-SR] 強烈建議您回報所有追蹤星座的 GNSS 測量值 (如 GnssStatus 訊息所述),但 SBAS 除外。
- [C-SR] 強烈建議您回報 AGC 和全球導航衛星系統測量頻率。
- [C-SR] 強烈建議您在每個 GPS/GNSS 位置中,一併回報所有預估準確度 (包括方位角、速度和垂直方向)。
- [C-SR] 強烈建議您一發現全球導航衛星系統測量資料,就立即回報,即使尚未回報透過 GPS/GNSS 計算的位置也一樣。
- [C-SR] 強烈建議您回報 GNSS 偽距離和偽距離速率,在確定位置後,在靜止或以每秒 0.2 公尺以下的加速度移動時,至少 95% 的時間都能計算出 20 公尺以內的位置和每秒 0.2 公尺以內的速度。
7.3.4. 陀螺儀
裝置實作方式:
- [C-SR] 強烈建議加入陀螺儀感應器。
如果裝置實作包含 3 軸式迴轉儀,則會執行以下操作:
- [C-1-1] 必須能夠回報至少 50 Hz 的事件頻率。
- [C-1-2] 必須實作
TYPE_GYROSCOPE
感應器,並強烈建議同時實作TYPE_GYROSCOPE_UNCALIBRATED
感應器。 - [C-1-4] 解析度須為 12 位元以上,且應為 16 位元以上。
- [C-1-5] 必須進行溫度補償。
- [C-1-6] 在使用期間必須進行校正和補償,並在裝置重新啟動時保留補償參數。
- [C-1-7] 變化值不得超過每 Hz 1e-7 弧度^2 / 秒^2 (每 Hz 變化值,或弧度^2 / 秒)。變化範圍可隨取樣率而異,但必須受到此值的限制。換句話說,如果您以 1 Hz 的取樣率測量陀螺儀的變異,其值應不超過 1e-7 rad^2/s^2。
- [SR] 當裝置在室溫下靜止時,建議校正誤差應低於 0.01 rad/s。
- 應回報的事件頻率應至少為 200 Hz。
如果裝置實作包含 3 軸陀螺儀、加速計感應器和磁力儀感應器,則這些感應器必須符合下列條件:
- [C-2-1] 必須實作
TYPE_ROTATION_VECTOR
複合感應器。
如果裝置實作包含 3 軸加速計和 3 軸陀螺儀感應器,則會:
- [C-3-1] 必須實作
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
複合感應器。 - [C-SR] 強烈建議您實作
TYPE_GAME_ROTATION_VECTOR
複合感應器。
7.3.5. 氣壓計
裝置實作方式:
- [C-SR] 強烈建議加入氣壓計 (環境氣壓感應器)。
如果裝置實作項目包含氣壓計,則會:
- [C-1-1] 必須實作並回報
TYPE_PRESSURE
感應器。 - [C-1-2] 必須能夠以 5 Hz 以上的頻率傳送事件。
- [C-1-3] 必須進行溫度補償。
- [SR] 強烈建議您能夠回報 300hPa 到 1100hPa 範圍內的壓力測量值。
- 應具有 1hPa 的絕對精確度。
- 應在 20hPa 範圍內,相對準確度為 0.12hPa (相當於在海平面上,約 200m 的變化範圍內,準確度為約 1m)。
7.3.6. 溫度計
如果裝置實作包含環境溫度計 (溫度感應器),則必須:
- [C-1-1] 必須為環境溫度感應器定義
SENSOR_TYPE_AMBIENT_TEMPERATURE
,且感應器必須以攝氏度測量使用者與裝置互動時的環境 (房間/車廂) 溫度。
如果裝置實作包含溫度計感應器,用於測量環境溫度以外的溫度 (例如 CPU 溫度),則應遵守下列規定:
- [C-2-1] 請勿為溫度感應器定義
SENSOR_TYPE_AMBIENT_TEMPERATURE
。
7.3.7. 光度計
- 裝置實作可能會包含光度計 (環境光感應器)。
7.3.8. 鄰近感應器
- 裝置實作可能會包含鄰近感應器。
如果裝置實作包含鄰近感應器,則會:
- [C-1-1] 必須測量物件與螢幕方向的接近程度。也就是說,接近感應器必須以偵測靠近螢幕的物體為優先,因為這類感應器的主要用途是偵測使用者正在使用的手機。如果裝置實作包含任何其他方向的鄰近感應器,則不得透過此 API 存取。
- [C-1-2] 必須有 1 位元以上的準確度。
7.3.9. 高精確度感應器
如果裝置實作包含本節所定義的一組較高品質的感應器,並將這些感應器提供給第三方應用程式,則:
- [C-1-1] 必須透過
android.hardware.sensor.hifi_sensors
功能旗標識別功能。
如果裝置實作宣告 android.hardware.sensor.hifi_sensors
,則會執行以下操作:
-
[C-2-1] 必須具備
TYPE_ACCELEROMETER
感應器,且符合下列條件:- 測量範圍必須至少介於 -8g 和 +8g 之間,強烈建議測量範圍至少介於 -16g 和 +16g 之間。
- 測量解析度必須至少為 2048 LSB/g。
- 測量頻率必須為 12.5 Hz 以下。
- 測量頻率上限必須為 400 Hz 以上;應支援 SensorDirectChannel
RATE_VERY_FAST
。 - 測量雜訊不得超過 400 μg/√Hz。
- 必須實作此感應器的非喚醒形式,並提供至少 3000 個感應器事件的緩衝功能。
- 必須具備不超過 3 毫瓦的批次耗電量。
- [C-SR] 強烈建議 3dB 測量頻寬至少為 Nyquist 頻率的 80%,且白噪音頻譜位於這個頻寬內。
- 在室溫下測試時,加速度隨機走樣應小於 30 μg/√Hz。
- 偏差變化與溫度的差異應小於 +/- 1 mg/°C。
- 最佳擬合線非線性應為 0.5% 以下,靈敏度變化與溫度應為 0.03%/°C 以下。
- 在裝置的操作溫度範圍內,應具有小於 2.5 % 的橫軸敏感度,以及小於 0.2% 的橫軸敏感度變化。
-
[C-2-2]
TYPE_ACCELEROMETER_UNCALIBRATED
必須符合與TYPE_ACCELEROMETER
相同的品質規定。 -
[C-2-3] 必須具備
TYPE_GYROSCOPE
感應器,且符合下列條件:- 測量範圍必須至少介於 -1000 和 +1000 dps 之間。
- 測量解析度必須至少為 16 LSB/dps。
- 測量頻率必須為 12.5 Hz 以下。
- 測量頻率上限必須為 400 Hz 以上;應支援 SensorDirectChannel
RATE_VERY_FAST
。 - 測量雜訊不得超過 0.014°/s/√Hz。
- [C-SR] 強烈建議 3dB 測量頻寬至少為 Nyquist 頻率的 80%,且白噪音頻譜位於這個頻寬內。
- 在室溫下測試時,應有小於 0.001 °/s √Hz 的隨機速率。
- 偏差變化與溫度的差異應小於 +/- 0.05 °/ s / °C。
- 溫度敏感度變化應低於 0.02% / °C。
- 最佳擬合線的非線性應低於 0.2%。
- 噪音密度應低於 0.007 °/s/√Hz。
- 在裝置靜止時,溫度範圍為 10 到 40 ℃ 時,校正誤差應低於 0.002 rad/s。
- 應具有小於 0.1°/s/g 的重力感應器靈敏度。
- 在裝置的操作溫度範圍內,應具有跨軸敏感度 < 4.0%,以及跨軸敏感度變化 < 0.3%。
-
[C-2-4]
TYPE_GYROSCOPE_UNCALIBRATED
必須符合TYPE_GYROSCOPE
的品質規定。 -
[C-2-5] 必須具備
TYPE_GEOMAGNETIC_FIELD
感應器,且符合下列條件:- 測量範圍必須至少介於 -900 和 +900 μT 之間。
- 測量解析度必須至少為 5 LSB/uT。
- 測量頻率必須低於或等於 5 Hz。
- 測量頻率上限必須為 50 Hz 以上。
- 測量雜訊不得超過 0.5 uT。
-
[C-2-6] 必須有
TYPE_MAGNETIC_FIELD_UNCALIBRATED
,且符合與TYPE_GEOMAGNETIC_FIELD
相同的品質規定,此外:- 必須實作此感應器的非喚醒形式,並提供至少 600 個感應器事件的緩衝功能。
- [C-SR] 當回報率為 50 Hz 以上時,強烈建議白噪音頻譜從 1 Hz 到至少 10 Hz。
-
[C-2-7] 必須具備
TYPE_PRESSURE
感應器,且符合下列條件:- 測量範圍必須至少介於 300 和 1100 hPa 之間。
- 測量解析度必須至少為 80 LSB/hPa。
- 測量頻率必須低於或等於 1 Hz。
- 測量頻率上限必須為 10 Hz 以上。
- 測量雜訊不得超過 2 Pa/√Hz。
- 必須實作此感應器的非喚醒形式,並提供至少 300 個感應器事件的緩衝功能。
- 必須具備不超過 2 毫瓦的批次耗電量。
- [C-2-8] 必須具備
TYPE_GAME_ROTATION_VECTOR
感應器。 - [C-2-9] 必須具備
TYPE_SIGNIFICANT_MOTION
感應器,且符合下列條件:- 裝置靜止時的耗電量不得超過 0.5 毫瓦,移動時不得超過 1.5 毫瓦。
- [C-2-10] 必須具備
TYPE_STEP_DETECTOR
感應器,且符合下列條件:- 必須實作此感應器的非喚醒形式,且緩衝功能至少要有 100 個感應器事件。
- 裝置靜止時的耗電量不得超過 0.5 毫瓦,移動時不得超過 1.5 毫瓦。
- 必須具備不超過 4 毫瓦的批次耗電量。
- [C-2-11] 必須具備
TYPE_STEP_COUNTER
感應器,且符合下列條件:- 裝置靜止時的耗電量不得超過 0.5 毫瓦,移動時不得超過 1.5 毫瓦。
- [C-2-12] 必須具備
TILT_DETECTOR
感應器,且符合下列條件:- 裝置靜止時的耗電量不得超過 0.5 毫瓦,移動時不得超過 1.5 毫瓦。
- [C-2-13] 加速計、陀螺儀和磁力計回報的相同物理事件事件時間戳記,必須相差 2.5 毫秒以內。加速計和陀螺儀回報的相同物理事件事件時間戳記,應在 0.25 毫秒的範圍內。
- [C-2-14] 陀螺儀感應器事件時間戳記必須與攝影機子系統使用相同的時間基準,且誤差不得超過 1 毫秒。
- [C-2-15] 從上述任何物理感應器提供資料給應用程式開始算起,應用程式必須在 5 毫秒內將資料傳送給應用程式。
- [C-2-16] 啟用下列任何感應器組合時,裝置靜止時的耗電量不得超過 0.5 毫瓦,裝置移動時的耗電量不得超過 2.0 毫瓦:
-
SENSOR_TYPE_SIGNIFICANT_MOTION
-
SENSOR_TYPE_STEP_DETECTOR
-
SENSOR_TYPE_STEP_COUNTER
-
SENSOR_TILT_DETECTORS
-
- [C-2-17] 可使用
TYPE_PROXIMITY
感應器,但如果使用,則至少須具備 100 個感應器事件的緩衝區功能。
請注意,本節中的所有耗電量規定均不含應用程式處理器的耗電量。這包括整個感應器鏈路 (感應器、任何支援電路、任何專用感應器處理系統等) 所消耗的電力。
如果裝置實作內容包含直接感應器支援功能,則必須:
- [C-3-1] 必須透過
isDirectChannelTypeSupported
和getHighestDirectReportRateLevel
API 正確宣告支援的直接管道類型和直接報表費率等級。 - [C-3-2] 對於宣稱支援感應器直接管道的所有感應器,至少必須支援兩種感應器直接管道類型之一。
- 應支援透過感應器直接管道回報事件,適用於下列類型的主要感應器 (非喚醒變體):
-
TYPE_ACCELEROMETER
-
TYPE_ACCELEROMETER_UNCALIBRATED
-
TYPE_GYROSCOPE
-
TYPE_GYROSCOPE_UNCALIBRATED
-
TYPE_MAGNETIC_FIELD
-
TYPE_MAGNETIC_FIELD_UNCALIBRATED
-
7.3.10. 生物特徵辨識感應器
如要進一步瞭解如何評估生物特徵辨識解鎖功能的安全性,請參閱「評估生物特徵辨識安全性」說明文件。
如果裝置實作內容包含安全的螢幕鎖定畫面,則必須符合下列條件:
- 應包含生物特徵辨識感應器
生物特徵辨識感應器可根據偽造和冒用接受率,以及生物特徵辨識管道的安全性,歸類為第 3 級 (舊稱強式)、第 2 級 (舊稱弱式) 或第 1 級 (舊稱便利)。這項分類會決定生物辨識感應器與平台和第三方應用程式連結時的功能。感應器預設為第 1 級,如要歸類為第 2 級或第 3 級,則必須符合下列額外規定。第 2 級和第 3 級生物特徵辨識都會獲得額外功能,詳情請參閱下文。
如果裝置實作透過 android.hardware.biometrics.BiometricManager、android.hardware.biometrics.BiometricPrompt 和 android.provider.Settings.ACTION_BIOMETRIC_ENROLL 開放生物特徵辨識感應器給第三方應用程式,則:
- [C-4-1] 必須符合本文所定義的第 3 級或第 2 級生物特徵辨識需求。
- [C-4-2] 必須辨識並遵循 Authenticators 類別中定義為常數的每個參數名稱,以及任何組合。相反地,除了在 Authenticators 中以公開常數記錄的常數,以及任何常數組合,其他傳遞至 canAuthenticate(int) 和 setAllowedAuthenticators(int) 方法的整數常數,都絕對不應受到尊重或認可。
- [C-4-3] 必須在搭載 第 3 級或 第 2 級生物辨識功能的裝置上實作 ACTION_BIOMETRIC_ENROLL 動作。這項動作必須只顯示第 3 級或第 2 級生物辨識系統的註冊入口點。
如果裝置實作項目支援被動生物辨識功能,則必須符合下列條件:
- [C-5-1] 預設必須要求額外的確認步驟 (例如按下按鈕)。
- [C-SR] 強烈建議您提供設定,允許使用者覆寫應用程式偏好設定,並一律要求確認步驟。
- [C-SR] 強烈建議您確保確認動作的安全性,以免遭到作業系統或核心遭到入侵而遭到冒用。舉例來說,這表示以實體按鈕為依據的確認動作會透過安全元件 (SE) 的僅限輸入通用輸入/輸出 (GPIO) 針腳進行路由,而該針腳只能透過按下實體按鈕的方式驅動。
- [C-5-2] 必須另外實作與 setConfirmationRequired (boolean) 相對應的隱含驗證流程(不含確認步驟),應用程式可將其設為登入流程所需的流程。
如果裝置實作有多個生物特徵辨識感應器,則必須:
- [C-SR] 強烈建議每次驗證只要求確認一個生物特徵 (例如如果裝置上同時提供指紋和臉部感應器,應在確認任一感應器後傳送 onAuthenticationSucceeded)。
為了讓裝置實作項目允許第三方應用程式存取 KeyStore 金鑰,這些項目必須符合下列條件:
- [C-6-1] 必須符合下文所定義的 Class 3 相關規定。
- [C-6-2] 如果驗證程序需要使用 BIOMETRIC_STRONG,或是透過 CryptoObject 叫用驗證程序,則必須只提供第 3 級生物辨識資料。
如果裝置實作項目希望將生物特徵辨識感應器視為第 1 級 (舊稱便利),則應:
- [C-1-1] 錯誤接受率必須低於 0.002%。
- [C-1-2] 必須揭露相較於高強度的 PIN 碼、解鎖圖案或密碼,這項模式的安全性可能較低,並清楚列出啟用這項模式的風險,如果根據 Android 生物特徵辨識測試規範的測量結果,偽造和冒用接受率高於 7%,則必須揭露這項資訊。
- [C-1-3] 在生物特徵辨識驗證的五次錯誤嘗試後,必須限制嘗試次數,至少為 30 秒 - 錯誤嘗試是指擷取品質足夠 (
BIOMETRIC_ACQUIRED_GOOD
) 但不符合已註冊的生物特徵。 - [C-1-4] 必須先建立信任鏈,才能新增新的生物辨識資料,例如要求使用者確認現有憑證或新增由 TEE 保護的裝置憑證 (PIN 碼/圖形/密碼)。Android 開放原始碼專案實作會在架構中提供相關機制。
- [C-1-5] 在移除使用者帳戶 (包括透過恢復原廠設定) 時,必須徹底移除所有可識別的生物特徵資料。
- [C-1-6] 必須遵守該生物特徵辨識系統的個別標記 (即
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT
、DevicePolicymanager.KEYGUARD_DISABLE_FACE
或DevicePolicymanager.KEYGUARD_DISABLE_IRIS
)。 - [C-1-7] 對於搭載 Android 10 的全新裝置,必須每隔 24 小時或更短時間向使用者提出建議的主要驗證方式 (例如 PIN 碼、解鎖圖案、密碼);對於從舊版 Android 升級的裝置,則必須每隔 72 小時或更短時間提出建議的主要驗證方式。
-
[C-1-8] 在發生下列任一情況後,必須要求使用者提供建議的主要驗證方式 (例如 PIN 碼、解鎖圖案、密碼):
- 4 小時的閒置逾時時間,或
- 生物特徵辨識驗證失敗 3 次。
- 成功確認裝置憑證後,閒置逾時時間和失敗的驗證次數會重設。
從舊版 Android 升級的裝置可免除 C-1-8 的規定。* [C-SR] 強烈建議您使用 Android 開放原始碼計畫提供的架構中的邏輯,針對新裝置強制執行 [C-1-7] 和 [C-1-8] 中指定的限制。* [C-SR] 強烈建議錯誤拒絕率低於 10%,且測試結果應為裝置測試結果。* [C-SR] 強烈建議每個已註冊的生物特徵辨識功能,從偵測到生物特徵到解鎖螢幕的延遲時間應低於 1 秒。
如果裝置實作項目希望將生物特徵辨識感應器視為第 2 級 (舊稱弱式),則應:
- [C-2-1] 必須符合上述第 1 級的所有規定。
- [C-2-2] 根據 Android 生物辨識測試規範的測量結果,偽造和冒用者接受率不得超過 20%。
- [C-2-3] 生物特徵辨識比對作業必須在 Android 使用者或核心空間以外的獨立執行環境中執行,例如受信任的執行環境 (TEE),或是與獨立執行環境建立安全通道的晶片。
- [C-2-4] 必須將所有可識別的資料加密並以密碼學方式驗證,以便在獨立執行環境或具有與該環境連結的安全通道的晶片之外,無法取得、讀取或變更這些資料,詳情請參閱 Android 開放原始碼專案網站的實作指南。
- [C-2-5] 對於以攝影機為基礎的生物特徵辨識功能,在進行生物特徵辨識驗證或註冊時:
- 相機必須在以下模式下運作,以免相機影格在獨立執行環境或具有安全通道至獨立執行環境的晶片之外遭到讀取或變更。
- 對於 RGB 單相機解決方案,相機影格可以在隔離執行環境外讀取,以便支援註冊預覽等作業,但仍不得變更。
- [C-2-6] 請勿允許第三方應用程式區分個別生物特徵註冊。
- [C-2-7] 不得允許應用程式處理器在 TEE 以外的環境中,對可辨識的生物辨識資料或任何衍生自該資料的資料 (例如嵌入資料) 進行未加密存取。
-
[C-2-8] 必須具備安全的處理管道,以免作業系統或核心遭到入侵,導致系統直接插入資料,誤認使用者身分。
如果裝置實作項目已在較舊的 Android 版本上推出,且無法透過系統軟體更新符合 C-2-8 規定,則可能不受此規定約束。
-
[C-SR] 強烈建議您為所有生物特徵辨識模式加入活體偵測功能,並為臉部生物特徵辨識功能加入注意力偵測功能。
如果裝置實作項目希望將生物特徵辨識感應器視為第 3 級 (舊稱強式),則應:
- [C-3-1] 必須符合上述第 2 級的所有規定,但 [C-1-7] 和 [C-1-8] 除外。從舊版 Android 升級的裝置不受 C-2-7 規範。
- [C-3-2] 必須實作硬體支援的 KeyStore。
- [C-3-3] 必須符合 Android 生物辨識測試規範的規定,偽造和冒用者接受率不得超過 7%。
- [C-3-4] 必須每隔 72 小時或更短時間,向使用者提出建議的主要驗證方式 (例如 PIN 碼、解鎖圖案、密碼)。
7.3.12. 姿勢感應器
裝置實作方式:
- 可支援 6 個自由度的姿勢感應器。
如果裝置實作支援 6 度自由度的姿勢感應器,則會:
- [C-1-1] 必須實作並回報
TYPE_POSE_6DOF
感應器。 - [C-1-2] 必須比單獨的旋轉向量更準確。
7.3.13. 轉軸角度感應器
如果裝置實作支援轉軸角度感應器,則會:
- [C-1-1] 必須實作並回報
TYPE_HINGLE_ANGLE
。 - [C-1-2] 必須支援 0 到 360 度 (含 0 和 360 度) 之間的至少兩個讀數。
- [C-1-3] 必須為
getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE)
傳回喚醒感應器。
7.4. 資料連線
7.4.1. 電話
Android API 和本文所用的「電話」一詞,專指透過 GSM 或 CDMA 網路撥打語音電話和傳送簡訊的硬體。雖然這些語音通話可能會或不會使用封包交換,但在 Android 的用途上,這些通話與任何可能使用相同網路實作的資料連線是獨立的。換句話說,Android 的「telephony」功能和 API 專指語音通話和簡訊。舉例來說,如果裝置無法撥打電話或傳送/接收簡訊,即使使用行動網路進行資料連線,也不算是電話裝置。
- Android 可用於不含電話硬體的裝置。也就是說,Android 可與非手機裝置相容。
如果裝置實作包含 GSM 或 CDMA 電話通訊功能,則必須符合下列條件:
- [C-1-1] 必須根據技術宣告
android.hardware.telephony
功能旗標和其他子功能旗標。 - [C-1-2] 必須完整支援該技術的 API。
如果裝置實作不含電話硬體,則會發生以下情況:
- [C-2-1] 必須將完整的 API 實作為無作業。
如果裝置實作項目支援 eUICC 或 eSIM/嵌入式 SIM 卡,且包含專屬機制,可讓第三方開發人員使用 eSIM 功能,則須符合下列條件:
- [C-3-1] 必須提供
EuiccManager API
的完整實作。
7.4.1.1. 電話號碼封鎖相容性
如果裝置實作回報 android.hardware.telephony feature
,則會:
- [C-1-1] 必須支援號碼封鎖功能
- [C-1-2] 必須按照 SDK 說明文件的說明,完整實作
BlockedNumberContract
和對應的 API。 - [C-1-3] 必須封鎖「BlockedNumberProvider」中的所有電話號碼,不必與應用程式互動。唯一的例外狀況是,如 SDK 說明文件所述,系統暫時解除電話號碼封鎖。
- [C-1-4] 不得針對遭封鎖的通話寫入平台通話記錄供應器。
- [C-1-5] 不得針對已封鎖的訊息寫入電話供應商。
- [C-1-6] 必須實作封鎖號碼管理 UI,並使用
TelecomManager.createManageBlockedNumbersIntent()
方法傳回的意圖開啟該 UI。 - [C-1-7] 絕對不允許次要使用者查看或編輯裝置上的封鎖號碼,因為 Android 平台會假設主要使用者可完全控制裝置上的單一電話服務例項。所有與封鎖相關的使用者介面都必須隱藏給次要使用者,且系統仍必須遵循封鎖清單。
- 裝置更新至 Android 7.0 時,應將封鎖的號碼遷移至供應商。
7.4.1.2. Telecom API
如果裝置實作項目回報 android.hardware.telephony
,則會:
- [C-1-1] 必須支援 SDK 中所述的
ConnectionService
API。 - [C-1-2] 當使用者正在使用第三方應用程式進行通話 (該應用程式不支援透過
CAPABILITY_SUPPORT_HOLD
指定的保留功能) 時,應用程式必須顯示新的來電,並提供使用者接受或拒絕來電的選項。 - [C-1-3] 應用程式必須實作 InCallService。
-
[C-SR] 強烈建議您通知使用者,接聽來電會導致正在進行的通話中斷。
AOSP 實作內容會透過提示通知來滿足這些需求,向使用者指出接聽來電會導致另一通通話中斷。
-
[C-SR] 強烈建議您預先載入預設撥號應用程式,以便在第三方應用程式將
EXTRA_LOG_SELF_MANAGED_CALLS
額外鍵的PhoneAccount
設為true
時,顯示通話記錄項目和第三方應用程式名稱。 - [C-SR] 強烈建議您處理音訊耳機的
KEYCODE_MEDIA_PLAY_PAUSE
和KEYCODE_HEADSETHOOK
事件,以便支援android.telecom
API,如下所示:- 在進行中的通話中,如果偵測到短暫按下按鍵事件,請呼叫
Connection.onDisconnect()
。 - 在來電期間偵測到短暫按下按鍵事件時,呼叫
Connection.onAnswer()
。 - 在來電期間偵測到長按按鍵事件時,呼叫
Connection.onReject()
。 - 切換
CallAudioState
的靜音狀態。
- 在進行中的通話中,如果偵測到短暫按下按鍵事件,請呼叫
7.4.2. IEEE 802.11 (Wi-Fi)
裝置實作方式:
- 應支援一或多種 802.11 形式。
如果裝置實作內容支援 802.11,並將這項功能公開給第三方應用程式,則必須:
- [C-1-1] 必須實作對應的 Android API。
- [C-1-2] 必須回報硬體功能旗標
android.hardware.wifi
。 - [C-1-3] 必須按照 SDK 說明文件所述,實作多播 API。
- [C-1-4] 必須支援多點傳送 DNS (mDNS),且不得在任何作業期間過濾 mDNS 封包 (224.0.0.251),包括:
- 即使螢幕未處於啟用狀態也一樣。
- 對於 Android TV 裝置實作,即使處於待機電源狀態也一樣。
- [C-1-5] 請勿將
WifiManager.enableNetwork()
API 方法呼叫視為足以切換目前有效Network
的指示,因為Network
是應用程式流量預設使用的項目,並由ConnectivityManager
API 方法 (例如getActiveNetwork
和registerDefaultNetworkCallback
) 傳回。換句話說,如果系統成功驗證 Wi-Fi 網路提供網際網路存取服務,則可能只會停用任何其他網路供應商 (例如行動數據) 提供的網際網路存取服務。 - [C-1-6] 強烈建議您在呼叫
ConnectivityManager.reportNetworkConnectivity()
API 方法時,重新評估Network
的網際網路存取權,並在評估結果判定目前Network
不再提供網際網路存取權後,切換至任何可提供網際網路存取權的可用網路 (例如行動數據)。 - [C-SR] 強烈建議在 STA 未連線時,每次掃描開始時隨機產生探測要求影格的來源 MAC 位址和序號。
- 每個組探測要求幀應使用一個一致的 MAC 位址 (在掃描過程中,不應隨機產生 MAC 位址)。
- 探測要求序號應在掃描中的探測要求之間正常 (依序) 重複。
- 探測要求序號應在掃描的最後一次探測要求和下一次掃描的第一次探測要求之間隨機產生。
- [C-SR] 在 STA 未連線時,強烈建議您只允許在探測要求封包中使用下列元素:
- SSID 參數集 (0)
- DS 參數集 (3)
如果裝置實作項目支援 Wi-Fi 省電模式 (依據 IEEE 802.11 標準定義),則必須符合下列條件:
- [C-3-1] 應用程式透過
WifiManager.createWifiLock()
和WifiManager.WifiLock.acquire()
API 取得WIFI_MODE_FULL_HIGH_PERF
鎖定或WIFI_MODE_FULL_LOW_LATENCY
鎖定,且鎖定功能處於啟用狀態時,應用程式必須關閉 Wi-Fi 省電模式。 - [C-3-2] 裝置處於 Wi-Fi 低延遲鎖定 (
WIFI_MODE_FULL_LOW_LATENCY
) 模式時,裝置與存取點之間的平均來回延遲時間,必須小於 Wi-Fi 高效能鎖定 (WIFI_MODE_FULL_HIGH_PERF
) 模式的延遲時間。 - [C-SR] 強烈建議在取得並啟用低延遲鎖定 (
WIFI_MODE_FULL_LOW_LATENCY
) 時,盡量減少 Wi-Fi 往返延遲時間。
如果裝置實作支援 Wi-Fi,並使用 Wi-Fi 進行位置掃描,則必須符合下列條件:
- [C-2-1] 必須提供使用者操作提示,以便啟用/停用透過
WifiManager.isScanAlwaysAvailable
API 方法讀取的值。
7.4.2.1. Wi-Fi Direct
裝置實作方式:
- 應支援 Wi-Fi Direct (Wi-Fi 點對點)。
如果裝置實作方式支援 Wi-Fi Direct,則必須符合下列條件:
- [C-1-1] 必須實作 SDK 說明文件中所述的對應 Android API。
- [C-1-2] 必須回報硬體功能
android.hardware.wifi.direct
。 - [C-1-3] 必須支援一般 Wi-Fi 作業。
- [C-1-4] 必須同時支援 Wi-Fi 和 Wi-Fi Direct 作業。
7.4.2.2. Wi-Fi 隧道直接連結設定
裝置實作方式:
- 應支援 Android SDK 說明文件中所述的 Wi-Fi 隧道直接連結設定 (TDLS)。
如果裝置實作內容支援 TDLS,且 WiFiManager API 已啟用 TDLS,則會發生以下情況:
- [C-1-1] 必須透過
WifiManager.isTdlsSupported
宣告支援 TDLS。 - 只有在可行且有益的情況下,才應使用 TDLS。
- 應採用一些啟發法的做法,並在效能可能低於透過 Wi-Fi 存取點連線時,不要使用 TDLS。
7.4.2.3. Wi-Fi Aware
裝置實作方式:
- 應支援 Wi-Fi Aware。
如果裝置實作方式支援 Wi-Fi Aware,並將這項功能公開給第三方應用程式,則會發生以下情況:
- [C-1-1] 必須實作
WifiAwareManager
API,如SDK 說明文件所述。 - [C-1-2] 必須宣告
android.hardware.wifi.aware
功能旗標。 - [C-1-3] 必須同時支援 Wi-Fi 和 Wi-Fi Aware 作業。
- [C-1-4] 必須在 Wi-Fi Aware 管理介面位址的間隔不超過 30 分鐘,以及啟用 Wi-Fi Aware 時隨機產生位址,除非 Aware 測距作業正在進行中,或是 Aware 資料路徑處於活動狀態 (只要資料路徑處於活動狀態,就不會隨機產生位址)。
如果裝置實作項目支援 Wi-Fi Aware 和 Wi-Fi 位置資訊 (如 第 7.4.2.5 節所述),並將這些功能公開給第三方應用程式,則必須符合下列條件:
- [C-2-1] 必須實作位置感知探索 API:setRangingEnabled、setMinDistanceMm、setMaxDistanceMm 和 onServiceDiscoveredWithinRange。
7.4.2.4. Wi-Fi 存取點
如果裝置實作內容包含 802.11 (Wi-Fi) 支援功能,則會:
- 應支援 Wi-Fi Passpoint。
如果裝置實作項目支援 Wi-Fi 存取點,則必須符合下列條件:
- [C-1-2] 必須實作 Passpoint 相關的
WifiManager
API,如 SDK 說明文件所述。 - [C-1-3] 必須支援 IEEE 802.11u 標準,特別是與網路探索和選取相關的標準,例如通用廣告服務 (GAS) 和存取網路查詢通訊協定 (ANQP)。
相反地,如果裝置實作不支援 Wi-Fi 存取點:
- [C-2-1] Passpoint 相關
WifiManager
API 的實作項目必須擲回UnsupportedOperationException
。
7.4.2.5。Wi-Fi 定位 (Wi-Fi 封包往返時間 - RTT)
裝置實作方式:
- 應支援 Wi-Fi 位置。
如果裝置實作方式支援 Wi-Fi 位置資訊,並將這項功能公開給第三方應用程式,則裝置會:
- [C-1-1] 必須實作
WifiRttManager
API,如SDK 說明文件所述。 - [C-1-2] 必須宣告
android.hardware.wifi.rtt
功能旗標。 - [C-1-3] 執行 RTT 時,如果執行 RTT 的 Wi-Fi 介面未與存取點建立關聯,則必須隨機產生每個 RTT 爆發事件的來源 MAC 位址。
7.4.2.6。Wi-Fi 保活功能卸載
裝置實作方式:
- 應支援 Wi-Fi keepalive 卸載功能。
如果裝置實作項目支援 Wi-Fi keepalive 卸載功能,並將這項功能公開給第三方應用程式,則必須:
-
[C-1-1] 必須支援 SocketKeepAlive API。
-
[C-1-2] 必須支援至少三個 Wi-Fi 並行保持連線的空格,以及至少一個行動網路並行保持連線的空格。
如果裝置實作不支援 Wi-Fi keepalive 卸載功能,則會發生以下情況:
- [C-2-1] 必須傳回
ERROR_UNSUPPORTED
。
7.4.2.7. Wi-Fi 輕鬆連線 (裝置佈建通訊協定)
裝置實作方式:
- 應支援 Wi-Fi 輕鬆連線 (DPP)。
如果裝置實作內容支援 Wi-Fi Easy Connect,並將這項功能公開給第三方應用程式,則必須:
- [C-1-1] WifiManager#isEasyConnectSupported() 方法必須傳回
true
。
7.4.3. 藍牙
如果裝置實作支援藍牙音訊設定檔,則會:
- 應支援進階音訊編解碼器和藍牙音訊編解碼器 (例如 LDAC)。
如果裝置實作支援 HFP、A2DP 和 AVRCP,則會:
- 應支援至少 5 個已連結的裝置。
如果裝置實作宣告 android.hardware.vr.high_performance
功能,則會:
- [C-1-1] 必須支援藍牙 4.2 和藍牙 LE 資料長度擴充功能。
Android 支援 藍牙和藍牙低功耗。
如果裝置實作項目支援藍牙和藍牙低功耗,則會:
- [C-2-1] 必須宣告相關的平台功能 (分別為
android.hardware.bluetooth
和android.hardware.bluetooth_le
),並實作平台 API。 - 應根據裝置需求,實作相關的藍牙設定檔,例如 A2DP、AVRCP、OBEX、HFP 等。
如果裝置實作項目支援藍牙低功耗 (BLE),則必須符合下列條件:
- [C-3-1] 必須宣告硬體功能
android.hardware.bluetooth_le
。 - [C-3-2] 必須啟用 GATT (通用屬性設定檔) 的 Bluetooth API,如 SDK 說明文件和 android.bluetooth 所述。
- [C-3-3] 必須回報
BluetoothAdapter.isOffloadedFilteringSupported()
的正確值,以表示是否已實作 ScanFilter API 類別的篩選邏輯。 - [C-3-4] 必須回報
BluetoothAdapter.isMultipleAdvertisementSupported()
的正確值,以表示是否支援低耗電量廣告。 - [C-3-5] 必須實作可解析私人位址 (RPA) 逾時機制,逾時時間不得超過 15 分鐘,並在逾時時輪替位址,以便在裝置積極使用 BLE 進行掃描或廣告時保護使用者隱私。為避免時間攻擊,逾時時間間隔也必須隨機化,介於 5 到 15 分鐘之間。
- 實作 ScanFilter API 時,應支援將篩選邏輯卸載至藍牙晶片組。
- 應支援將批次掃描作業卸載至藍牙晶片組。
- 應支援至少 4 個廣告位子的多個廣告。
如果裝置實作支援藍牙 LE,並使用藍牙 LE 進行位置掃描,則必須:
- [C-4-1] 必須提供使用者操作元素,以便透過系統 API
BluetoothAdapter.isBleScanAlwaysAvailable()
啟用/停用讀取的值。
如果裝置實作內容支援藍牙 LE 和助聽器設定檔,則會符合下列條件:使用藍牙 LE 支援助聽器音訊
- [C-5-1] 對於 BluetoothAdapter.getProfileProxy(context, listener, BluetoothProfile.HEARING_AID),必須傳回
true
。
7.4.4. 近距離無線通訊
裝置實作方式:
- 應包含近距離無線通訊 (NFC) 的收發器和相關硬體。
- [C-0-1] 必須實作
android.nfc.NdefMessage
和android.nfc.NdefRecord
API,即使這些 API 不支援 NFC 或宣告android.hardware.nfc
功能,因為這些類別代表不依附通訊協定的資料表示格式。
如果裝置實作包含 NFC 硬體,且打算讓第三方應用程式使用這項功能,則必須:
- [C-1-1] 必須從
android.content.pm.PackageManager.hasSystemFeature()
方法回報android.hardware.nfc
功能。 - 必須能夠透過下列 NFC 標準讀取及寫入 NDEF 訊息:
- [C-1-2] 必須能夠透過下列 NFC 標準,充當 NFC Forum 讀取器/寫入器 (依 NFC Forum 技術規格 NFCForum-TS-DigitalProtocol-1.0 定義):
- NfcA (ISO14443-3A)
- NfcB (ISO14443-3B)
- NfcF (JIS X 6319-4)
- IsoDep (ISO 14443-4)
- NFC Forum 標記類型 1、2、3、4、5 (由 NFC Forum 定義)
-
[SR] 強烈建議您能夠透過下列 NFC 標準讀取及寫入 NDEF 訊息和原始資料。請注意,雖然 NFC 標準列為「強烈建議」,但日後的版本相容性定義預計會將這些標準改為「必須」。這些標準在本版本中為選用標準,但在日後版本中將為必要標準。強烈建議目前和新款搭載此 Android 版本的裝置,現在就符合這些要求,以便日後升級至平台新版本。
-
[C-1-13] 在 NFC 探索模式下,必須輪詢所有支援的技術。
- 裝置喚醒、螢幕處於活動狀態且鎖定畫面解鎖時,應處於 NFC 偵測模式。
- 應能讀取 Thinfilm NFC Barcode 產品的條碼和網址 (如果已編碼)。
請注意,上述 JIS、ISO 和 NFC 論壇規格不適用於公開連結。
Android 支援 NFC 主機卡模擬 (HCE) 模式。
如果裝置實作包含支援 HCE (適用於 NfcA 和/或 NfcB) 的 NFC 控制器晶片組,且支援應用程式 ID (AID) 路由,則:
- [C-2-1] 必須回報
android.hardware.nfc.hce
地圖項目常數。 - [C-2-2] 必須支援 Android SDK 中定義的 NFC HCE API。
如果裝置實作內容包含支援 NfcF 的 HCE NFC 控制器晶片組,並且為第三方應用程式實作這項功能,則:
- [C-3-1] 必須回報
android.hardware.nfc.hcef
地圖項目常數。 - [C-3-2] 必須實作 Android SDK 中定義的 NfcF 卡模擬 API。
如果裝置實作項目包含一般 NFC 支援功能 (如本節所述),並且支援讀取/寫入器角色的 MIFARE 技術 (MIFARE Classic、MIFARE Ultralight、MIFARE Classic 上的 NDEF),則會:
- [C-4-1] 必須實作 Android SDK 說明文件中的對應 Android API。
- [C-4-2] 必須從
android.content.pm.PackageManager.hasSystemFeature
() 方法回報com.nxp.mifare
功能。請注意,這不是標準的 Android 功能,因此不會在android.content.pm.PackageManager
類別中顯示為常數。
7.4.5. 網路通訊協定和 API
7.4.5.1. 最低網路功能
裝置實作方式:
- [C-0-1] 必須支援一或多種資料網路。具體來說,裝置實作必須支援至少一種資料標準,且該標準的傳輸速率必須達到 200 Kbit/秒或更高。滿足這項規定的技術包括 EDGE、HSPA、EV-DO、802.11g、乙太網路和藍牙 PAN。
- 當實體網路標準 (例如乙太網路) 是主要資料連線時,應一併支援至少一種常見的無線資料標準,例如 802.11 (Wi-Fi)。
- 可實作多種資料連結形式。
7.4.5.2. IPv6
裝置實作方式:
- [C-0-2] 必須包含 IPv6 網路堆疊,並支援使用受管理的 API (例如
java.net.Socket
和java.net.URLConnection
) 以及原生 API (例如AF_INET6
網路介面) 的 IPv6 通訊。 - [C-0-3] 必須預設啟用 IPv6。
- 必須確保 IPv6 通訊與 IPv4 一樣可靠,例如:
- [C-0-4] 必須在休眠模式中維持 IPv6 連線。
- [C-0-5] 在使用 RA 生命週期至少 180 秒的任何相容 IPv6 網路上,速率限制絕對不會導致裝置失去 IPv6 連線。
- [C-0-6] 連線至 IPv6 網路時,必須為第三方應用程式提供直接的 IPv6 網路連線,且不得在裝置上發生任何形式的位址或連接埠轉譯。受管理的 API (例如
Socket#getLocalAddress
或Socket#getLocalPort
) 和 NDK API (例如getsockname()
或IPV6_PKTINFO
) 都必須傳回實際用於在網路上傳送及接收封包的 IP 位址和通訊埠,並顯示為網際網路 (網頁) 伺服器的來源 IP 和通訊埠。
所需的 IPv6 支援層級取決於網路類型,如以下規定所示。
如果裝置實作支援 Wi-Fi,則必須符合下列條件:
- [C-1-1] 必須支援 Wi-Fi 上的雙重堆疊和僅限 IPv6 作業。
如果裝置實作方式支援乙太網路,則必須符合下列條件:
- [C-2-1] 必須支援以太網路上的雙重堆疊和僅限 IPv6 作業。
如果裝置實作項目支援行動數據,則必須符合下列條件:
- [C-3-1] 必須支援行動網路上的 IPv6 作業 (僅限 IPv6 和可能的雙重堆疊)。
如果裝置實作項目支援多種網路類型 (例如Wi-Fi 和行動數據) 時,會發生以下情況:
- [C-4-1] 裝置同時連上多種網路類型時,必須同時符合上述每個網路的要求。
7.4.5.3. 網頁認證入口
網頁認證入口是指需要登入才能存取網際網路的網路。
如果裝置實作項目提供 android.webkit.Webview API
的完整實作項目,則會:
- [C-1-1] 必須提供網頁認證入口應用程式,在呼叫系統 API
ConnectivityManager#startCaptivePortalApp(Network, Bundle)
時傳送意圖ACTION_CAPTIVE_PORTAL_SIGN_IN
,並顯示網頁認證入口登入頁面。 - [C-1-2] 裝置連上任何網路類型 (包括行動網路、Wi-Fi、乙太網路或藍牙) 時,必須執行網頁驗證入口偵測,並支援透過網頁驗證入口應用程式登入。
- [C-1-3] 當裝置設定為使用私人 DNS 嚴格模式時,必須支援使用純文字 DNS 登入到無障礙入口網站。
- [C-1-4] 對於所有未明確與附屬網站通訊的網路流量,請務必依據 SDK 文件中的說明,為
android.net.LinkProperties.getPrivateDnsServerName
和android.net.LinkProperties.isPrivateDnsActive
使用加密 DNS。 - [C-1-5] 必須確保在使用者登入封閉式入口網站時,應用程式使用的預設網路 (由
ConnectivityManager.getActiveNetwork
和ConnectivityManager.registerDefaultNetworkCallback
傳回,並且預設由 Java 網路 API (例如 java.net.Socket) 和原生 API (例如 connect()) 使用) 為任何可用的網際網路存取網路 (如有)。
7.4.6. 同步處理設定
裝置實作方式:
- [C-0-1] 預設情況下必須啟用主控台自動同步設定,以便方法
getMasterSyncAutomatically()
傳回「true」。
7.4.7. 數據節省模式
如果裝置實作內容包含計量連線,則會符合下列條件:
- [SR] 強烈建議提供數據節省模式。
如果裝置實作提供數據節省模式,則會:
- [C-1-1] 必須支援
ConnectivityManager
類別中的所有 API,如 SDK 說明文件所述
如果裝置實作方式未提供數據節省模式,則會發生以下情況:
- [C-2-1] 必須針對
ConnectivityManager.getRestrictBackgroundStatus()
傳回RESTRICT_BACKGROUND_STATUS_DISABLED
值 - [C-2-2] 不得廣播
ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED
。
7.4.8. 安全元件
如果裝置實作支援 Open Mobile API 的安全元素,並將這些元素提供給第三方應用程式,則:
-
[C-1-1] 必須透過
android.se.omapi.SEService.getReaders()
API 列舉可用的安全元素讀取器。 -
[C-1-2] 針對使用 UICC 安全元件的裝置,必須透過
android.hardware.se.omapi.uicc
宣告正確的功能旗標;針對使用 eSE 安全元件的裝置,則必須透過android.hardware.se.omapi.ese
宣告;針對使用 SD 安全元件的裝置,則必須透過android.hardware.se.omapi.sd
宣告。
7.5. 攝影機
如果裝置實作包含至少一個相機,則會:
- [C-1-1] 必須宣告
android.hardware.camera.any
功能旗標。 - [C-1-2] 應用程式必須能夠同時配置 3 個 RGBA_8888 位圖,其大小與裝置上解析度最高的相機感應器產生的圖片相同,且相機必須處於開啟狀態,以便進行基本預覽和靜態影像拍攝。
- [C-1-3] 務必確保預先安裝的預設相機應用程式處理意圖
MediaStore.ACTION_IMAGE_CAPTURE
、MediaStore.ACTION_IMAGE_CAPTURE_SECURE
或MediaStore.ACTION_VIDEO_CAPTURE
,在將圖片中繼資料傳送至接收應用程式時,負責移除使用者位置資訊。如果接收應用程式沒有ACCESS_FINE_LOCATION
,則應移除這類資訊。
7.5.1. 後置鏡頭
後置鏡頭是位於裝置螢幕對面側邊的鏡頭,也就是像傳統相機一樣,拍攝裝置遠端的場景。
裝置實作方式:
- 應包含後置鏡頭。
如果裝置實作包含至少一個後置鏡頭,則必須符合下列條件:
- [C-1-1] 必須回報功能旗標
android.hardware.camera
和android.hardware.camera.any
。 - [C-1-2] 解析度必須至少為 2000 萬像素。
- 應在相機驅動程式中實作硬體自動對焦或軟體自動對焦功能 (對應用程式軟體而言是透明的)。
- 可能會配備固定對焦或 EDOF (擴大景深) 硬體。
- 可包含閃光燈。
如果攝影機有閃光燈:
- [C-2-1] 在相機預覽介面註冊
android.hardware.Camera.PreviewCallback
例項時,閃光燈不得亮起,除非應用程式已透過啟用Camera.Parameters
物件的FLASH_MODE_AUTO
或FLASH_MODE_ON
屬性,明確啟用閃光燈。請注意,這項限制不適用於裝置內建的系統相機應用程式,只適用於使用Camera.PreviewCallback
的第三方應用程式。
7.5.2. 前置鏡頭
前置鏡頭是指位於裝置螢幕同一側的鏡頭,也就是通常用於拍攝使用者影像的鏡頭,例如視訊會議和類似應用程式。
裝置實作方式:
- 可包含前置鏡頭。
如果裝置實作包含至少一個前置鏡頭,則必須符合下列條件:
- [C-1-1] 必須回報功能旗標
android.hardware.camera.any
和android.hardware.camera.front
。 - [C-1-2] 解析度必須至少為 VGA (640x480 像素)。
- [C-1-3] 請勿將前置鏡頭設為 Camera API 的預設鏡頭,也請勿將 API 設為將前置鏡頭視為預設後置鏡頭,即使前置鏡頭是裝置上唯一的鏡頭也一樣。
- [C-1-4] 當目前應用程式透過呼叫
android.hardware.Camera.setDisplayOrientation()
方法明確要求旋轉相機螢幕時,相機預覽畫面必須相對於應用程式指定的方向水平鏡像。反之,如果目前的應用程式未透過呼叫android.hardware.Camera.setDisplayOrientation()
方法明確要求旋轉相機螢幕,預覽畫面就必須沿著裝置的預設水平軸鏡像。 - [C-1-5] 不得將最終擷取的靜態影像或影片串流鏡像傳回至應用程式回呼,或儲存至媒體儲存空間。
- [C-1-6] 必須以與攝影機預覽圖像串流相同的方式,鏡像顯示後視鏡顯示的圖像。
- 可包含第 7.5.1 節所述的後置鏡頭功能 (例如自動對焦、閃光燈等)。
如果裝置實作可由使用者旋轉 (例如透過加速計自動旋轉,或透過使用者輸入手動旋轉):
- [C-2-1] 相機預覽畫面必須相對於裝置目前的方向水平鏡射。
7.5.3. 外接鏡頭
裝置實作方式:
- 可支援不一定隨時連線的外部攝影機。
如果裝置實作內容支援外接鏡頭,則應符合下列條件:
- [C-1-1] 必須宣告平台功能旗標
android.hardware.camera.external
和android.hardware camera.any
。 - [C-1-2] 如果外接攝影機是透過 USB 主機連接埠連線,則必須支援 USB 視訊類別 (UVC 1.0 以上版本)。
- [C-1-3] 必須在連接實體外部相機裝置的情況下,通過相機 CTS 測試。如需相機 CTS 測試的詳細資訊,請前往 source.android.com。
- 應支援 MJPEG 等影片壓縮功能,以便傳輸高品質未編碼的串流 (即原始或獨立壓縮的圖片串流)。
- 可支援多部攝影機。
- 可支援以攝影機為基礎的影片編碼。
如果支援以攝影機為基礎的影片編碼:
- [C-2-1] 裝置實作必須能夠存取同時未經編碼 / MJPEG 串流 (QVGA 或更高解析度)。
7.5.4. Camera API 行為
Android 包含兩個可存取相機的 API 套件,較新的 android.hardware.camera2 API 會將較低層級的相機控制權公開給應用程式,包括高效率的零複製連拍/串流流程,以及曝光、增益、白平增益、色彩轉換、雜訊消除、銳化等每個影格控制項。
較舊的 API 套件 android.hardware.Camera
已在 Android 5.0 中標示為已淘汰,但仍可供應用程式使用。Android 裝置實作項目必須確保 API 持續支援,如本節和 Android SDK 所述。
在已淘汰的 android.hardware.Camera 類別和較新的 android.hardware.camera2 套件之間,所有共同的功能在兩個 API 中都必須具有相同的效能和品質。舉例來說,在相同的設定下,自動對焦速度和準確度必須相同,拍攝的圖片品質也必須相同。依賴兩個 API 不同語意的功能不必具備相同的速度或品質,但應盡可能相近。
裝置實作項目必須針對所有可用的相機,實作相機相關 API 的以下行為。裝置實作方式:
- [C-0-1] 如果應用程式從未呼叫
android.hardware.Camera.Parameters.setPreviewFormat(int)
,則必須使用android.hardware.PixelFormat.YCbCr_420_SP
提供給應用程式回呼的預覽資料。 - [C-0-2] 當應用程式註冊
android.hardware.Camera.PreviewCallback
例項,系統呼叫onPreviewFrame()
方法,且預覽格式為 YCbCr_420_SP 時,byte[] 中的資料必須進一步採用 NV21 編碼格式,才能傳送至onPreviewFrame()
。也就是說,預設值必須是 NV21。 - [C-0-3]
android.hardware.Camera
的正面和後置鏡頭預覽畫面,都必須支援 YV12 格式 (以android.graphics.ImageFormat.YV12
常數表示)。(硬體影片編碼器和相機可以使用任何原生像素格式,但裝置實作必須支援轉換為 YV12)。 - [C-0-4] 必須支援
android.hardware.ImageFormat.YUV_420_888
和android.hardware.ImageFormat.JPEG
格式,並透過android.media.ImageReader
API 將其做為輸出內容,適用於在android.request.availableCapabilities
中宣告REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
功能的android.hardware.camera2
裝置。 - [C-0-5] 無論裝置是否提供硬體自動對焦或其他功能,都必須實作 Android SDK 文件中提供的完整 Camera API。舉例來說,缺少自動對焦功能的相機仍必須呼叫任何已註冊的
android.hardware.Camera.AutoFocusCallback
例項 (即使這與非自動對焦相機無關)。請注意,這項做法也適用於前置鏡頭;舉例來說,即使大多數前置鏡頭不支援自動對焦,API 回呼仍必須按照上述方式「偽造」。 - [C-0-6] 必須辨識並遵循
android.hardware.Camera.Parameters
類別和android.hardware.camera2.CaptureRequest
類別中定義為常數的每個參數名稱。相反地,除了android.hardware.Camera.Parameters
上記錄為常數的字串外,裝置實作不得將傳遞至android.hardware.Camera.setParameters()
方法的字串常數視為常數。也就是說,如果硬體允許,裝置實作必須支援所有標準相機參數,且不得支援自訂相機參數類型。舉例來說,如果裝置實作支援使用高動態範圍 (HDR) 成像技術拍攝圖片,就必須支援相機參數Camera.SCENE_MODE_HDR
。 - [C-0-7] 必須使用
android.info.supportedHardwareLevel
屬性,按照 Android SDK 說明的內容回報適當的支援層級,並回報適當的架構功能旗標。 - [C-0-8] 必須透過
android.request.availableCapabilities
屬性宣告android.hardware.camera2
的個別相機功能,並宣告適當的功能旗標;如果任何已連結的相機裝置支援該功能,則必須定義功能旗標。 - [C-0-9] 每當相機拍攝新相片,且相片項目已新增至媒體儲存庫時,必須廣播
Camera.ACTION_NEW_PICTURE
意圖。 - [C-0-10] 相機錄製新影片,且相片項目已新增至媒體儲存空間時,必須廣播
Camera.ACTION_NEW_VIDEO
意圖。 - [C-0-11] 必須讓所有相機都能透過已淘汰的
android.hardware.Camera
API 存取,也能透過android.hardware.camera2
API 存取。 - [C-0-12] 請務必確保臉部外觀不會遭到變更,包括但不限於變更任何
android.hardware.camera2
或android.hardware.Camera
API 的臉部幾何形狀、臉部膚色或臉部皮膚光滑度。 - [C-SR] 如果裝置有多個 RGB 攝影機朝向相同方向,強烈建議您支援列出
CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
功能的邏輯相機裝置,其中包含所有朝向該方向的 RGB 攝影機,做為實體子裝置。
如果裝置實作為第三方應用程式提供專屬相機 API,則會發生以下情況:
- [C-1-1] 必須使用
android.hardware.camera2
API 實作此類相機 API。 - 可為
android.hardware.camera2
API 提供供應商代碼和/或擴充功能。
7.5.5. 相機方向
如果裝置實作有前置或後置鏡頭,則該鏡頭:
- [C-1-1] 相機的長邊必須與螢幕的長邊對齊。也就是說,當裝置以橫向方向握持時,相機就必須以橫向方向拍攝圖片。無論裝置的自然方向為何,這項設定都適用於橫向為主要方向的裝置和直向為主要方向的裝置。
7.6. 記憶體與儲存空間
7.6.1. 記憶體和儲存空間需求
裝置實作方式:
- [C-0-1] 必須包含應用程式可用來下載資料檔案的下載管理工具,且必須能夠將大小至少 100 MB 的個別檔案下載至預設的「快取」位置。
7.6.2. 應用程式共用儲存空間
裝置實作方式:
- [C-0-1] 應用程式必須提供可供共用的儲存空間,這類儲存空間也常被稱為「共用外部儲存空間」、「應用程式共用儲存空間」或掛載的 Linux 路徑「/sdcard」。
- [C-0-2] 必須使用預設連接的共用儲存空間進行設定,也就是「開箱即用」,無論儲存空間是實作在內部儲存空間元件或可移除儲存媒體 (例如 Secure Digital 卡插槽) 皆然。
- [C-0-3] 應用程式共用儲存空間必須直接掛載至 Linux 路徑
sdcard
,或是包含從sdcard
到實際掛載點的 Linux 符號連結。 - [C-0-4] 針對指定 API 級別 29 以上版本的所有應用程式,必須預設啟用限定範圍儲存空間,但在下列情況下除外:
- 應用程式在資訊清單中要求
android:requestLegacyExternalStorage="true"
。
- 應用程式在資訊清單中要求
- [C-0-5] 必須在透過
MediaStore
存取媒體檔案時遮蓋其中儲存的位置中繼資料 (例如 GPS Exif 標記),除非呼叫端應用程式擁有ACCESS_MEDIA_LOCATION
權限。
裝置實作項目可使用下列任一方式,符合上述規定:
- 使用者可存取的可卸除式儲存空間,例如 Secure Digital (SD) 卡插槽。
- 在 Android 開放原始碼計畫 (AOSP) 中實作的部分內部 (不可移除) 儲存空間。
如果裝置實作項目使用可移除的儲存空間來滿足上述要求,則必須符合以下條件:
- [C-1-1] 當插槽中未插入任何儲存媒體時,應用程式必須實作 Toast 或彈出式使用者介面,警告使用者。
- [C-1-2] 必須隨附 FAT 格式的儲存媒體 (例如 SD 卡),或在包裝盒和其他購買時提供的資料中顯示,指出儲存媒體須另外購買。
如果裝置實作項目使用非可移除儲存空間的一部分來滿足上述需求,則必須符合下列條件:
- 應使用 AOSP 實作內部應用程式共用儲存空間。
- 可與應用程式私人資料共用儲存空間。
如果裝置實作項目的 USB 連接埠支援 USB 周邊模式,則必須:
- [C-3-1] 必須提供機制,以便從主機電腦存取應用程式共用儲存空間中的資料。
- 應透過 Android 的媒體掃描器服務和
android.provider.MediaStore
,公開顯示兩個儲存路徑的內容。 - 可使用 USB 大量儲存空間,但應使用媒體傳輸通訊協定來滿足這項規定。
如果裝置實作項目的 USB 連接埠支援 USB 周邊模式,且支援媒體傳輸通訊協定,則:
- 應與 Android MTP 參考主機 Android 檔案傳輸 相容。
- 應回報 0x00 的 USB 裝置類別。
- 應回報的 USB 介面名稱為「MTP」。
7.6.3. 合併儲存空間
如果裝置的本質是行動裝置,而非電視,則裝置實作方式如下:
- [SR] 強烈建議在長期穩定的位置實作可採用的儲存空間,因為不小心中斷連線可能會導致資料遺失/損毀。
如果可拆卸式儲存裝置的連接埠位於長期穩定的位置 (例如電池隔間或其他保護蓋內),裝置實作方式如下:
- [SR] 強烈建議您導入合併儲存空間。
7.7. USB
如果裝置實作項目有 USB 連接埠,則必須符合下列條件:
- 應支援 USB 周邊模式,並應支援 USB 主機模式。
7.7.1. USB 周邊裝置模式
如果裝置實作包含支援周邊模式的 USB 連接埠:
- [C-1-1] 連接埠必須可連接至具有標準 A 型或 C 型 USB 連接埠的 USB 主機。
- [C-1-2] 必須透過
android.os.Build.SERIAL
回報 USB 標準裝置描述元中的正確iSerialNumber
值。 - [C-1-3] 必須根據 Type-C 電阻標準偵測 1.5A 和 3.0A 充電器,且必須偵測廣告中的變更 (如果廣告支援 Type-C USB)。
- [SR] 連接埠應使用 micro-B、micro-AB 或 Type-C USB 板型規格。我們強烈建議現有和新款 Android 裝置符合這些規定,以便升級至日後的平台版本。
- [SR] 裝置的連接埠應位於裝置底部 (依照自然方向),或為所有應用程式 (包括主畫面) 啟用軟體螢幕旋轉功能,以便在裝置以連接埠朝下的方式擺放時,正確顯示畫面。我們強烈建議現有和新款 Android 裝置符合這些規定,以便日後升級至平台新版本。
- [SR] 應實作支援功能,在 HS 嗶嗶聲和流量期間繪製 1.5 A 電流,如 USB 電池充電規格第 1.2 版所述。我們強烈建議現有和新款 Android 裝置符合這些規定,以便升級至日後的平台版本。
- [SR] 強烈建議您不要支援會將 Vbus 電壓調高至超過預設等級的專屬充電方法,或變更匯流/來源角色,因為這可能會導致與支援標準 USB 電源供應方法的充電器或裝置發生互通性問題。雖然這項做法被列為「強烈建議」,但在日後的 Android 版本中,我們可能會要求所有 Type-C 裝置支援與標準 Type-C 充電器的完整互通性。
- [SR] 強烈建議在支援 Type-C USB 和 USB 主機模式時,支援 Power Delivery 以便進行資料和電力角色交換。
- 應支援高電壓充電的 Power Delivery,並支援顯示輸出等其他模式。
- 應按照 Android SDK 說明文件中所述,實作 Android Open Accessory (AOA) API 和規格。
如果裝置實作包含 USB 連接埠並實作 AOA 規範,則會:
- [C-2-1] 必須宣告支援硬體功能
android.hardware.usb.accessory
。 - [C-2-2] USB 大量儲存空間類別的 USB 大量儲存空間介面說明
iInterface
字串結尾處,必須包含「android」字串
7.7.2. USB 主機模式
如果裝置實作項目包含支援主機模式的 USB 連接埠,則會:
- [C-1-1] 必須實作 Android USB 主機 API,如 Android SDK 中的說明文件所述,且必須宣告支援硬體功能
android.hardware.usb.host
。 - [C-1-2] 必須支援連接標準 USB 周邊裝置,也就是說,必須符合下列任一條件:
- 裝置上有 Type-C 連接埠,或隨附的傳輸線可將裝置上的專屬連接埠轉換為標準 USB Type-C 連接埠 (USB Type-C 裝置)。
- 裝置上有 USB 類型 A 連接埠,或隨附的傳輸線可將裝置上的專屬連接埠轉換為標準 USB 類型 A 連接埠。
- 裝置上應具備 micro-AB 連接埠,並隨附可連接至標準 A 型連接埠的傳輸線。
- [C-1-3] 不得隨附從 USB Type A 或 micro-AB 連接埠轉換至 Type-C 連接埠 (接收器) 的轉接器。
- [C-SR] 強烈建議您按照 Android SDK 說明文件所述,實作 USB 音訊類別。
- 應支援在主機模式下為連接的 USB 周邊裝置充電;宣傳的來源電流至少為 1.5A,如 USB Type-C 電纜和連接器規格第 1.2 版 (適用於 USB Type-C 連接器) 的「終止參數」一節所述;或使用「充電下游埠」(CDP) 輸出電流範圍,如 USB 電池充電規格第 1.2 版 (適用於 Micro-AB 連接器) 所述。
- 應實作並支援 USB Type-C 標準。
如果裝置實作項目包含支援主機模式和 USB 音訊類別的 USB 連接埠,則會:
- [C-2-1] 必須支援 USB HID 類別。
- [C-2-2] 必須支援偵測及對應下列 HID 資料欄位,這些欄位已在 USB HID 用途表和語音指令用途要求中指定,並對應至
KeyEvent
常數,如下所示:- 用途頁面 (0xC) 用途 ID (0x0CD):
KEYCODE_MEDIA_PLAY_PAUSE
- 使用量頁面 (0xC) 使用量 ID (0x0E9):
KEYCODE_VOLUME_UP
- 用量頁面 (0xC) 用量 ID (0x0EA):
KEYCODE_VOLUME_DOWN
- 用量頁面 (0xC) 用量 ID (0x0CF):
KEYCODE_VOICE_ASSIST
- 用途頁面 (0xC) 用途 ID (0x0CD):
如果裝置實作項目包含支援主機模式和儲存空間存取架構 (SAF) 的 USB 連接埠,則會執行以下操作:
- [C-3-1] 必須辨識任何遠端連線的 MTP (媒體傳輸通訊協定) 裝置,並透過
ACTION_GET_CONTENT
、ACTION_OPEN_DOCUMENT
和ACTION_CREATE_DOCUMENT
意圖存取其內容。。
如果裝置實作項目包含支援主機模式和 USB Type-C 的 USB 連接埠,則會:
- [C-4-1] 必須實作 USB Type-C 規格 (第 4.5.1.3.3 節) 所定義的雙角色連接埠功能。
- [SR] 強烈建議支援 DisplayPort,應支援 USB 超高速資料傳輸速率,並強烈建議支援 Power Delivery,以便切換資料和電源角色。
- [SR] 強烈建議不要支援「USB Type-C 傳輸線和連接器規格修訂版 1.2」附錄 A 所述的音訊變壓器配件模式。
- 應實作最適合裝置板型規格的 Try.* 模型。舉例來說,手持裝置應實作 Try.SNK 模型。
7.8. 音訊
7.8.1. 麥克風
如果裝置實作包含麥克風,則必須:
- [C-1-1] 必須回報
android.hardware.microphone
地圖項目常數。 - [C-1-2] 必須符合第 5.4 節的音訊錄音規定。
- [C-1-3] 必須符合第 5.6 節的音訊延遲要求。
- [SR] 強烈建議支援近超音錄音功能,如第 7.8.3 節所述。
如果裝置實作內容省略麥克風,則會發生以下情況:
- [C-2-1] 請勿回報
android.hardware.microphone
功能常數。 - [C-2-2] 根據第 7 節,必須至少以無操作方式實作音訊錄音 API。
7.8.2. 音訊輸出
如果裝置實作包含音訊輸出周邊裝置的喇叭或音訊/多媒體輸出端 (例如使用 USB 音訊類別的 4 導體 3.5 公釐音訊插孔或 USB 主機模式端),則應符合下列條件:
- [C-1-1] 必須回報
android.hardware.audio.output
地圖項目常數。 - [C-1-2] 必須符合第 5.5 節的音訊播放規定。
- [C-1-3] 必須符合第 5.6 節的音訊延遲規定。
- [SR] 強烈建議支援近超音播放功能,如第 7.8.3 節所述。
如果裝置實作不包含音箱或音訊輸出埠,則會發生以下情況:
- [C-2-1] 請勿回報
android.hardware.audio.output
功能。 - [C-2-2] 必須至少將音訊輸出相關 API 實作為無操作。
在本節中,「輸出端口」是指實體介面,例如 3.5 公釐音訊插孔、HDMI 或 USB 主機模式端口 (含 USB 音訊類別)。透過藍牙、Wi-Fi 或行動網路等無線通訊協定支援音訊輸出,不符合「輸出埠」的資格。
7.8.2.1. 類比音訊埠
為了與 Android 生態系統中使用 3.5 公釐音訊插頭的耳機和其他音訊配件相容,如果裝置實作包含一個或多個類比音訊連接埠,則應符合下列條件:
- [C-SR] 強烈建議至少提供一個 4 導體 3.5 公釐音訊插孔。
如果裝置實作項目有 4 導體 3.5 公釐音訊插孔,則應符合下列規定:
- [C-1-1] 必須支援音訊播放至立體聲耳機和立體聲耳機麥克風。
- [C-1-2] 必須支援使用 CTIA 針腳排列的 TRRS 音訊插頭。
- [C-1-3] 必須支援以下 3 個等效阻抗範圍的偵測和對應至按鍵碼功能,這些範圍是音訊插頭上麥克風和接地導體之間的等效阻抗:
-
70 歐姆以下:
KEYCODE_HEADSETHOOK
-
210-290 歐姆:
KEYCODE_VOLUME_UP
-
360-680 歐姆:
KEYCODE_VOLUME_DOWN
-
70 歐姆以下:
- [C-1-4] 插頭插入時,必須觸發
ACTION_HEADSET_PLUG
,但只有在插頭上的所有接點都接觸到插座上的相關區段時才會觸發。 - [C-1-5] 必須能夠在 32 歐姆的喇叭阻抗上,驅動至少 150mV ± 10% 的輸出電壓。
- [C-1-6] 麥克風偏壓電壓必須介於 1.8V 至 2.9V 之間。
- [C-1-7] 必須偵測音訊插頭上麥克風和接地導體之間等效阻抗的下列範圍,並對應至鍵碼:
-
110-180 歐姆:
KEYCODE_VOICE_ASSIST
-
110-180 歐姆:
- [C-SR] 強烈建議支援使用 OMTP 針腳排列的音訊插頭。
- [C-SR] 強烈建議支援使用內建麥克風的立體聲耳機錄製音訊。
如果裝置實作項目具有 4 導體 3.5 公釐音訊插孔且支援麥克風,並以 1 為額外值麥克風設定值廣播 android.intent.action.HEADSET_PLUG
,則:
- [C-2-1] 必須支援偵測已插入的音訊配件上的麥克風。
7.8.2.2。數位音訊埠
為了與使用 USB-C 連接器的耳機和其他音訊配件相容,並在 Android 生態系統中實作 (USB 音訊類別),請參閱 Android USB 耳機規格。
如要瞭解裝置專屬需求,請參閱第 2.2.1 節。
7.8.3. 近場超音波
近超音波音訊是指 18.5 kHz 到 20 kHz 頻帶。
裝置實作方式:
- 必須透過 AudioManager.getProperty API 正確回報支援超音波音訊功能,如下所示:
如果 PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND
為「true」,VOICE_RECOGNITION
和 UNPROCESSED
音訊來源必須符合下列規定:
- [C-1-1] 麥克風在 18.5 kHz 至 20 kHz 頻帶的平均功率響應,必須比 2 kHz 的響應低 15 dB 以下。
- [C-1-2] 麥克風在 19 kHz 音調 (-26 dBFS) 的情況下,超過 18.5 kHz 至 20 kHz 的未加權訊噪比不得低於 50 dB。
如果 PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND
為「true」:
- [C-2-1] 揚聲器在 18.5 kHz 至 20 kHz 的平均響應,必須比 2 kHz 的響應低 40 dB。
7.8.4. 訊號完整性
裝置實作:* 應為手持裝置的輸入和輸出串流提供無雜訊的音訊信號路徑,也就是在每個路徑的測試中,一分鐘內測量不到任何雜訊。使用 [OboeTester] (https://github.com/google/oboe/tree/master/apps/OboeTester) 的「自動錯誤測試」功能進行測試。
這項測試需要音訊迴路轉接器,可直接插入 3.5 公釐耳機插孔,並/或搭配 USB-C 轉 3.5 公釐轉接器使用。應測試所有音訊輸出埠。
OboeTester 目前支援 AAudio 路徑,因此應使用 AAudio 測試下列組合是否有異常:
效能模式 | 分享 | Out Sample Rate | 在 Chans | Out Chans |
---|---|---|---|---|
LOW_LATENCY | 獨家 | UNSPECIFIED | 1 | 2 |
LOW_LATENCY | 獨家 | UNSPECIFIED | 2 | 1 |
LOW_LATENCY | 共用 | UNSPECIFIED | 1 | 2 |
LOW_LATENCY | 共用 | UNSPECIFIED | 2 | 1 |
NONE | 共用 | 48000 | 1 | 2 |
NONE | 共用 | 48000 | 2 | 1 |
NONE | 共用 | 44100 | 1 | 2 |
NONE | 共用 | 44100 | 2 | 1 |
NONE | 共用 | 16000 | 1 | 2 |
NONE | 共用 | 16000 | 2 | 1 |
可靠的串流應符合下列條件,以便測試 2000 Hz 正弦訊號的訊號雜訊比 (SNR) 和總諧波失真 (THD)。
換能器 | THD | SNR |
---|---|---|
主要內建喇叭,使用外部參考麥克風測量 | < 3.0% | >= 50 dB |
主要內建麥克風,使用外部參考喇叭進行測量 | < 3.0% | >= 50 dB |
內建類比 3.5 公釐耳機插孔,使用迴路轉接器進行測試 | < 1% | >= 60 dB |
手機隨附的 USB 變壓器,使用迴圈變壓器進行測試 | < 1.0% | >= 60 dB |
7.9. 虛擬實境
Android 提供 API 和設施,可用於建構「虛擬實境」(VR) 應用程式,包括高品質的行動 VR 體驗。裝置實作項目必須正確實作這些 API 和行為,詳情請參閱本節。
7.9.1. 虛擬實境模式
Android 支援VR 模式,這項功能可處理通知的立體渲染,並在 VR 應用程式獲得使用者焦點時停用單眼系統 UI 元件。
7.9.2. 虛擬實境模式 - 高效能
如果裝置實作支援 VR 模式,則會:
- [C-1-1] 至少須有 2 個實體核心。
- [C-1-2] 必須宣告
android.hardware.vr.high_performance
功能。 - [C-1-3] 必須支援持續效能模式。
- [C-1-4] 強烈建議您支援 OpenGL ES 3.2。
- [C-1-5] 必須支援
android.hardware.vulkan.level
0。 - 應支援
android.hardware.vulkan.level
1 以上版本。 - [C-1-6] 必須實作
EGL_KHR_mutable_render_buffer
、EGL_ANDROID_front_buffer_auto_refresh
、EGL_ANDROID_get_native_client_buffer
、EGL_KHR_fence_sync
、EGL_KHR_wait_sync
、EGL_IMG_context_priority
、EGL_EXT_protected_content
、EGL_EXT_image_gl_colorspace
,並在可用的 EGL 擴充功能清單中公開這些擴充功能。 - [C-1-8] 必須實作
GL_EXT_multisampled_render_to_texture2
、GL_OVR_multiview
、GL_OVR_multiview2
、GL_EXT_protected_textures
,並在可用的 GL 擴充功能清單中公開這些擴充功能。 - [C-SR] 強烈建議您實作
GL_EXT_external_buffer
、GL_EXT_EGL_image_array
和GL_OVR_multiview_multisampled_render_to_texture
,並在可用的 GL 擴充功能清單中公開這些擴充功能。 - [C-SR] 強烈建議支援 Vulkan 1.1。
- [C-SR] 強烈建議實作
VK_ANDROID_external_memory_android_hardware_buffer
、VK_GOOGLE_display_timing
和VK_KHR_shared_presentable_image
,並在可用的 Vulkan 擴充功能清單中公開。 - [C-SR] 強烈建議您至少公開一個 Vulkan 佇列家族,其中
flags
同時包含VK_QUEUE_GRAPHICS_BIT
和VK_QUEUE_COMPUTE_BIT
,且queueCount
至少為 2。 - [C-1-7] GPU 和螢幕必須能夠同步存取共用前端緩衝區,以便以 60fps 的速度,使用兩個轉譯內容顯示交替兩眼的 VR 內容,且不會出現明顯的撕裂現象。
- [C-1-9] 必須實作支援
AHardwareBuffer
標記AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER
、AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA
和AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT
,如 NDK 所述。 - [C-1-10] 必須支援
AHardwareBuffer
,且至少支援下列格式的使用標記AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT
、AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE
、AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT
的任意組合:AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM
、AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM
、AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM
、AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT
。 - [C-SR] 強烈建議您支援分配多個層級的
AHardwareBuffer
,以及 C-1-10 中指定的標記和格式。 - [C-1-11] 必須支援 H.264 解碼,解碼畫質至少為 3840 x 2160,以 30 fps 壓縮至平均 40 Mbps (相當於 1920 x 1080 的 4 個例項,以 30 fps 壓縮至 10 Mbps,或 1920 x 1080 的 2 個例項,以 60 fps 壓縮至 20 Mbps)。
- [C-1-12] 必須支援 HEVC 和 VP9,且必須能夠解碼至少 1920 x 1080 的畫面,解碼後的畫面大小經過壓縮後平均為 10 Mbps,並且應能夠解碼 3840 x 2160 的畫面,解碼後的畫面大小經過壓縮後平均為 30 fps-20 Mbps (相當於 1920 x 1080 的 4 個執行個體,解碼後的畫面大小經過壓縮後平均為 30 fps-5 Mbps)。
- [C-1-13] 必須支援
HardwarePropertiesManager.getDeviceTemperatures
API,並傳回正確的皮膚溫度值。 - [C-1-14] 必須有嵌入式螢幕,且解析度至少為 1920 x 1080。
- [C-SR] 強烈建議顯示解析度至少為 2560 x 1440。
- [C-1-15] 在 VR 模式下,螢幕更新率必須至少為 60 Hz。
- [C-1-17] 螢幕必須支援低延遲模式,延遲時間不得超過 5 毫秒,延遲時間是指像素發光的時間長度。
- [C-1-18] 必須支援藍牙 4.2 和藍牙 LE 資料長度擴充功能 第 7.4.3 節。
- [C-1-19] 必須支援並正確回報以下所有預設感應器類型的直接管道類型:
-
TYPE_ACCELEROMETER
-
TYPE_ACCELEROMETER_UNCALIBRATED
-
TYPE_GYROSCOPE
-
TYPE_GYROSCOPE_UNCALIBRATED
-
TYPE_MAGNETIC_FIELD
-
TYPE_MAGNETIC_FIELD_UNCALIBRATED
-
- [C-SR] 強烈建議您為上述所有直接管道類型支援
TYPE_HARDWARE_BUFFER
直接管道類型。 - [C-1-21] 必須符合 第 7.3.9 節所述的
android.hardware.hifi_sensors
陀螺儀、加速計和磁力計相關要求。 - [C-SR] 強烈建議您支援
android.hardware.sensor.hifi_sensors
功能。 - [C-1-22] 必須確保端對端動作到光子延遲時間不超過 28 毫秒。
- [C-SR] 強烈建議端對端運動到光子延遲時間不超過 20 毫秒。
- [C-1-23] 必須有第一幀比率,也就是從黑色轉為白色後,第一幀像素亮度與穩定狀態白色像素亮度之間的比率,至少為 85%。
- [C-SR] 強烈建議第一幀比率至少為 90%。
- 可為前景應用程式提供專屬核心,並支援
Process.getExclusiveCores
API,以便傳回頂層前景應用程式專屬的 CPU 核心數。
如果支援專屬核心,則核心會:
- [C-2-1] 不得允許任何其他使用者空間程序在該程序上執行 (應用程式使用的裝置驅動程式除外),但可視需要允許某些核心程序執行。
7.10. 觸覺回饋
如要瞭解裝置專屬需求,請參閱第 2.2.1 節。
7.11. 媒體成效類別
裝置實作項目的媒體效能類別可從 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
API 取得。媒體效能類別的規定會針對每個 Android 版本定義,從 R (第 30 版) 開始。特殊值 0 表示裝置不屬於媒體效能類別。
如果裝置實作會為 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
傳回非零值,則會:
[C-1-1] 必須至少傳回
android.os.Build.VERSION_CODES.R
的值。[C-1-2] 必須是手持裝置實作。
[C-1-3] 必須符合第 2.2.7 節所述的「媒體成效類別」所有要求。
如要瞭解裝置專屬需求,請參閱第 2.2.7 節。
8. 效能和電源
部分最低效能和電源標準對使用者體驗至關重要,並會影響開發人員在開發應用程式時的基準假設。
8.1. 使用者體驗一致性
只要符合特定最低要求,即可為使用者提供流暢的使用者介面,確保應用程式和遊戲的幀率和回應時間一致。視裝置類型而定,裝置實作可能會針對使用者介面延遲和工作切換,設下可評估的規定,詳情請參閱第 2 節。
8.2. 檔案 I/O 存取效能
在應用程式私人資料儲存空間 (/data
分割區) 上提供一致的檔案存取效能共同基準,可讓應用程式開發人員設定適當的預期值,有助於軟體設計。裝置實作方式 (視裝置類型而定) 可能會針對下列讀取和寫入作業,遵循第 2 節所述的特定規定:
- 依序寫入效能。使用 10 MB 寫入緩衝區寫入 256 MB 檔案所測得。
- 隨機寫入效能。使用 4 KB 寫入緩衝區寫入 256 MB 檔案所測得。
- 順序讀取效能。使用 10 MB 寫入緩衝區讀取 256 MB 檔案所測得。
- 隨機讀取效能。使用 4 KB 寫入緩衝區讀取 256 MB 檔案所測得。
8.3.省電模式
如果裝置實作功能包含 AOSP 中提供的功能 (例如應用程式待命值區、打盹),或擴充功能不比 很少使用的應用程式待命值區更嚴格的限制,則:
- [C-1-1] 應用程式待命和 Doze 省電模式的觸發、維護、喚醒演算法,以及使用全域系統設定時,請務必遵循 AOSP 實作方式。
- [C-1-2] 不得偏離 Android 開放原始碼計畫的實作方式,使用全域設定來管理應用程式待命狀態中各個區塊中的工作、鬧鐘和網路的節流。
- [C-1-3] 應用程式待命功能使用的應用程式待命值區數量,不得偏離 AOSP 實作項目。
- [C-1-4] 必須按照「電源管理」一節所述,實作「應用程式待命區塊」和「打盹」功能。
- [C-1-5] 裝置處於省電模式時,必須為
PowerManager.isPowerSaveMode()
傳回true
。 - [C-SR] 強烈建議提供使用者操作元素,以便啟用及停用省電模式。
- [C-SR] 強烈建議您提供使用者操作提示,顯示所有不受應用程式待命和打盹省電模式影響的應用程式。
如果裝置實作擴充 AOSP 中包含的電源管理功能,且該擴充功能套用比很少使用的應用程式待命值區更嚴格的限制,請參閱第 3.5.1 節。
除了省電模式之外,Android 裝置實作項目也可能會實作進階設定和電源介面 (ACPI) 定義的 4 種睡眠電源狀態中的任何一種或全部。
如果裝置實作項目實作 ACPI 定義的 S4 電源狀態,則會:
- [C-1-1] 裝置必須在使用者採取明確動作將裝置設為非活動狀態 (例如關閉裝置實體蓋子或關閉車輛或電視) 後,且在使用者重新啟用裝置 (例如開啟蓋子或重新開啟車輛或電視) 前,才可進入這個狀態。
如果裝置實作符合 ACPI 定義的 S3 電源狀態,則會:
-
[C-2-1] 必須符合上述 C-1-1 規定,或僅在第三方應用程式不需要系統資源 (例如螢幕、CPU) 時,才進入 S3 狀態。
相反地,當第三方應用程式需要系統資源時,必須退出 S3 狀態,如本 SDK 所述。
舉例來說,當第三方應用程式要求透過
FLAG_KEEP_SCREEN_ON
讓螢幕保持開啟,或透過PARTIAL_WAKE_LOCK
讓 CPU 持續運作時,裝置不得進入 S3 狀態,除非使用者採取明確的動作,將裝置設為非活動狀態,如 C-1-1 所述。相反地,當第三方應用程式透過 JobScheduler 實作的任務觸發,或 Firebase 雲端通訊傳送至第三方應用程式時,除非使用者將裝置設為非活動狀態,否則裝置必須退出 S3 狀態。以上並非完整的範例,AOSP 實作了廣泛的喚醒信號,可從這個狀態喚醒裝置。
8.4. 耗電量計算
更準確的耗電量計算和回報功能,可為應用程式開發人員提供誘因和工具,以便改善應用程式的耗電模式。
裝置實作方式:
- [SR] 強烈建議您提供個別元件的電源設定檔,定義每個硬體元件的電流消耗值,以及元件隨時間推移造成的電池耗電量估計值,如 Android 開放原始碼專案網站所述。
- [SR] 強烈建議以毫安培小時 (mAh) 為單位回報所有耗電量值。
- [SR] 強烈建議您針對每個程序的 UID 回報 CPU 耗電量。Android 開放原始碼計畫透過
uid_cputime
核心模組實作項目滿足這項需求。 - [SR] 強烈建議應用程式開發人員透過
adb shell dumpsys batterystats
殼層指令提供此電源用量。 - 如果無法將硬體元件的耗電量歸因於應用程式,則應歸因於硬體元件本身。
8.5. 一致的效能
高效能長時間執行應用程式的效能可能會大幅波動,原因可能是其他應用程式在背景執行,或是 CPU 因溫度限制而降速。Android 包含程式介面,因此當裝置可用時,前景中的頂層應用程式可以要求系統最佳化資源分配,以因應這類波動。
裝置實作方式:
-
[C-0-1] 必須透過
PowerManager.isSustainedPerformanceModeSupported()
API 方法,準確回報是否支援持續效能模式。 -
應支援持續效能模式。
如果裝置實作項目回報支援持續效能模式,則會:
- [C-1-1] 必須在前景應用程式要求時,至少提供 30 分鐘的一致效能。
- [C-1-2] 必須遵循
Window.setSustainedPerformanceMode()
API 和其他相關 API。
如果裝置實作包含兩個以上的 CPU 核心,則會發生以下情況:
- 應至少提供一個獨佔核心,供前景應用程式保留。
如果裝置實作功能可為頂層前景應用程式保留一個專屬核心,則會執行以下操作:
- [C-2-1] 必須透過
Process.getExclusiveCores()
API 方法,回報前景應用程式可保留的專屬核心 ID 編號。 - [C-2-2] 除了應用程式使用的裝置驅動程式外,不得允許任何使用者空間程序在專屬核心上執行,但可視需要允許部分核心程序執行。
如果裝置實作不支援專屬核心,則會發生以下情況:
- [C-3-1] 必須透過
Process.getExclusiveCores()
API 方法傳回空白清單。
9. 安全性模型相容性
裝置實作方式:
-
[C-0-1] 必須實作與 Android 平台安全性模型一致的安全性模型,如 Android 開發人員說明文件中 API 的 安全性和權限參考文件所定義。
-
[C-0-2] 必須支援自行簽署應用程式的安裝作業,且不必取得任何第三方/主管機關的額外權限/憑證。具體來說,相容裝置必須支援下列子區段所述的安全機制。
9.1. 權限
裝置實作方式:
-
[C-0-1] 必須支援 Android 開發人員文件中定義的 Android 權限模型。具體來說,他們必須強制執行 SDK 說明文件中定義的每項權限;不得省略、變更或忽略任何權限。
-
您可以新增其他權限,但新權限 ID 字串不得位於
android.\*
命名空間。 -
[C-0-2]
protectionLevel
為PROTECTION_FLAG_PRIVILEGED
的權限,必須只授予在系統映像檔的特殊權限路徑中預先安裝的應用程式,且必須在每個應用程式的明確許可清單權限子集內。AOSP 實作方式是讀取etc/permissions/
路徑中的檔案,並尊重每個應用程式的許可清單權限,並使用system/priv-app
路徑做為特殊權限路徑。
防護等級為危險的權限是執行階段權限。targetSdkVersion
大於 22 的應用程式會在執行階段要求這些權限。
裝置實作方式:
- [C-0-3] 必須顯示專用介面,讓使用者決定是否授予要求的執行階段權限,並提供介面讓使用者管理執行階段權限。
- [C-0-4] 必須有且只有一個實作版本,用於兩個使用者介面。
- [C-0-5] 請勿向預先安裝的應用程式授予任何執行階段權限,除非:
- 您可以在應用程式使用前取得使用者的同意。
- 執行階段權限會與意圖模式建立關聯,並將預先安裝的應用程式設為預設處理常式。
- [C-0-6] 請務必只將
android.permission.RECOVER_KEYSTORE
權限授予註冊了安全復原代理程式的系統應用程式。我們將「安全的復原代理程式」定義為裝置端軟體代理程式,可與裝置外部遠端儲存空間同步,且配備安全硬體,其保護力與 Google Cloud 密鑰金庫服務中所述的保護力相當或更強,以防範鎖定畫面知識因素的暴力攻擊。
裝置實作方式:
-
[C-0-7] 應用程式透過標準 Android API 或專屬機制要求位置或體能活動資料時,必須遵循 Android 位置權限屬性。這類資料包括但不限於:
- 裝置的位置 (例如緯度和經度)。
- 可用於判斷或推測裝置位置的資訊 (例如 SSID、BSSID、行動網路 ID 或裝置連線的網路位置)。
- 使用者的體能活動或體能活動分類。
具體來說,裝置實作方式如下:
- [C-0-8] 必須取得使用者同意,才能允許應用程式存取位置或體能活動資料。
- [C-0-9] 必須僅授予具備足夠權限的應用程式執行階段權限,如 SDK 所述。舉例來說,TelephonyManager#getServiceState 需要
android.permission.ACCESS_FINE_LOCATION
。
權限可標示為受限,以便變更其行為。
-
[C-0-10] 標有
hardRestricted
旗標的權限絕對不能授予應用程式,除非:- 應用程式 APK 檔案位於系統磁碟分割區。
- 使用者將與
hardRestricted
權限相關聯的角色指派給應用程式。 - 安裝程式會將
hardRestricted
授予應用程式。 - 應用程式在舊版 Android 上獲得
hardRestricted
。
-
[C-0-11] 擁有
softRestricted
權限的應用程式必須只取得有限的存取權,且在 SDK 中列入許可清單前,不得取得完整存取權,其中完整和有限存取權會針對每個softRestricted
權限 (例如READ_EXTERNAL_STORAGE
) 進行定義。
如果裝置實作提供使用者操作元素,讓他們可以選擇哪些應用程式可透過處理 ACTION_MANAGE_OVERLAY_PERMISSION
意圖的活動,在其他應用程式上繪製內容,則這些應用程式會:
- [C-2-1] 請務必確保所有具有
ACTION_MANAGE_OVERLAY_PERMISSION
意圖的意圖篩選器活動,都具有相同的 UI 畫面,無論啟動應用程式或其提供的任何資訊為何。
9.2. UID 和程序隔離
裝置實作方式:
- [C-0-1] 必須支援 Android 應用程式沙箱模型,其中每個應用程式都會以獨特的 Unix 風格 UID 和獨立程序執行。
- [C-0-2] 必須支援以相同的 Linux 使用者 ID 執行多個應用程式,前提是應用程式已正確簽署及建構,如安全性和權限參考資料所定義。
9.3. 檔案系統權限
裝置實作方式:
- [C-0-1] 必須支援 安全性和權限參考資料中定義的 Android 檔案存取權限模式。
9.4. 替代執行環境
裝置實作項目必須維持 Android 安全性和權限模型的一致性,即使包含執行應用程式的執行階段環境,使用其他軟體或技術 (而非 Dalvik 可執行格式或原生程式碼) 執行應用程式,也一樣。換句話說:
-
[C-0-1] 替代執行階段本身必須是 Android 應用程式,並遵循標準的 Android 安全性模型,如第 9 節其他部分所述。
-
[C-0-2] 替代執行階段不得授予存取權,以便存取透過 <
uses-permission
> 機制,在執行階段的AndroidManifest.xml
檔案中未要求的權限所保護的資源。 -
[C-0-3] 替代執行階段不得允許應用程式使用受 Android 權限保護的功能,這些權限僅適用於系統應用程式。
-
[C-0-4] 替代執行階段必須遵循 Android 沙箱模型,且使用替代執行階段的安裝應用程式不得重複使用裝置上安裝的任何其他應用程式的沙箱,除非透過共用使用者 ID 和簽署憑證的標準 Android 機制。
-
[C-0-5] 替代執行階段不得啟動、授予或取得其他 Android 應用程式對應的沙箱存取權。
-
[C-0-6] 替代執行階段不得啟動、授予或授予其他應用程式超級使用者 (root) 或任何其他使用者 ID 的任何權限。
-
[C-0-7] 當裝置實作內容的系統映像檔包含其他執行階段的
.apk
檔案時,該檔案必須使用與用於簽署裝置實作內容中其他應用程式的金鑰不同的金鑰進行簽署。 -
[C-0-8] 安裝應用程式時,替代執行階段必須針對應用程式使用的 Android 權限,取得使用者同意。
-
[C-0-9] 如果應用程式需要使用具有對應 Android 權限 (例如相機、GPS 等) 的裝置資源,替代執行階段必須通知使用者,應用程式將可存取該資源。
-
[C-0-10] 如果執行階段環境未以這種方式記錄應用程式功能,則在安裝使用該執行階段的任何應用程式時,執行階段環境必須列出執行階段本身所持有的所有權限。
-
替代執行階段應透過
PackageManager
將應用程式安裝到個別的 Android 沙箱 (Linux 使用者 ID 等)。 -
替代執行階段可提供單一 Android 沙箱,供使用替代執行階段的所有應用程式共用。
9.5. 支援多位使用者
Android 支援多位使用者,並提供完整的使用者隔離功能。
- 如果裝置實作使用可移除媒體做為主要外部儲存空間,則可以啟用多使用者功能,但不應強制啟用。
如果裝置實作包含多位使用者,則裝置會執行以下操作:
- [C-1-1] 必須符合下列與多使用者支援相關的規定。
- [C-1-2] 必須為每位使用者實作安全模型,且該模型必須與 API 中 安全性和權限參考文件中定義的 Android 平台安全模型一致。
- [C-1-3] 每個使用者例項都必須有獨立的共用應用程式儲存空間 (又稱為
/sdcard
) 目錄。 - [C-1-4] 請務必確保由特定使用者擁有並以其名義執行的應用程式,無法列出、讀取或寫入任何其他使用者擁有的檔案,即使兩者的資料儲存在相同的磁區或檔案系統中也一樣。
- [C-1-5] 啟用多使用者功能時,必須使用僅儲存在系統可存取的非可移除媒體上的金鑰來加密 SD 卡內容 (如果裝置實作會使用外部儲存空間 API 的移除媒體)。由於這會導致主機電腦無法讀取媒體,因此裝置實作必須切換至 MTP 或類似系統,讓主機電腦存取目前使用者的資料。
9.6. 付費簡訊警告
Android 支援警告使用者傳送任何付費簡訊。「付費簡訊」是指傳送至電信業者註冊服務的簡訊,可能會向使用者收費。
如果裝置實作項目宣告支援 android.hardware.telephony
,則會:
- [C-1-1] 必須在傳送簡訊給裝置中
/data/misc/sms/codes.xml
檔案中定義的規則所識別的號碼之前,先向使用者發出警告。上游 Android 開放原始碼專案提供符合這項需求的實作方式。
9.7. 安全防護機制
裝置實作項目必須確保符合核心和平台的安全防護功能,如下所述。
Android 沙箱包含使用 Security-Enhanced Linux (SELinux) 強制存取控制 (MAC) 系統、seccomp 沙箱,以及 Linux 核心中的其他安全性功能的功能。裝置實作方式:
- [C-0-1] 即使在 Android 架構下實作 SELinux 或任何其他安全性功能,也必須與現有應用程式相容。
- [C-0-2] 在 Android 架構下實作的安全性功能偵測到安全性違規並成功封鎖時,不得顯示使用者介面,但在未封鎖的安全性違規導致成功的漏洞攻擊時,則可以顯示使用者介面。
- [C-0-3] 絕對不得讓使用者或應用程式開發人員設定 Android 架構下方實作的 SELinux 或任何其他安全性功能。
- [C-0-4] 應用程式不得透過 API (例如 Device Administration API) 影響其他應用程式,以便設定會破壞相容性的政策。
- [C-0-5] 必須將媒體架構分割為多個程序,以便根據 Android 開放原始碼專案網站說明,為每個程序授予更精確的存取權。
- [C-0-6] 必須實作核心應用程式沙箱機制,以便使用多執行緒程式的可設定政策篩選系統呼叫。上游 Android 開放原始碼計畫透過啟用 seccomp-BPF 與執行緒群組同步處理 (TSYNC) 來滿足這項要求,如 source.android.com 的「核心設定」一節所述。
核心完整性和自我防護功能是 Android 安全防護的關鍵。裝置實作方式:
- [C-0-7] 必須實作核心堆疊緩衝區溢位保護機制。這類機制的例子包括
CC_STACKPROTECTOR_REGULAR
和CONFIG_CC_STACKPROTECTOR_STRONG
。 - [C-0-8] 必須實作嚴格的核心記憶體保護機制,其中可執行的程式碼為唯讀、唯讀資料不可執行且不可寫入,而可寫入的資料不可執行 (例如
CONFIG_DEBUG_RODATA
或CONFIG_STRICT_KERNEL_RWX
)。 - [C-0-9] 在原先搭載 API 級別 28 以上版本的裝置上,必須針對使用者空間和核心空間 (例如
CONFIG_HARDENED_USERCOPY
) 之間的複本,實作靜態和動態物件大小邊界檢查。 - [C-0-10] 在原先搭載 API 級別 28 以上版本的裝置上,執行核心模式 (例如硬體 PXN,或透過
CONFIG_CPU_SW_DOMAIN_PAN
或CONFIG_ARM64_SW_TTBR0_PAN
模擬) 時,請務必不要執行使用者空間記憶體。 - [C-0-11] 在原先搭載 API 級別 28 以上版本的裝置上,除了使用一般 usercopy 存取 API (例如硬體 PAN,或透過
CONFIG_CPU_SW_DOMAIN_PAN
或CONFIG_ARM64_SW_TTBR0_PAN
模擬) 之外,絕對不可在核心中讀取或寫入使用者空間記憶體。 - [C-0-12] 如果硬體容易受到 CVE-2017-5754 的影響,則必須在所有原先搭載 API 級別 28 以上版本 (例如
CONFIG_PAGE_TABLE_ISOLATION
或CONFIG_UNMAP_KERNEL_AT_EL0
) 的裝置上實作核心頁面表隔離機制。 - [C-0-13] 如果硬體容易受到 CVE-2017-5715 的攻擊,則必須在所有原先搭載 API 級別 28 以上版本 (例如
CONFIG_HARDEN_BRANCH_PREDICTOR
) 的裝置上實作分支預測強化功能。 - [SR] 強烈建議您在初始化後,將僅在初始化期間寫入的核心資料標示為唯讀 (例如
__ro_after_init
)。 -
[C-SR] 強烈建議您隨機化核心程式碼和記憶體的版面配置,並避免可能影響隨機化的曝露 (例如透過
/chosen/kaslr-seed Device Tree node
或EFI_RNG_PROTOCOL
使用引導程式熵的CONFIG_RANDOMIZE_BASE
)。 -
[C-SR] 強烈建議您在核心中啟用控制流程完整性 (CFI),以便提供額外防護措施,防範程式碼重複使用攻擊 (例如
CONFIG_CFI_CLANG
和CONFIG_SHADOW_CALL_STACK
)。 - [C-SR] 強烈建議您不要在已啟用這些功能的元件上停用控制流程完整性 (CFI)、陰影呼叫堆疊 (SCS) 或整數溢位清理 (IntSan)。
- [C-SR] 強烈建議您為任何其他安全性敏感的使用者空間元件啟用 CFI、SCS 和 IntSan,如 CFI 和 IntSan 所述。
- [C-SR] 強烈建議您在核心中啟用堆疊初始化功能,以免使用未初始化的本機變數 (
CONFIG_INIT_STACK_ALL
或CONFIG_INIT_STACK_ALL_ZERO
)。此外,裝置實作不應假設編譯器用來初始化本機的值。 - [C-SR] 強烈建議在核心中啟用堆積初始化功能,以免使用未經初始化的堆積配置 (
CONFIG_INIT_ON_ALLOC_DEFAULT_ON
),且不應假設核心會使用這些配置的值來進行初始化。
如果裝置實作項目使用 Linux 核心,則會:
- [C-1-1] 必須實作 SELinux。
- [C-1-2] 必須將 SELinux 設為全域強制執行模式。
- [C-1-3] 必須在強制模式下設定所有網域。不允許使用寬鬆模式網域,包括特定裝置/供應商的網域。
- [C-1-4] 請勿修改、省略或取代上游 Android 開放原始碼計畫 (AOSP) 提供的 system/sepolicy 資料夾中現有的 neverallow 規則,且政策必須針對 AOSP SELinux 網域和裝置/供應商專屬網域,與所有現有 neverallow 規則一起編譯。
- [C-1-5] 必須在每個應用程式的 SELinux 沙箱中執行指定 API 級別 28 以上版本的第三方應用程式,並為每個應用程式的私人資料目錄設定個別的 SELinux 限制。
- 應保留上游 Android 開放原始碼計畫的 system/sepolicy 資料夾中提供的預設 SELinux 政策,並只針對自身裝置專屬的設定進一步新增此政策。
如果裝置實作已在較舊的 Android 版本上推出,且無法透過系統軟體更新符合 [C-1-1] 和 [C-1-5] 規定,則可免除這些規定。
如果裝置實作使用 Linux 以外的核心,則會發生以下情況:
- [C-2-1] 必須使用與 SELinux 等同的強制存取控制系統。
Android 包含多項防禦深度功能,這些功能是裝置安全性不可或缺的要素。
9.8. 隱私權
9.8.1。用量記錄
Android 會儲存使用者選擇的記錄,並透過 UsageStatsManager 管理這類記錄。
裝置實作方式:
- [C-0-1] 必須保留這類使用者記錄一段合理的時間。
- [SR] 強烈建議保留 AOSP 實作中預設設定的 14 天保留期限。
Android 會使用 StatsLog
識別碼儲存系統事件,並透過 StatsManager
和 IncidentManager
系統 API 管理這類記錄。
裝置實作方式:
- [C-0-2] 由 System API 類別
IncidentManager
建立的事件報告中,只能包含標示為DEST_AUTOMATIC
的欄位。 - [C-0-3] 請勿使用系統事件 ID 記錄
StatsLog
SDK 文件中未提及的任何其他事件。如果記錄其他系統事件,可能會使用 100,000 到 200,000 之間的不同原子 ID。
9.8.2. 錄製
裝置實作方式:
- [C-0-1] 未經使用者同意,或未清除目前的通知,不得預先載入或分發會傳送使用者私人資訊 (例如按鍵動作、螢幕上顯示的文字、錯誤報告) 的軟體元件。
- [C-0-2] 您必須顯示並取得使用者的明確同意聲明,允許在透過
MediaProjection
或專屬 API 啟用螢幕投放或螢幕錄影功能時,擷取使用者螢幕上顯示的任何敏感資訊。請務必不要提供使用者關閉日後顯示使用者同意聲明的操作元素。 - [C-0-3] 啟用螢幕投放或螢幕錄影功能時,必須向使用者顯示持續通知。AOSP 會在狀態列中顯示持續通知圖示,以符合這項規定。
如果裝置實作內容包含系統中的功能,用於擷取螢幕上顯示的內容和/或錄製裝置上播放的音訊串流 (但不透過系統 API ContentCaptureService
或第 9.8.6 節內容擷取中所述的其他專屬方式),則必須符合下列條件:
- [C-1-1] 啟用這項功能並進行擷取/錄影時,必須持續向使用者發出通知。
如果裝置實作包含可立即啟用的元件,能夠錄製環境音訊和/或錄製裝置播放的音訊,以便推斷使用者情境的實用資訊,則必須:
- [C-2-1] 除非經過使用者明確同意,否則不得將錄製的原始音訊或任何可轉換回原始音訊或近似影本的格式,儲存在裝置上的永久性儲存空間或傳送離開裝置。
9.8.3. 連線能力
如果裝置實作項目的 USB 連接埠支援 USB 周邊模式,則會:
- [C-1-1] 必須先顯示使用者介面,要求使用者同意,才能透過 USB 連接埠存取共用儲存空間的內容。
9.8.4。網路流量
裝置實作方式:
- [C-0-1] 必須為系統信任的憑證授權單位 (CA) 存放區預先安裝與上游 Android 開放原始碼計畫提供的相同根憑證。
- [C-0-2] 必須提供空白的使用者根 CA 儲存庫。
- [C-0-3] 新增使用者根 CA 時,必須向使用者顯示警告,指出網路流量可能會受到監控。
如果裝置流量是透過 VPN 轉送,裝置實作方式如下:
- [C-1-1] 必須向使用者顯示警告,指出下列任一事項:
- 該網路流量可能會受到監控。
- 該網路流量會透過提供 VPN 的特定 VPN 應用程式轉送。
如果裝置實作有預設啟用的機制,可透過 Proxy 伺服器或 VPN 閘道轉送網路資料流量 (例如,預先載入已授予 android.permission.CONTROL_VPN
的 VPN 服務),則會發生以下情況:
- [C-2-1] 必須在啟用該機制前徵求使用者同意,除非該 VPN 是透過
DevicePolicyManager.setAlwaysOnVpnPackage()
由裝置政策控制器啟用,在這種情況下,使用者不需要提供個別同意聲明,但必須收到通知。
如果裝置實作可讓使用者切換第三方 VPN 應用程式「永久連線 VPN」功能的使用者操作元素,則必須符合下列條件:
- [C-3-1] 對於不支援永久連線 VPN 服務的應用程式,您必須在
AndroidManifest.xml
檔案中將SERVICE_META_DATA_SUPPORTS_ALWAYS_ON
屬性設為false
,以停用這項使用者操作選項。
9.8.5. 裝置 ID
裝置實作方式:
- [C-0-1] 應用程式不得存取裝置序號,以及適用情況下的 IMEI/MEID、SIM 卡序號和國際行動訂閱者識別碼 (IMSI),除非符合下列其中一項規定:
- 是經過裝置製造商驗證的簽署電信業者應用程式。
- 已授予
READ_PRIVILEGED_PHONE_STATE
權限。 - 擁有 UICC 電信業者權限中定義的電信業者權限。
- 是已獲授
READ_PHONE_STATE
權限的裝置擁有者或設定檔擁有者。 - (僅限 SIM 卡序號/ICCID) 遵守當地法規,要求應用程式偵測訂閱者身分的變更。
9.8.6。內容擷取
Android 會透過系統 API ContentCaptureService
或其他專屬方式,支援裝置實作機制,以便擷取應用程式與使用者之間的以下互動。
- 畫面上顯示的文字和圖形,包括但不限於透過
AssistStructure
API 顯示的通知和輔助資料。 - 媒體資料 (例如音訊或影片),由裝置錄製或播放。
- 輸入事件 (例如按鍵、滑鼠、手勢、語音、影片和無障礙功能)。
- 應用程式透過
Content Capture
API 或功能相似的專屬 API,向系統提供的任何其他事件。 - 任何透過
TextClassifier API
傳送至系統 TextClassifier 的文字或其他資料,也就是系統服務,以便瞭解文字的含義,並根據文字產生預測的後續動作。
如果裝置實作項目擷取上述資料,則會:
- [C-1-1] 儲存在裝置中的所有這類資料都必須加密。這項加密作業可使用 Android 檔案為基礎的加密功能,或任何 Cipher SDK 中列為 API 26 以上版本的加密器執行。
- [C-1-2] 請勿使用 Android 備份方法或任何其他備份方法備份原始資料或加密資料。
- [C-1-3] 請務必使用隱私權保護機制,傳送所有這類資料和裝置記錄。隱私權保護機制定義為「僅允許匯總分析,並防止系統將記錄的事件或衍生結果與個別使用者進行比對」,以免任何個別使用者資料可供內省 (例如,使用差異化隱私技術 (例如
RAPPOR
) 實作)。 - [C-1-4] 不得將這類資料與裝置上的任何使用者身分 (例如
Account
) 建立關聯,除非每次建立關聯時都徵得使用者明確同意。 - [C-1-5] 不得將此類資料分享給其他應用程式,除非每次分享時都獲得使用者明確同意。
- [C-1-6] 如果資料以任何形式儲存在裝置上,應用程式必須提供使用者清除
ContentCaptureService
或專屬方式收集的這類資料的操作選項。
如果裝置實作項目包含實作系統 API ContentCaptureService
的服務,或是任何可擷取上述資料的專屬服務,則會:
- [C-2-1] 請勿允許使用者以可供使用者安裝的應用程式或服務取代內容擷取服務,且請務必只允許預先安裝的服務擷取這類資料。
- [C-2-2] 除了預先安裝的內容擷取服務機制外,不得允許任何應用程式擷取這類資料。
- [C-2-3] 必須提供使用者可用來停用內容擷取服務的操作元素。
- [C-2-4] 請務必提供使用者操作選項,以便管理內容擷取服務所持有的 Android 權限,並遵循 Android 權限模式,如第 9.1 節所述。權限。
-
[C-SR] 強烈建議您將內容擷取服務元件分開,例如不要將服務或共用程序 ID 繫結至其他系統元件,但以下情況除外:
- 電話、聯絡人、系統使用者介面和媒體
9.8.7. 剪貼簿存取權
裝置實作方式:
- [C-0-1] 應用程式不得傳回剪報上遭到裁剪的資料 (例如透過
ClipboardManager
API),除非該應用程式是預設 IME 或目前有焦點的應用程式。
9.8.8。位置
裝置實作方式:
- [C-0-1] 未經使用者明確同意或使用者啟動,不得開啟/關閉裝置位置資訊設定和 Wi-Fi/藍牙掃描設定。
- [C-0-2] 應用程式必須提供使用者存取位置相關資訊的操作選項,包括最近的位置要求、應用程式層級權限,以及使用 Wi-Fi/藍牙掃描功能來判斷位置。
- [C-0-3] 必須確保使用緊急定位繞過 API [LocationRequest.setLocationSettingsIgnored()] 的應用程式,是使用者啟動的緊急工作階段 (例如撥打或傳送簡訊給 911)。不過,在汽車方面,如果偵測到車禍/意外事故,車輛可能會在沒有使用者主動互動情況下啟動緊急事件工作階段 (例如為了符合 eCall 規定)。
- [C-0-4] 必須保留緊急位置繞過 API 的功能,讓使用者不必變更設定,即可繞過裝置位置設定。
- [C-0-5] 應用程式必須在背景使用 [
ACCESS_BACKGROUND_LOCATION
] 權限存取使用者位置資訊後,安排通知提醒使用者。
9.8.9。已安裝的應用程式
根據預設,指定 API 級別 30 以上版本為目標的 Android 應用程式無法查看其他已安裝應用程式的詳細資料 (請參閱 Android SDK 說明文件中的「套件瀏覽權限」)。
裝置實作方式:
- [C-0-1] 除非應用程式已能透過受管理的 API 查看其他已安裝應用程式的詳細資料,否則不得向任何以 API 級別 30 以上為目標版本的應用程式,揭露任何其他已安裝應用程式的詳細資料。這包括但不限於裝置實作者新增的任何自訂 API 公開的詳細資料,或可透過檔案系統存取的詳細資料。
9.8.10。連線錯誤回報
如果裝置實作項目使用 BugreportManager 搭配系統 API BUGREPORT_MODE_TELEPHONY
產生錯誤報告,則會發生以下情況:
- [C-1-1] 每次呼叫系統 API
BUGREPORT_MODE_TELEPHONY
產生報表時,都必須取得使用者同意,且不得提示使用者同意日後所有應用程式要求。 - [C-1-2] 開始產生報表時,必須顯示並取得使用者的明確同意,且未經明確同意,不得將產生的報表傳回要求應用程式。
- [C-1-3] 必須產生所要求的報表,其中至少包含下列資訊:
- TelephonyDebugService 傾印
- TelephonyRegistry 快照
- WifiService 轉儲
- ConnectivityService 傾印
- 呼叫套件的 CarrierService 例項 (如果已繫結) 的傾印內容
- 無線電記錄檔緩衝區
- [C-1-4] 產生的報表中不得包含下列內容:
- 任何與連線偵錯無關的資訊。
- 任何類型的使用者安裝應用程式流量記錄,或使用者安裝應用程式/套件的詳細設定檔 (可提供 UID,但不能提供套件名稱)。
- 可能包含與任何使用者身分無關的其他資訊。(例如供應商記錄)。
如果裝置實作內容在錯誤報告中納入其他資訊 (例如供應商記錄),且該資訊會影響隱私權/安全性/電池/儲存空間/記憶體,則應採取以下做法:
- [C-SR] 強烈建議將開發人員設定預設為停用。AOSP 在開發人員設定中提供
Enable verbose vendor logging
選項,可在錯誤報告中納入其他裝置專屬供應商記錄,以符合這項需求。
9.8.11。資料 blob 共用
Android 透過 BlobStoreManager,允許應用程式將資料 blob 提供給系統,以便與所選應用程式組合共用。
如果裝置實作項目支援 SDK 說明文件中所述的共用資料 blob,則會:
- [C-1-1] 請勿分享應用程式所屬的資料 Blob,除非是應用程式允許的範圍 (也就是預設存取權範圍,以及可使用 BlobStoreManager.session#allowPackageAccess()、BlobStoreManager.session#allowSameSignatureAccess() 或 BlobStoreManager.session#allowPublicAccess() 指定的其他存取模式,請勿修改)。AOSP 參考實作項目符合這些需求。
- [C-1-2] 不得將資料區塊 (用於控制存取權) 的安全雜湊傳送出裝置或與其他應用程式共用。
9.9. 資料儲存加密
所有裝置都必須符合第 9.9.1 節的規定。搭載的 API 級別早於本文件所述的裝置,可免除第 9.9.2 和 9.9.3 節的規定;但必須符合 Android 相容性定義說明文件中第 9.9 節的規定,該規定應與裝置搭載的 API 級別相符。
9.9.1. 直接開機
裝置實作方式:
-
[C-0-1] 即使 Direct Boot mode API 不支援儲存空間加密功能,也必須實作這些 API。
-
[C-0-2]
ACTION_LOCKED_BOOT_COMPLETED
和ACTION_USER_UNLOCKED
意圖仍須廣播,以便向直接啟動感知應用程式傳送訊號,指出裝置加密 (DE) 和憑證加密 (CE) 儲存位置可供使用者使用。
9.9.2. 加密規定
裝置實作方式:
- [C-0-1] 應用程式私人資料 (
/data
分區) 和應用程式共用儲存空間分區 (/sdcard
分區) 必須加密 (如果是裝置的永久性、不可移除的部分)。 - [C-0-2] 在使用者完成開箱設定體驗時,必須預設啟用資料儲存空間加密功能。
-
[C-0-3] 必須實作下列兩種加密方法之一,以符合上述資料儲存加密規定:
9.9.3. 加密方法
如果裝置實作項目受到加密保護,則會:
- [C-1-1] 必須在啟動時不要求使用者提供憑證,並在
ACTION_LOCKED_BOOT_COMPLETED
訊息廣播後,允許支援直接啟動的應用程式存取裝置加密 (DE) 儲存空間。 - [C-1-2] 使用者必須先輸入憑證 (例如密碼、PIN 碼、圖案或指紋) 解鎖裝置,並廣播
ACTION_USER_UNLOCKED
訊息,系統才會允許存取憑證加密 (CE) 儲存空間。 - [C-1-13] 如未提供使用者提供的憑證、註冊的保管金鑰,或符合第 9.9.4 節規定的重新啟動實作項目,則不得提供任何解鎖 CE 保護儲存空間的方法。
- [C-1-4] 必須使用驗證開機程序。
9.9.3.1. 檔案型加密 (含中繼資料加密)
如果裝置實作項目使用檔案型加密和中繼資料加密,則會:
- [C-1-5] 必須使用 AES-256-XTS 或 Adiantum 加密檔案內容和檔案系統中繼資料。AES-256-XTS 是指進階加密標準,使用 256 位元密碼金鑰長度,在 XTS 模式下運作;金鑰的完整長度為 512 位元。Adiantum 是指 Adiantum-XChaCha12-AES,如 https://github.com/google/adiantum 所述。檔案系統中繼資料是指檔案大小、擁有權、模式和擴充屬性 (xattr) 等資料。
- [C-1-6] 請務必使用 AES-256-CBC-CTS 或 Adiantum 加密檔案名稱。
- [C-1-12] 如果裝置支援進階加密標準 (AES) 指示 (例如 ARM 裝置上的 ARMv8 加密擴充功能,或 x86 裝置上的 AES-NI),則必須使用上述 AES 相關選項來加密檔案名稱、檔案內容和檔案系統中繼資料,而非使用 Adiantum。
- [C-1-13] 必須使用加密編譯強度高且不可逆的金鑰衍生函式 (例如 HKDF-SHA512),從 CE 和 DE 金鑰衍生所需的任何子金鑰 (例如個別檔案金鑰)。「加密強且不可逆轉」是指金鑰衍生函式具有至少 256 位元的安全強度,並在輸入內容中以偽隨機函式系列的形式運作。
-
[C-1-14] 請勿將相同的檔案為基礎加密 (FBE) 金鑰或子金鑰用於不同的加密編譯用途 (例如同時用於加密和金鑰衍生,或用於兩種不同的加密演算法)。
-
保護 CE 和 DE 儲存區和檔案系統中繼資料的金鑰:
-
[C-1-7] 必須透過加密編譯方式,與硬體支援的 Keystore 繫結。此 KeyStore 必須綁定至已驗證的開機程序,以及裝置的硬體信任根。
- [C-1-8] CE 金鑰必須繫結至使用者的螢幕鎖定憑證。
- [C-1-9] 使用者未指定螢幕鎖定畫面憑證時,CE 鍵務必綁定至預設密碼。
- [C-1-10] 必須是獨一無二的值,換句話說,沒有任何使用者的 CE 或 DE 鍵會與其他使用者的 CE 或 DE 鍵相符。
-
[C-1-11] 必須使用強制支援的密碼、金鑰長度和模式。
-
應讓預先安裝的重要應用程式 (例如鬧鐘、電話、Messenger) 支援直接啟動。
上游 Android 開放原始碼專案提供偏好的實作方式,可根據 Linux 核心的「fscrypt」加密功能實作檔案型加密,以及根據 Linux 核心的「dm-default-key」功能實作中繼資料加密。
9.9.3.2. 個別使用者區塊層級加密
如果裝置實作使用個別使用者區塊層級加密,則會:
- [C-1-1] 必須啟用多使用者支援功能,如第 9.5 節所述。
- [C-1-2] 必須提供個別使用者分區,可使用原始分區或邏輯磁碟區。
- [C-1-3] 必須為每位使用者使用不重複的加密金鑰,以便加密基礎的區塊裝置。
-
[C-1-4] 必須使用 AES-256-XTS 對使用者分區進行區塊層級加密。
-
保護個別使用者區塊層級加密裝置的金鑰:
-
[C-1-5] 必須透過加密編譯方式,與硬體支援的 Keystore 繫結。此 KeyStore 必須綁定至已驗證的開機程序,以及裝置的硬體信任根。
- [C-1-6] 必須繫結至對應使用者的鎖定畫面憑證。
您可以使用 Linux 核心的「dm-crypt」功能,針對個別使用者的分割區實作個別使用者的區塊層級加密。
9.9.4. 重新啟動時繼續執行
重新啟動時繼續執行功能可在 OTA 啟動的重新啟動後,解鎖所有應用程式的 CE 儲存空間,包括尚未支援直接啟動的應用程式。這項功能可讓使用者在重新啟動後,接收已安裝應用程式的通知。
實作 Resume-on-Reboot 時,必須持續確保裝置落入攻擊者手中時,攻擊者即使已開啟裝置、解鎖 CE 儲存空間,且使用者在收到 OTA 後已解鎖裝置,也極難復原使用者以 CE 加密的資料。針對內部攻擊防禦機制,我們也假設攻擊者會取得廣播加密編譯金鑰的存取權。
具體違規事項如下:
-
[C-0-1] 即使攻擊者實際擁有裝置,並具備下列功能和限制,CE 儲存空間也絕對不得供其讀取:
- 可使用任何供應商或公司的簽署金鑰,簽署任意訊息。
- 可能會導致裝置接收 OTA。
- 可以修改任何硬體 (AP、閃燈等) 的運作方式,但請注意,如有需要,請在下方詳述的情況下進行修改,否則會導致延遲至少一小時,並造成電源週期毀損 RAM 內容。
- 無法修改防竄改硬體 (例如 Titan M) 的運作方式。
- 無法讀取直播裝置的 RAM。
- 無法取得使用者的憑證 (PIN 碼、解鎖圖案、密碼),或無法讓使用者輸入憑證。
舉例來說,如果裝置實作並遵循 這裡的所有說明,就會符合 [C-0-1]。
9.10. 裝置完整性
下列規定可確保裝置完整性狀態資訊公開透明。裝置實作方式:
-
[C-0-1] 必須透過系統 API 方法
PersistentDataBlockManager.getFlashLockState()
正確回報其啟動載入程式狀態是否允許刷新系統映像檔。FLASH_LOCK_UNKNOWN
狀態是為從舊版 Android 升級的裝置實作保留,因為舊版中不存在這個新的系統 API 方法。 -
[C-0-2] 必須支援驗證開機程序,以確保裝置完整性。
如果裝置實作已推出,但未在舊版 Android 上支援驗證啟動功能,且無法透過系統軟體更新新增對這項功能的支援,則可能不受這項規定的規範。
驗證開機程序是一項可確保裝置軟體完整性的功能。如果裝置實作支援這項功能,則會:
- [C-1-1] 必須宣告平台功能旗標
android.software.verified_boot
。 - [C-1-2] 必須對每次開機序列執行驗證。
- [C-1-3] 必須從信任根的不可變動硬體金鑰開始驗證,並一直到系統分區。
- [C-1-4] 必須實作各個驗證階段,在執行下一個階段的程式碼前,先檢查下一個階段中所有位元的完整性和真實性。
- [C-1-5] 請務必使用驗證演算法,且強度與 NIST 目前針對雜湊演算法 (SHA-256) 和公開金鑰大小 (RSA-2048) 的建議相同。
- [C-1-6] 系統驗證失敗時,除非使用者同意嘗試啟動,否則不得允許啟動程序完成,在這種情況下,不得使用任何未經驗證的儲存空間區塊中的資料。
- [C-1-7] 除非使用者已明確解鎖 Bootloader,否則不得修改裝置上的已驗證分區。
- [C-SR] 如果裝置中有多個獨立晶片 (例如無線電、專用圖像處理器),強烈建議在啟動時驗證每個晶片的啟動程序。
- [C-1-8] 請務必使用防竄改儲存空間:用於儲存是否已解鎖 Bootloader 的資料。防竄改儲存空間是指引導程式可偵測儲存空間是否遭到 Android 內部竄改。
- [C-1-9] 必須在使用裝置時提示使用者,並要求使用者實際確認,才能從系統啟動載入程式鎖定模式轉換至系統啟動載入程式解鎖模式。
- [C-1-10] 必須針對 Android 使用的分區 (例如啟動分區、系統分區) 實作回溯保護機制,並使用防竄改儲存空間來儲存用於判斷允許的最低 OS 版本的中繼資料。
- [C-SR] 強烈建議您使用驗證開機程序保護的分區,驗證所有特權應用程式 APK 檔案。
- [C-SR] 強烈建議您在執行由特權應用程式從 APK 檔案外部載入的可執行項 (例如動態載入的程式碼或編譯程式碼) 之前,先驗證這些可執行項,或強烈建議您完全不要執行這些可執行項。
- 應針對任何具有永久性韌體的元件 (例如數據機、相機) 實作回溯保護機制,並應使用防竄改儲存空間來儲存用於判斷允許的最小版本的結構描述資料。
如果裝置實作已推出,但在較舊版本的 Android 上不支援 C-1-8 到 C-1-10,且無法透過系統軟體更新新增支援這些規定,則可能不受這些規定約束。
上游 Android 開放原始碼計畫在 external/avb/
存放區中提供這項功能的偏好實作方式,可整合至用於載入 Android 的系統啟動載入程式。
裝置實作方式:
- [C-0-3] 必須支援以密碼編譯方式驗證檔案內容,且不必讀取整個檔案。
- [C-0-4] 當讀取內容未透過信任的金鑰驗證時,不得允許受保護檔案的讀取要求成功。
如果裝置實作功能已推出,但無法在較舊的 Android 版本中使用信任金鑰驗證檔案內容,且無法透過系統軟體更新新增對這項功能的支援,則可能不受這項規定的限制。上游 Android 開放原始碼專案提供這項功能的偏好實作方式,以 Linux 核心的 fs-verity 功能為基礎。
裝置實作方式:
- [C-R] 建議支援 Android Protected Confirmation API。
如果裝置實作支援 Android Protected Confirmation API,則會:
-
[C-3-1] 必須為
ConfirmationPrompt.isSupported()
API 回報true
。 -
[C-3-2] 請務必確保在 Android 作業系統 (包括其核心) 中執行的程式碼 (無論是否為惡意程式) 都無法在未經使用者互動情況下產生正面回應。
-
[C-3-3] 必須確保使用者能夠查看並核准提示訊息,即使 Android 作業系統 (包括核心) 遭到入侵也不例外。
9.11. 金鑰和憑證
Android KeyStore 系統可讓應用程式開發人員將加密編譯金鑰儲存在容器中,並透過 KeyChain API 或 KeyStore API 在加密編譯作業中使用這些金鑰。裝置實作方式:
- [C-0-1] 至少必須允許匯入或產生 8,192 個金鑰。
- [C-0-2] 鎖定螢幕驗證功能必須設有嘗試次數限制,且必須採用指數輪詢演算法。超過 150 次失敗嘗試後,每個嘗試之間的間隔必須至少為 24 小時。
- 不應限制可產生的鍵數量
如果裝置實作支援安全的螢幕鎖定功能,則會:
- [C-1-1] 必須使用獨立的執行環境備份 KeyStore 實作。
- [C-1-2] 必須實作 RSA、AES、ECDSA 和 HMAC 加密演算法,以及 MD5、SHA1 和 SHA-2 系列雜湊函式,才能在與核心以上層級執行的程式碼安全隔離的區域,正確支援 Android Keystore 系統支援的演算法。安全隔離功能必須封鎖所有潛在機制,以免核心或使用者空間程式碼存取隔離環境的內部狀態,包括 DMA。上游 Android 開放原始碼計畫 (AOSP) 使用 Trusty 實作項目來滿足這項規定,但其他以 ARM TrustZone 為基礎的解決方案,或第三方審查的安全實作項目,也是適當的虛擬機器人隔離方式。
- [C-1-3] 必須在隔離執行環境中執行螢幕鎖定畫面驗證,且只有在驗證成功時,才允許使用與驗證綁定的金鑰。螢幕鎖定憑證必須以只允許隔離執行環境執行螢幕鎖定驗證的方式儲存。上游 Android 開放原始碼計畫提供 Gatekeeper 硬體抽象層 (HAL) 和 Trusty,可用於滿足這項需求。
- [C-1-4] 必須支援金鑰認證,其中認證簽署金鑰受到安全硬體保護,且簽署作業是在安全硬體中執行。認證簽署金鑰必須在大量裝置上共用,以免被用作裝置 ID。如要符合這項規定,您可以共用相同的認證金鑰,除非您生產的特定 SKU 數量至少達 100,000 個。如果某個 SKU 的產量超過 100,000 個,則每 100,000 個單位可能會使用不同的鍵。
請注意,如果裝置實作已在較舊的 Android 版本上推出,則該裝置不必符合要求,即不必具備由隔離執行環境支援的金鑰存放區,也不必支援金鑰認證,除非該裝置宣告 android.hardware.fingerprint
功能,而該功能要求由隔離執行環境支援的金鑰存放區。
- [C-1-5] 您必須允許使用者選擇休眠逾時時間,以便從解鎖狀態切換為鎖定狀態,且最短逾時時間不得超過 15 秒。汽車裝置會在主機關閉或使用者切換時鎖定螢幕,因此不應設定休眠逾時設定。
9.11.1. 安全鎖定畫面和驗證機制
AOSP 實作項目採用分層驗證模式,其中以知識工廠為基礎的主要驗證作業可由次要強大生物特徵辨識或次要弱式第三方模式提供支援。
裝置實作方式:
- [C-SR] 強烈建議您只將下列其中一種方法設為主要驗證方法:
- 數字 PIN 碼
- 英數密碼
- 在 3x3 點的格狀圖案上滑動
請注意,上述驗證方法是本文中建議的主要驗證方法。
如果裝置實作新增或修改建議的主要驗證方法,並使用新驗證方法做為鎖定螢幕的安全方法,新驗證方法必須符合下列條件:
- [C-2-1] 必須是「要求驗證使用者才能使用金鑰」一文中所述的使用者驗證方法。
如果裝置實作內容會在使用已知機密值時,新增或修改驗證方法來解鎖螢幕鎖定畫面,並使用新的驗證方法,以便視為安全的螢幕鎖定方式:
- [C-3-1] 最短允許輸入長度的熵值必須大於 10 位元。
- [C-3-2] 所有可能輸入內容的最大熵值必須大於 18 位元。
- [C-3-3] 新驗證方法不得取代 AOSP 中實作及提供的任何建議主要驗證方法 (例如 PIN 碼、圖形密碼、密碼)。
- [C-3-4] 如果裝置政策控制器 (DPC) 應用程式已透過
DevicePolicyManager.setPasswordQuality()
方法設定密碼品質政策,且品質常數比PASSWORD_QUALITY_SOMETHING
更嚴格,則必須停用新的驗證方法。 - [C-3-5] 新的驗證方法必須每 72 小時或更短時間,改用建議的主要驗證方法 (例如 PIN 碼、圖形密碼、密碼),或是向使用者清楚說明為了保護資料隱私權,系統不會備份部分資料。
如果裝置實作新增或修改建議的主要驗證方法來解鎖鎖定畫面,並使用以生物特徵辨識為基礎的新驗證方法,以便視為安全的鎖定畫面方法,則新方法必須符合下列條件:
- [C-4-1] 必須符合第 7.3.10 節中 第 1 級 (舊稱 便利性) 的所有規定。
- [C-4-2] 必須提供備用機制,以便使用建議的主要驗證方法之一,該方法必須以已知的密鑰為基礎。
- [C-4-3] 必須停用,且僅允許建議的主要驗證機制解鎖螢幕,前提是裝置政策控制器 (DPC) 應用程式已透過呼叫
DevicePolicyManager.setKeyguardDisabledFeatures()
方法,搭配任何相關的生物特徵標記 (例如KEYGUARD_DISABLE_BIOMETRICS
、KEYGUARD_DISABLE_FINGERPRINT
、KEYGUARD_DISABLE_FACE
或KEYGUARD_DISABLE_IRIS
) 設定鎖定畫面功能政策。
如果生物特徵辨識驗證方法不符合 第 7.3.10 節所述的第 3 級 (舊稱強式) 規定:
- [C-5-1] 如果裝置政策控制器 (DPC) 應用程式已透過
DevicePolicyManager.setPasswordQuality()
方法設定密碼品質政策,且品質常數比PASSWORD_QUALITY_BIOMETRIC_WEAK
更嚴格,則必須停用這些方法。 - [C-5-2] 如第 7.3.10 節的 [C-1-7] 和 [C-1-8] 所述,使用者必須接受建議的主要驗證方式 (例如 PIN 碼、解鎖圖案、密碼) 驗證。
- [C-5-3] 方法不得視為安全鎖定畫面,且必須符合本節中 C-8 以下的規定。
如果裝置實作新增或修改驗證方法來解鎖螢幕鎖定畫面,且新驗證方法是根據實體權杖或位置:
- [C-6-1] 必須提供備用機制,以便使用建議的主要驗證方法之一,該方法必須以已知的密鑰為基礎,且符合視為安全螢幕鎖定畫面的條件。
- [C-6-2] 當裝置政策控制器 (DPC) 應用程式使用
DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_TRUST_AGENTS)
方法或DevicePolicyManager.setPasswordQuality()
方法 (比PASSWORD_QUALITY_UNSPECIFIED
更嚴格的品質常數) 設定政策時,新方法必須停用,且只允許使用其中一種建議的主要驗證方法解鎖螢幕。 - [C-6-3] 使用者必須每隔 4 小時或更短時間,至少接受一次建議的主要驗證方法 (例如 PIN 碼、解鎖圖案、密碼) 的驗證。
- [C-6-4] 新方法不得視為安全的鎖定畫面,且必須遵循下方 C-8 所列的限制。
如果裝置實作項目設有安全的鎖定畫面,且包含實作 TrustAgentService
系統 API 的一或多個信任代理程式,則這些代理程式會執行以下操作:
- [C-7-1] 當裝置鎖定功能延遲或可由信任代理程式解鎖時,必須在設定選單和螢幕鎖定畫面上清楚顯示相關資訊。舉例來說,AOSP 會在設定選單中顯示「自動鎖定設定」和「電源鍵立即鎖定」的文字說明,並在螢幕鎖定畫面上顯示可辨識的圖示,以符合這項規定。
- [C-7-2] 必須尊重並完整實作
DevicePolicyManager
類別中的所有信任代理程式 API,例如KEYGUARD_DISABLE_TRUST_AGENTS
常數。 - [C-7-3] 請勿在用於個人主要裝置 (例如手持裝置) 的裝置上完全實作
TrustAgentService.addEscrowToken()
功能,但可在通常共用的裝置實作中完全實作此功能 (例如 Android TV 或車用裝置)。 - [C-7-4] 必須加密
TrustAgentService.addEscrowToken()
新增的所有已儲存權杖。 - [C-7-5] 請勿將加密金鑰或擔保金鑰代碼儲存在使用金鑰的裝置上。舉例來說,使用者可以透過手機上的金鑰解鎖電視上的使用者帳戶。對於 Automotive 裝置,系統不允許將擔保金代碼儲存在車輛的任何部分。
- [C-7-6] 必須先向使用者說明安全性影響,才能啟用擔保權杖來解密資料儲存空間。
- [C-7-7] 必須提供備用機制,以便使用建議的主要驗證方法。
- [C-7-8] 除非使用者安全 (例如駕駛人分心) 有疑慮,否則使用者必須至少每 72 小時接受一次建議的主要驗證方法 (例如 PIN 碼、圖案、密碼) 挑戰。
- [C-7-9] 除非使用者安全性 (例如駕駛人分心) 有疑慮,否則使用者必須接受挑戰,採用 7.3.10 節的 [C-1-7] 和 [C-1-8] 所述的其中一種建議主要驗證方法 (例如 PIN 碼、圖形密碼、密碼)。
- [C-7-10] 不得視為安全的鎖定畫面,且必須遵循下方 C-8 所列的限制。
- [C-7-11] 絕對不允許主要個人裝置 (例如手持裝置) 上的 TrustAgent 解鎖裝置,且只能將已解鎖的裝置維持在解鎖狀態,最多 4 小時。AOSP 中 TrustManagerService 的預設實作方式符合這項規定。
- [C-7-12] 必須使用加密編譯安全 (例如 UKEY2) 通訊管道,將擔保憑證從儲存裝置傳遞至目標裝置。
如果裝置實作項目新增或修改驗證方法,以解鎖非上述安全鎖定畫面的鎖定畫面,並使用新的驗證方法解鎖鎖定畫面:
- [C-8-1] 如果裝置政策控制器 (DPC) 應用程式已透過
DevicePolicyManager.setPasswordQuality()
方法設定密碼品質政策,且品質常數比PASSWORD_QUALITY_UNSPECIFIED
更嚴格,則必須停用新方法。 - [C-8-2] 不得重設
DevicePolicyManager.setPasswordExpirationTimeout()
設定的密碼到期計時器。 - [C-8-3] 不得公開 API,供第三方應用程式使用來變更鎖定狀態。
9.11.2. StrongBox
Android KeyStore 系統可讓應用程式開發人員將加密編譯金鑰儲存在專屬安全處理器和上述隔離執行環境中。這種專用安全處理器稱為「StrongBox」。下列 C-1-3 至 C-1-11 項規定,定義了裝置必須符合的條件,才能符合 StrongBox 資格。
裝置實作方式,其中包含專屬安全處理器:
- [C-SR] 強烈建議支援 StrongBox。日後版本可能會要求使用 StrongBox。
如果裝置實作項目支援 StrongBox,則會:
-
[C-1-1] 必須宣告 FEATURE_STRONGBOX_KEYSTORE。
-
[C-1-2] 您必須提供專用安全硬體,用於備份 KeyStore 和安全使用者驗證機制。專用安全硬體也可用於其他用途。
-
[C-1-3] 必須具備獨立 CPU,且不與應用程式處理器 (AP) 共用快取、DRAM、協同處理器或其他核心資源。
-
[C-1-4] 務必確保與 AP 共用的任何外接裝置無法以任何方式變更 StrongBox 處理作業,或從 StrongBox 取得任何資訊。AP 可能會停用或封鎖對 StrongBox 的存取權。
-
[C-1-5] 必須具備準確度合理 (+-10%) 的內部時鐘,且不受 AP 操控。
-
[C-1-6] 必須使用真正的隨機號碼產生器,產生均勻分布的不可預測輸出內容。
-
[C-1-7] 必須具備防竄改功能,包括防範實體侵入和故障。
-
[C-1-8] 必須具備側通道抵抗力,包括抵抗透過電力、時間、電磁輻射和熱輻射側通道洩漏資訊的行為。
-
[C-1-9] 必須提供安全的儲存空間,確保內容的機密性、完整性、真實性、一致性和新鮮度。除了 StrongBox API 允許的情況外,儲存空間不得讀取或變更。
-
如要驗證是否符合 [C-1-3] 至 [C-1-9] 的規定,裝置實作項目必須:
- [C-1-10] 硬體必須通過「安全 IC 保護設定檔」BSI-CC-PP-0084-2014 認證,或是由國家認可的測試實驗室評估,並根據「Common Criteria Application of Attack Potential to Smartcards」評估高攻擊潛力的漏洞。
- [C-1-11] 必須納入經國家認證測試實驗室評估的韌體,並根據Common Criteria Application of Attack Potential to Smartcards 評估高攻擊潛力的安全漏洞。
- [C-SR] 強烈建議加入使用安全目標評估的硬體,評估等級為 5 (EAL),並由 AVA_VAN.5 加強。EAL 5 認證很可能會成為日後版本的必要條件。
-
我們強烈建議使用 [C-SR] 來提供內部人攻擊防禦機制 (IAR),也就是說,如果內部人員有權存取韌體簽署金鑰,就無法產生會導致 StrongBox 洩漏機密資料的韌體,以便繞過功能性安全性規定,或以其他方式存取機密使用者資料。實作 IAR 的建議方式,是在透過 IAuthSecret HAL 提供主要使用者密碼時,允許韌體更新。
9.11.3. 身分憑證
您可以實作 android.security.identity.*
套件中的所有 API,定義並建立身分憑證系統。這些 API 可讓應用程式開發人員儲存及擷取使用者身分文件。裝置實作方式:
- [C-SR] 強烈建議您導入身分憑證系統。
如果裝置實作導入身分憑證系統,則會:
-
[C-0-1] 對於 IdentityCredentialStore#getInstance() 方法,必須傳回非空值。
-
[C-0-2] 必須在與核心以上層級執行的程式碼安全隔離的區域中,使用與信任應用程式通訊的程式碼,實作身分憑證系統 (例如
android.security.identity.*
API)。安全隔離功能必須封鎖所有潛在機制,以免核心或使用者空間程式碼存取隔離環境的內部狀態,包括 DMA。 -
[C-0-3] 實作身分憑證系統所需的加密作業 (例如
android.security.identity.*
API) 必須完全在受信任的應用程式中執行,且私密金鑰素材不得離開隔離執行環境,除非高階 API (例如 createEphemeralKeyPair() 方法) 有特別需求。 -
[C-0-4] 信任的應用程式必須以不會影響其安全性屬性的方式實作,例如,除非滿足存取權控管條件,否則不會釋出憑證資料,也無法為任意資料產生 MAC,即使 Android 發生異常或遭到入侵也不例外。
9.12. 資料刪除
所有裝置實作:
- [C-0-1] 必須提供使用者執行「恢復原廠設定」的機制。
- [C-0-2] 必須刪除 userdata 檔案系統中的所有資料。
- [C-0-3] 必須以符合相關業界標準 (例如 NIST SP800-88) 的方式刪除資料。
- [C-0-4] 當主要使用者的裝置政策控制器應用程式呼叫
DevicePolicyManager.wipeData()
API 時,必須觸發上述「工廠資料重設」程序。 - 可提供快速資料清除選項,只執行邏輯資料擦除作業。
9.13. 安全啟動模式
Android 提供安全啟動模式,可讓使用者在該模式下啟動裝置,僅執行預先安裝的系統應用程式,並停用所有第三方應用程式。這個模式稱為「安全啟動模式」,可讓使用者解除安裝可能有害的第三方應用程式。
裝置實作方式如下:
- [SR] 強烈建議您實作安全啟動模式。
如果裝置實作導入安全啟動模式,則會:
-
[C-1-1] 必須提供使用者進入安全啟動模式的選項,且該選項必須以裝置上安裝的第三方應用程式無法中斷的方式運作,除非第三方應用程式是裝置政策控制器,且已將
UserManager.DISALLOW_SAFE_BOOT
標記設為 true。 -
[C-1-2] 必須讓使用者能夠在安全模式下解除安裝任何第三方應用程式。
-
應為使用者提供選項,讓他們透過與一般開機不同的工作流程,從開機選單進入安全模式。
9.14. 汽車車輛系統隔離
Android Automotive 裝置應透過 車輛 HAL,透過 CAN 匯流排等車輛網路傳送及接收訊息,與重要車輛子系統交換資料。
您可以實作 Android 架構層以下的安全性功能,防止與這些子系統的惡意或非預期互動,藉此保護資料交換機制。
9.15. 訂閱方案
「訂閱方案」是指行動電信業者透過 SubscriptionManager.setSubscriptionPlans()
提供的帳單關聯方案詳細資料。
所有裝置實作:
- [C-0-1] 必須將訂閱方案傳回給最初提供這些方案的行動電信業者應用程式。
- [C-0-2] 不得從遠端備份或上傳訂閱方案。
- [C-0-3] 僅允許目前提供有效訂閱方案的行動電信業者應用程式,提供覆寫值,例如
SubscriptionManager.setSubscriptionOverrideCongested()
。
9.16。應用程式資料遷移
如果裝置實作功能可將資料從裝置遷移至另一部裝置,且不會將複製的應用程式資料限制為應用程式開發人員透過 android:fullBackupContent 屬性在資訊清單中設定的內容,則:
- [C-1-1] 應用程式不得從使用者未設定主要驗證機制的裝置啟動資料傳輸作業,如9.11.1 安全鎖定畫面和驗證機制所述。
- [C-1-2] 在傳輸任何資料前,務必安全確認來源裝置上的主驗證,並確認使用者有意在來源裝置上複製資料。
- [C-1-3] 必須使用安全金鑰認證,確保裝置對裝置遷移作業中的來源裝置和目標裝置都是合法的 Android 裝置,且具有鎖定的引導程式。
- [C-1-4] 您只能將應用程式資料遷移至目標裝置上的相同應用程式,且套件名稱和簽署憑證也必須相同。
- [C-1-5] 設定選單中必須顯示,來源裝置已透過裝置間資料遷移功能遷移資料。使用者不應能夠移除這項指示。
10. 軟體相容性測試
裝置實作項目必須通過本節所述的所有測試。不過,請注意,沒有任何軟體測試套件是完全全面的。因此,我們強烈建議裝置實作人員盡可能減少對 Android 參考和偏好實作的變更次數,這些實作方式可從 Android 開放原始碼計畫取得。這麼做可盡量降低引入錯誤的風險,避免出現需要重新處理的錯誤,並可能需要更新裝置。
10.1. 相容性測試套件
裝置實作方式:
-
[C-0-1] 必須使用裝置上的最終發布軟體,通過 Android 相容性測試套件 (CTS) (可從 Android 開放原始碼計畫取得)。
-
[C-0-2] 如有 CTS 的模糊情況,以及任何參考原始碼的重新實作,都必須確保相容性。
CTS 設計用於在實際裝置上執行。和其他軟體一樣,CTS 本身可能也會有錯誤。CTS 的版本會與此相容性定義獨立管理,且 Android 11 可能會發布多個 CTS 修訂版本。
裝置實作方式:
-
[C-0-3] 必須通過裝置軟體完成時可用的最新 CTS 版本。
-
應盡可能使用 Android 開放原始碼樹狀結構中的參考實作項目。
10.2. CTS 驗證器
CTS Verifier 是 Compatibility Test Suite 的一部分,可由人為操作員執行,用於測試自動化系統無法測試的功能,例如相機和感應器的正確運作。
裝置實作方式:
- [C-0-1] 必須在 CTS 驗證器中正確執行所有適用的案例。
CTS Verifier 可測試多種硬體,包括部分選用硬體。
裝置實作方式:
- [C-0-2] 必須通過所有硬體測試;舉例來說,如果裝置有加速計,則必須在 CTS Verifier 中正確執行加速計測試案例。
針對本相容性定義說明文件中標示為選用的功能,測試案例可省略或略過。
- [C-0-2] 如上所述,每部裝置和每個版本都必須正確執行 CTS Verifier。不過,由於許多版本都非常相似,因此裝置實作者不應在僅有細微差異的版本上明確執行 CTS 驗證工具。具體來說,如果裝置實作項目與通過 CTS 驗證工具的實作項目僅在所包含的語言代碼、品牌等方面有所差異,則可省略 CTS 驗證工具測試。
11. 可更新軟體
-
[C-0-1] 裝置實作必須包含替換整個系統軟體的機制。這項機制不需要執行「即時」升級,也就是說,可能需要重新啟動裝置。只要能取代裝置上預先安裝的軟體,您可以使用任何方法。舉例來說,下列任何一種做法都能滿足這項要求:
- 透過重新啟動進行離線更新的「無線更新」(OTA) 下載。
- 透過主機電腦的 USB 連線進行「連線」更新。
- 透過重新啟動和從可移除儲存空間的檔案更新「離線」更新。
-
[C-0-2] 使用的更新機制必須支援不清除使用者資料的更新作業。也就是說,更新機制必須保留應用程式私人資料和應用程式共用資料。請注意,上游 Android 軟體包含符合這項需求的更新機制。
-
[C-0-3] 整個更新檔案必須經過簽署,裝置端更新機制也必須根據儲存在裝置上的公開金鑰驗證更新檔案和簽章。
- [C-SR] 強烈建議使用 SHA-256 雜湊更新,並使用 ECDSA NIST P-256 驗證公開金鑰。
如果裝置實作項目支援不計量的資料連線 (例如 802.11 或藍牙 PAN (個人區域網路) 設定檔),則必須符合下列條件:
- [C-1-1] 必須支援透過重新啟動進行離線更新的 OTA 下載作業。
對於搭載 Android 6.0 以上版本的裝置實作,更新機制應支援驗證系統映像檔與 OTA 後的預期結果是否相同。自 Android 5.1 版起新增的源端 Android 開放原始碼計畫中的區塊式 OTA 實作,可滿足這項需求。
此外,裝置實作也應支援 A/B 系統更新。AOSP 會使用啟動控制 HAL 實作這項功能。
如果在裝置推出後,但在與 Android 相容性團隊協商後判斷的合理產品壽命期間內,發現裝置實作有錯誤,導致第三方應用程式相容性受影響,請採取以下行動:
- [C-2-1] 裝置實作者必須透過可用的軟體更新來修正錯誤,且該更新必須能套用剛才所述的機制。
Android 包含多項功能,可讓裝置擁有者應用程式 (如有) 控制系統更新的安裝作業。如果裝置的系統更新子系統回報 android.software.device_admin,則會發生以下情況:
- [C-3-1] 必須實作 SystemUpdatePolicy 類別中所述的行為。
12. 文件變更記錄
如要查看本版本相容性定義的變更摘要,請參閱以下內容:
以下是各個部分的異動摘要:
12.1. 變更記錄查看提示
變更內容如下所示:
-
CDD
相容性規定的重大變更。 -
文件
外觀或建構相關變更。
為獲得最佳瀏覽體驗,請將 pretty=full
和 no-merges
網址參數附加至變更記錄網址。
13. 與我們聯絡
您可以加入 android-compatibility 論壇,提出疑問或提出您認為文件未涵蓋的任何問題。