Android 11 相容性定義

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

MUST 需求會指派需求 ID。

  • ID 僅適用於「必須」要求。
  • STRONGLY RECOMMENDED 要求標示為 [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 手持式裝置實作。

注意:不適用於 Android 平板電腦裝置的規定會標上星號「*」。

2.2.1. 硬體

手持裝置實作方式:

  • [7.1.1.1/H-0-1] 必須至少有一個符合本文件所有規定的 Android 相容螢幕。
  • [7.1.1.3/H-SR] 建議提供使用者變更顯示大小 (螢幕密度) 的功能。

如果手持式裝置實作項目支援軟體螢幕旋轉,則:

  • [7.1.1.1/H-1-1]* 必須確保提供給第三方應用程式的邏輯螢幕,短邊至少 2 吋,長邊至少 2.7 吋。如果裝置的 API 級別早於本文所述,則可免除這項規定。

如果手持式裝置實作項目不支援軟體螢幕旋轉功能,則:

  • [7.1.1.1/H-2-1]* MUST make the logical screen that is made available for third party applications be at least 2.7 inches on the short edge(s). 如果裝置的 API 級別早於本文所述,則可免除這項規定。

如果手持裝置實作項目透過 Configuration.isScreenHdr() 聲明支援高動態範圍螢幕,則:

  • [7.1.4.5/H-1-1] 必須宣傳支援 EGL_EXT_gl_colorspace_bt2020_pqEGL_EXT_surface_SMPTE2086_metadataEGL_EXT_surface_CTA861_3_metadataVK_EXT_swapchain_colorspaceVK_EXT_hdr_metadata 擴充功能。

手持裝置實作方式:

  • [7.1.4.6/H-0-1] 裝置必須透過系統屬性 graphics.gpu.profiler.support 回報是否支援 GPU 剖析功能。

如果手持式裝置實作項目透過系統屬性 graphics.gpu.profiler.support 宣告支援,則:

手持裝置實作方式:

  • [7.1.5/H-0-1] 必須支援上游 Android 開放原始碼實作的舊版應用程式相容模式。也就是說,裝置實作「不得」變更啟動相容模式的觸發條件或門檻,也「不得」變更相容模式本身的行為。
  • [7.2.1/H-0-1] 必須支援第三方輸入法編輯器 (IME) 應用程式。
  • [7.2.3/H-0-3] 必須在所有提供主畫面的 Android 相容螢幕上提供「首頁」功能。
  • [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 的應用程式,或處理 ACTION_ASSIST 的活動 (如果前景活動未處理這些長按事件),方法是長按 KEYCODE_MEDIA_PLAY_PAUSEKEYCODE_HEADSETHOOK
  • [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 公尺內的位置,以及 0.2 公尺/秒內的速度。

如果手持裝置實作項目包含 3 軸陀螺儀,則:

  • [7.3.4/H-3-1] 必須能夠以至少 100 Hz 的頻率回報事件。
  • [7.3.4/H-3-2] 必須能夠測量每秒高達 1000 度的方向變化。

手持式裝置實作項目,可撥打語音通話,並在 getPhoneType 中指出 PHONE_TYPE_NONE 以外的任何值:

  • [7.3.8/H] 應包含鄰近感應器。

手持裝置實作方式:

  • [7.3.11/H-SR] 建議支援 6 自由度姿勢感應器。
  • [7.4.3/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,則 MUST 針對 ActivityManager.isLowRamDevice() 回傳「true」。

如果手持式裝置實作項目只宣告支援 32 位元 ABI:

  • [7.6.1/H-1-1] 如果預設螢幕使用高達 qHD (例如 FWVGA) 的訊框緩衝區解析度,核心和使用者空間可用的記憶體必須至少為 416 MB。

  • [7.6.1/H-2-1] 如果預設螢幕使用 HD+ (例如 HD、WSVGA) 以下的緩衝區解析度,核心和使用者空間可用的記憶體必須至少為 592 MB。

  • [7.6.1/H-3-1] 如果預設螢幕使用高達 FHD (例如 WSXGA+) 的訊框緩衝區解析度,核心和使用者空間可用的記憶體必須至少為 896MB。

  • [7.6.1/H-4-1] 如果預設螢幕使用高達 QHD (例如 QWXGA) 的訊框緩衝區解析度,核心和使用者空間可用的記憶體必須至少為 1344 MB。

如果手持式裝置實作項目聲明支援任何 64 位元 ABI (無論是否支援任何 32 位元 ABI):

  • [7.6.1/H-5-1] 如果預設螢幕使用高達 qHD (例如 FWVGA) 的訊框緩衝區解析度,核心和使用者空間可用的記憶體必須至少為 816MB。

  • [7.6.1/H-6-1] 如果預設螢幕使用 HD+ (例如 HD、WSVGA) 以下的緩衝區解析度,核心和使用者空間可用的記憶體必須至少為 944MB。

  • [7.6.1/H-7-1] 如果預設螢幕使用高達 FHD (例如 WSXGA+) 的 Framebuffer 解析度,核心和使用者空間可用的記憶體必須至少為 1280MB。

  • [7.6.1/H-8-1] 如果預設螢幕使用高達 QHD (例如 QWXGA) 的訊框緩衝區解析度,核心和使用者空間可用的記憶體必須至少為 1824MB。

請注意,上文提及的「核心和使用者空間可用的記憶體」是指除了已專用於無線電、影片等硬體元件的記憶體空間外,額外提供的記憶體空間,這些元件並非由裝置實作中的核心控制。

如果手持式裝置實作項目提供給核心和使用者空間的記憶體小於或等於 1 GB,則:

  • [7.6.1/H-9-1] MUST declare the feature flag android.hardware.ram.low.
  • [7.6.1/H-9-2] 必須具備至少 1.1 GB 的非揮發性儲存空間,用於存放應用程式私人資料 (又稱「/data」分割區)。

如果手持式裝置實作項目包含超過 1 GB 的記憶體 (可供核心和使用者空間使用),則:

  • [7.6.1/H-10-1] 必須提供至少 4 GB 的非揮發性儲存空間,供應用程式私人資料使用 (又稱「/data」分割區)。
  • 應宣告功能旗標 android.hardware.ram.normal

手持裝置實作方式:

  • [7.6.2/H-0-1] 不得提供小於 1 GiB 的應用程式共用儲存空間。
  • [7.7.1/H] SHOULD include a USB port supporting peripheral mode.

如果手持式裝置實作項目包含支援周邊模式的 USB 連接埠,則:

  • [7.7.1/H-1-1] 必須實作 Android 開放式配件 (AOA) API。

如果手持式裝置實作項目包含支援主機模式的 USB 連接埠,則:

手持裝置實作方式:

  • [7.8.1/H-0-1] 必須包含麥克風。
  • [7.8.2/H-0-1] 必須具備音訊輸出功能,並宣告 android.hardware.audio.output

如果手持裝置實作項目能夠滿足支援 VR 模式的所有效能需求,並包含支援項目,則:

  • [7.9.1/H-1-1] 必須宣告 android.hardware.vr.high_performance 功能旗標。
  • [7.9.1/H-1-2] MUST include an application implementing android.service.vr.VrListenerService that can be enabled by VR applications via android.app.Activity#setVrModeEnabled.

如果手持裝置實作項目在主機模式中包含一或多個 USB-C 連接埠,且實作 (USB 音訊類別),則除了第 7.7.2 節中的規定外,還須:

  • [7.8.2.2/H-1-1] 必須提供以下 HID 代碼的軟體對應:
函式 對應 Context 行為
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] MUST broadcast Intent ACTION_HEADSET_PLUG with "microphone" extra set to 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,則 MUST 會列出 AudioDeviceInfo.TYPE_USB_HEADSET 類型的裝置,且 role isSink()。

  • [7.8.2.2/H-4-2] 如果 USB 音訊終端機類型欄位為 0x0402,則 MUST 會列出 AudioDeviceInfo.TYPE_USB_HEADSET 類型的裝置,且 role isSink()。

  • [7.8.2.2/H-4-3] 如果 USB 音訊終端機類型欄位為 0x0402,則 MUST 會列出 AudioDeviceInfo.TYPE_USB_HEADSET 類型的裝置,且 role 為 isSource()。

  • [7.8.2.2/H-4-4] 如果 USB 音訊終端機類型欄位為 0x603,則必須列出類型為 AudioDeviceInfo.TYPE_USB_DEVICE 的裝置,且 role isSink()。

  • [7.8.2.2/H-4-5] 如果 USB 音訊終端機類型欄位為 0x604,則必須列出 AudioDeviceInfo.TYPE_USB_DEVICE 類型的裝置,且角色為 isSource()。

  • [7.8.2.2/H-4-6] 如果 USB 音訊終端機類型欄位為 0x400,則 MUST 列出 AudioDeviceInfo.TYPE_USB_DEVICE 類型的裝置,且 role isSink()。

  • [7.8.2.2/H-4-7] 如果 USB 音訊終端機類型欄位為 0x400,則 MUST 會列出 AudioDeviceInfo.TYPE_USB_DEVICE 類型的裝置,且 role 為 isSource()。

  • [7.8.2.2/H-SR] 連接 USB-C 音訊周邊裝置時,強烈建議在 1000 毫秒內執行 USB 描述元列舉、識別終端機類型,並廣播 Intent ACTION_HEADSET_PLUG。

如果手持式裝置實作項目至少包含一個觸覺致動器,則:

線性共振致動器 (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 設定檔 (AAC+)
  • [5.1/H-0-5] AAC ELD (增強型低延遲 AAC)

手持裝置實作項目必須支援下列影片編碼格式,並提供給第三方應用程式:

  • [5.2/H-0-1] H.264 AVC
  • [5.2/H-0-2] VP8

手持裝置實作項目「必須」支援下列影片解碼格式,並提供給第三方應用程式:

  • [5.3/H-0-1] H.264 AVC
  • [5.3/H-0-2] H.265 HEVC
  • [5.3/H-0-3] MPEG-4 SP
  • [5.3/H-0-4] VP8
  • [5.3/H-0-5] VP9

2.2.3. 軟體

手持裝置實作方式:

如果手持裝置實作支援「協助」動作,則:

  • [3.8.4/H-SR] 強烈建議使用長按 HOME 鍵做為啟動輔助應用程式的指定互動方式,如第 7.2.3 節所述。必須啟動使用者選取的輔助應用程式,也就是實作 VoiceInteractionService 的應用程式,或是處理 ACTION_ASSIST 意圖的活動。

如果手持裝置實作項目支援 conversation notifications,並將其與警示和靜音非對話通知分組到不同區段,則:

  • [3.8.4/H-1-1]* 必須優先顯示對話通知,再顯示非對話通知,但持續進行中的前景服務通知和重要性:高通知除外。

如果 Android 手持式裝置實作項目支援螢幕鎖定,則:

  • [3.8.10/H-1-1] 必須顯示螢幕鎖定通知,包括媒體通知範本。

如果手持式裝置實作項目支援安全螢幕鎖定,則:

  • [3.9/H-1-1] 必須實作 Android SDK 文件中定義的完整裝置管理政策。
  • [3.9/H-1-2] 除非裝置設定為回報自身為低 RAM 裝置,或將內部 (不可移除) 儲存空間分配為共用儲存空間,否則 MUST 透過 android.software.managed_users 功能旗標宣告支援受管理設定檔。

如果手持式裝置實作項目支援 ControlsProviderServiceControl API,並允許第三方應用程式發布裝置控制項,則:

  • [3.8.16/H-1-1] MUST declare the feature flag android.software.controls and set it to true.
  • [3.8.16/H-1-2] 必須提供使用者介面,讓使用者透過 ControlsProviderServiceControl API,新增、編輯、選取及操作第三方應用程式註冊的愛用裝置控制項。
  • [3.8.16/H-1-3] 必須在預設啟動器中,提供三項互動內的這項使用者功能。
  • [3.8.16/H-1-4] 必須在這個使用者介面中,準確顯示透過 ControlsProviderService API 提供控制項的每個第三方應用程式名稱和圖示,以及 Control API 提供的任何指定欄位。

反之,如果手持式裝置實作項目未實作這類控制項,則:

手持裝置實作方式:

  • [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_BLUETOOTHFEATURE_WIFI,則:

  • [3.16/H-1-1] 必須支援隨附裝置配對功能。

如果導覽功能是以螢幕上的手勢動作提供:

  • [7.2.3/H]「首頁」功能的手勢辨識區高度應不超過螢幕底部的 32 dp。

如果手持式裝置實作項目提供導覽功能,可從螢幕左右兩側的任何位置以手勢操作:

  • [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 Compatibility Test Suite (CTS) 定義的 1 萬個清單項目。
  • [8.1/H-0-3] 工作切換。啟動多個應用程式後,重新啟動已在執行的應用程式時,必須在 1 秒內完成。

手持裝置實作方式:

  • [8.2/H-0-1] MUST ensure a sequential write performance of at least 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.3/H-1-1] 必須提供使用者介面,讓使用者啟用及停用省電功能。
  • [8.3/H-1-2] 必須提供使用者介面,顯示所有已排除在「應用程式待機」和「螢幕關閉進入休眠」省電模式外的應用程式。

手持裝置實作方式:

  • [8.4/H-0-1] 必須提供每個元件的電力設定檔,定義每個硬體元件的電流消耗值,以及元件隨時間造成的概略電池耗電量,如 Android 開放原始碼計畫網站所述。
  • [8.4/H-0-2] 必須以毫安時 (mAh) 回報所有耗電量值。
  • [8.4/H-0-3] MUST report CPU power consumption per each process's UID. Android 開放原始碼計畫透過 uid_cputime 核心模組實作項目,滿足這項需求。
  • [8.4/H-0-4] 必須透過 adb shell dumpsys batterystats shell 指令,向應用程式開發人員提供電力用量資訊。
  • [8.4/H] 如果無法將硬體元件耗電量歸因於應用程式,則應將其歸因於硬體元件本身。

如果手持式裝置實作項目包含螢幕或視訊輸出,則:

2.2.5. 安全模式

手持裝置實作方式:

  • [9.1/H-0-1] MUST allow third-party apps to access the usage statistics via the android.permission.PACKAGE_USAGE_STATS permission and provide a user-accessible mechanism to grant or revoke access to such apps in response to the android.settings.ACTION_USAGE_ACCESS_SETTINGS intent.

手持式裝置實作方式 (* 不適用於平板電腦):

  • [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]* MUST perform the lock screen authentication in the isolated execution environment and only when successful, allow the authentication-bound keys to be used. 螢幕鎖定憑證的儲存方式必須確保只有隔離的執行環境可以執行螢幕鎖定驗證。上游 Android 開放原始碼計畫提供 Gatekeeper 硬體抽象層 (HAL) 和 Trusty,可用於滿足這項需求。
  • [9.11/H-0-5]* 必須支援金鑰認證,其中認證簽署金鑰受到安全硬體保護,且簽署作業在安全硬體中執行。認證簽署金鑰必須在足夠數量的裝置間共用,才能防止金鑰做為裝置 ID 使用。如要符合這項規定,除非特定 SKU 的產量至少達到 10 萬部,否則請共用相同的認證金鑰。如果 SKU 的生產數量超過 10 萬個,每 10 萬個單位可能使用不同的金鑰。

請注意,如果裝置實作作業已在較早的 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]* 必須支援殼層指令 cmd testharness

手持式裝置實作方式 (* 不適用於平板電腦):

  • Perfetto
    • [6.1/H-0-2]* MUST expose a /system/bin/perfetto binary to the shell user which cmdline complies with the perfetto documentation.
    • [6.1/H-0-3]* perfetto 二進位檔必須接受 protobuf 設定做為輸入內容,且該設定必須符合perfetto 說明文件中定義的結構。
    • [6.1/H-0-4]* perfetto 二進位檔必須輸出符合perfetto 文件中定義結構定義的 protobuf 追蹤記錄。
    • [6.1/H-0-5]* MUST provide, through the perfetto binary, at least the data sources described in the perfetto documentation.
    • [6.1/H-0-6]* The perfetto traced daemon MUST be enabled by default (system property persist.traced.enable).

2.2.7 手持式媒體效能類別

如需媒體成效類別的定義,請參閱第 7.11 節。

2.2.7.1. 媒體

如果手持式裝置實作會針對 android.os.Build.VERSION_CODES.R 傳回 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS,則:

  • [5.1/H-1-1] 必須透過 CodecCapabilities.getMaxSupportedInstances()VideoCapabilities.getSupportedPerformancePoints() 方法,宣傳在任何轉碼器組合中可同時執行的硬體視訊解碼器工作階段數量上限。
  • [5.1/H-1-2] MUST support 6 instances of hardware video decoder sessions (AVC or HEVC) in any codec combination running concurrently at 720p resolution@30 fps.
  • [5.1/H-1-3] 必須透過 CodecCapabilities.getMaxSupportedInstances()VideoCapabilities.getSupportedPerformancePoints() 方法,宣傳在任何轉碼器組合中可同時執行的硬體視訊編碼器工作階段數量上限。
  • [5.1/H-1-4] MUST support 6 instances of hardware video encoder sessions (AVC or HEVC) in any codec combination running concurrently at 720p resolution@30 fps.
  • [5.1/H-1-5] 必須透過 CodecCapabilities.getMaxSupportedInstances()VideoCapabilities.getSupportedPerformancePoints() 方法,宣傳可在任何編解碼器組合中並行執行的硬體視訊編碼器和解碼器工作階段數量上限。
  • [5.1/H-1-6] MUST support 6 instances of hardware video decoder and hardware video encoder sessions (AVC or HEVC) in any codec combination running concurrently at 720p@30 fps resolution.
  • [5.1/H-1-7] 在負載情況下,所有硬體視訊編碼器 (Dolby Vision 編碼器除外) 的 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.R 傳回 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS,則:

  • [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] 針對兩個主鏡頭,在 ITS 照明條件 (3000K) 下,透過 CTS 攝影機 PerformanceTest 測量,1080p 解析度的 camera2 JPEG 擷取延遲時間必須 < 1000 毫秒。
  • [7.5/H-1-6] 兩部主鏡頭在 ITS 照明條件 (3000K) 下,透過 CTS 攝影機 PerformanceTest 測得的 camera2 啟動延遲時間 (開啟攝影機到第一個預覽畫面) 必須 < 600 毫秒。
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 英尺外 (「靠後」或「10 英尺使用者介面」) 觀看數位媒體、電影、玩遊戲、使用應用程式和/或觀看電視直播。

如果 Android 裝置實作項目符合下列所有條件,就會歸類為電視:

  • 提供機制,可遠端控制顯示器上顯示的使用者介面,而顯示器可能距離使用者十英尺。
  • 內建螢幕的對角線長度超過 24 吋,或包含視訊輸出埠,例如 VGA、HDMI、DisplayPort 或無線顯示埠。

本節其餘部分的額外規定,適用於 Android TV 裝置實作。

2.3.1. 硬體

電視裝置實作方式:

  • [7.2.2/T-0-1] 必須支援方向鍵
  • [7.2.3/T-0-1] MUST provide the Home and Back functions.
  • [7.2.3/T-0-2] 必須將「返回」功能 (KEYCODE_BACK) 的一般和長按事件都傳送至前景應用程式。
  • [7.2.6.1/T-0-1] 必須支援遊戲控制器,並宣告 android.hardware.gamepad 功能旗標。
  • [7.2.7/T] 應提供遙控器,讓使用者可透過遙控器存取非觸控導覽核心導覽鍵輸入內容。

如果電視裝置實作項目包含 3 軸陀螺儀,則:

  • [7.3.4/T-1-1] 必須能夠以至少 100 Hz 的頻率回報事件。
  • [7.3.4/T-1-2] 必須能夠測量每秒高達 1000 度的方向變化。

電視裝置實作方式:

  • [7.4.3/T-0-1] 必須支援藍牙和藍牙低功耗。
  • [7.6.1/T-0-1] 必須提供至少 4 GB 的非揮發性儲存空間,供應用程式專用資料使用 (又稱「/data」分割區)。

如果電視裝置實作項目包含支援主機模式的 USB 連接埠,則:

  • [7.5.3/T-1-1] MUST include support for an external camera that connects through this USB port but is not necessarily always connected.

如果電視裝置實作項目為 32 位元:

  • [7.6.1/T-1-1] 如果使用下列任何密度,核心和使用者空間可用的記憶體必須至少為 896 MB:

    • 小型/一般螢幕的 dpi 須為 400 以上
    • 大型螢幕上的 xhdpi 以上
    • 在特大螢幕上,tvdpi 或更高

如果電視裝置實作項目為 64 位元:

  • [7.6.1/T-2-1] 如果使用下列任何密度,核心和使用者空間可用的記憶體必須至少為 1280MB:

    • 小型/一般螢幕的 dpi 須為 400 以上
    • 大型螢幕上的 xhdpi 以上
    • 在特大螢幕上,tvdpi 或更高

請注意,上文提及的「核心和使用者空間可用的記憶體」是指除了已專用於無線電、影片等硬體元件的記憶體空間外,額外提供的記憶體空間,這些元件並非由裝置實作中的核心控制。

電視裝置實作方式:

  • [7.8.1/T] 應包含麥克風。
  • [7.8.2/T-0-1] 必須具備音訊輸出功能,並宣告 android.hardware.audio.output

2.3.2. 多媒體

電視裝置實作項目必須支援下列音訊編碼和解碼格式,並提供給第三方應用程式:

  • [5.1/T-0-1] MPEG-4 AAC 設定檔 (AAC LC)
  • [5.1/T-0-2] MPEG-4 HE AAC 設定檔 (AAC+)
  • [5.1/T-0-3] AAC ELD (增強型低延遲 AAC)

電視裝置實作項目必須支援下列影片編碼格式,並提供給第三方應用程式:

  • [5.2/T-0-1] H.264
  • [5.2/T-0-2] VP8

電視裝置實作方式:

  • [5.2.2/T-SR] 強烈建議支援 720p 和 1080p 解析度影片的 H.264 編碼,每秒 30 格。

電視裝置實作項目「必須」支援下列影片解碼格式,並提供給第三方應用程式:

電視裝置實作項目「必須」支援 MPEG-2 解碼,如第 5.3.1 節所述,且支援標準影片影格速率和最高解析度,包括:

  • [5.3.1/T-1-1] HD 1080p,每秒 29.97 個影格,主要設定檔高階。
  • [5.3.1/T-1-2] HD 1080i,每秒 59.94 影格,主要設定檔高階。他們「必須」將交錯式 MPEG-2 影片去交錯,並提供給第三方應用程式。

電視裝置實作項目「必須」支援 H.264 解碼,如第 5.3.4 節所述,且支援標準影片影格速率和最高解析度,包括:

  • [5.3.4/T-1-1] 60 fps 的 HD 1080p,並採用 Baseline Profile
  • [5.3.4/T-1-2] 60 FPS 的 HD 1080p 影片 (主要設定檔)
  • [5.3.4/T-1-3] 60 FPS 的 HD 1080p 影片,且 High Profile Level 4.2

如第 5.3.5 節所述,電視裝置實作項目必須支援 H.265 解碼,且支援標準視訊影格速率和最高解析度,包括:

  • [5.3.5/T-1-1] HD 1080p,每秒 60 個影格,主要設定檔層級 4.1

如果電視裝置實作項目採用 H.265 硬體解碼器,且支援 H.265 解碼和 UHD 解碼設定檔,則:

  • [5.3.5/T-2-1] MUST support the UHD decoding profile at 60 frames per second with Main10 Level 5 Main Tier profile

電視裝置實作項目「必須」支援 VP8 解碼,如第 5.3.6 節所述,且支援標準影片畫面更新率和最高解析度,包括:

  • [5.3.6/T-1-1] HD 1080p (每秒 60 個影格) 解碼設定檔

如第 5.3.7 節所述,電視裝置實作項目必須支援 VP9 解碼,且支援標準視訊影格速率和最高解析度 (含):

  • [5.3.7/T-1-1] HD 1080p,每秒 60 格,設定檔 0 (8 位元色深)

如果電視裝置實作項目搭載 VP9 硬體解碼器,且支援 VP9 解碼和 UHD 解碼設定檔,則:

  • [5.3.7/T-2-1] MUST support the UHD decoding profile at 60 frames per second with profile 0 (8 bit color depth).
  • [5.3.7/T-2-1] 強烈建議支援設定檔 2 (10 位元色深) 的 UHD 解碼設定檔,且影格速率為每秒 60 格。

電視裝置實作方式:

  • [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] MUST support HDCP 2.2.

如果電視裝置實作項目不支援 UHD 解碼,但支援透過 HDMI 連接的外接螢幕,則:

  • [5.8/T-2-1] 必須支援 HDCP 1.4

2.3.3. 軟體

電視裝置實作方式:

  • [3/T-0-1] MUST declare the features android.software.leanback and 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] 必須顯示螢幕鎖定通知,包括媒體通知範本。

電視裝置實作方式:

如果電視裝置實作項目回報了 android.hardware.audio.output 功能,則:

  • [3.11/T-SR] 強烈建議加入支援裝置可用語言的 TTS 引擎。
  • [3.11/T-1-1] 必須支援安裝第三方 TTS 引擎。

電視裝置實作方式:

  • [3.12/T-0-1] 必須支援 TV Input Framework。

2.3.4. 效能和電力

  • [8.1/T-0-1] 一致的影格延遲。影格延遲時間不一致或影格延遲算繪的情況,每秒不得超過 5 個影格,且應低於每秒 1 個影格。
  • [8.2/T-0-1] MUST ensure a sequential write performance of at least 5MB/s.
  • [8.2/T-0-2] MUST ensure a random write performance of at least 0.5MB/s.
  • [8.2/T-0-3] 必須確保循序讀取效能至少達到 15 MB/秒。
  • [8.2/T-0-4] 必須確保隨機讀取效能至少為 3.5 MB/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] MUST report CPU power consumption per each process's UID. Android 開放原始碼計畫透過 uid_cputime 核心模組實作項目,滿足這項需求。
  • [8.4/T] 如果無法將硬體元件的耗電量歸因於應用程式,則應將其歸因於硬體元件本身。
  • [8.4/T-0-4] 必須透過 adb shell dumpsys batterystats shell 命令,向應用程式開發人員提供這項耗電量資訊。

2.3.5. 安全模式

電視裝置實作方式:

  • [9.11/T-0-1] MUST back up the keystore implementation with an isolated execution environment.
  • [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] MUST 在獨立執行環境中執行螢幕鎖定驗證,且只有在驗證成功時,才允許使用與驗證相關聯的金鑰。螢幕鎖定憑證的儲存方式必須確保只有隔離的執行環境可以執行螢幕鎖定驗證。上游 Android 開放原始碼計畫提供 Gatekeeper 硬體抽象層 (HAL) 和 Trusty,可用於滿足這項需求。
  • [9.11/T-0-4] 必須支援金鑰認證,其中認證簽署金鑰受到安全硬體保護,且簽署作業在安全硬體中執行。認證簽署金鑰必須在足夠數量的裝置間共用,才能防止金鑰做為裝置 ID 使用。如要符合這項規定,除非特定 SKU 的產量至少達到 10 萬部,否則請共用相同的認證金鑰。如果 SKU 的生產數量超過 10 萬個,每 10 萬個單位可能使用不同的金鑰。

請注意,如果裝置實作作業已在較早的 Android 版本上推出,則該裝置可免除必須具備由獨立執行環境支援的金鑰儲存區,以及支援金鑰認證的要求,除非裝置聲明 android.hardware.fingerprint 功能,而該功能需要由獨立執行環境支援的金鑰儲存區。

如果電視裝置實作項目支援安全鎖定螢幕,則:

  • [9.11/T-1-1] MUST allow the user to choose the Sleep timeout for transition from the unlocked to the locked state, with a minimum allowable timeout up to 15 seconds or less.

如果電視裝置實作項目包含多位使用者,且未宣告 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] MUST 向殼層使用者公開 /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] 必須透過 perfetto 二進位檔,提供至少perfetto 說明文件中描述的資料來源。

2.4. 智慧手錶需求

Android Watch 裝置是指可穿戴在身上的 Android 裝置實作項目,例如手腕上的裝置。

如果 Android 裝置實作項目符合下列所有條件,就會歸類為手錶:

  • 螢幕的實際對角線長度介於 1.1 至 2.5 吋。
  • 提供可穿戴在身上的機制。

本節其餘部分的額外規定,適用於 Android Watch 裝置實作項目。

2.4.1. 硬體

觀看裝置實作內容:

  • [7.1.1.1/W-0-1] 螢幕的實際對角線尺寸必須介於 1.1 至 2.5 吋。

  • [7.2.3/W-0-1] 必須為使用者提供「首頁」功能,以及「返回」功能 (在 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 公尺/秒內的速度。

如果手錶裝置實作項目包含 3 軸陀螺儀,則:

  • [7.3.4/W-2-1] 必須能夠測量每秒高達 1000 度的方向變化。

觀看裝置實作內容:

  • [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] MAY have audio output.

2.4.2. 多媒體

沒有其他相關規定。

2.4.3. 軟體

觀看裝置實作內容:

  • [3/W-0-1] MUST declare the feature android.hardware.type.watch.
  • [3/W-0-2] MUST support uiMode = UI_MODE_TYPE_WATCH
  • [3.2.3.1/W-0-1] 必須預先載入一或多個具有意圖處理常式的應用程式或服務元件,以處理這裡列出的所有公開意圖篩選器模式。

觀看裝置實作內容:

  • [3.8.4/W-SR] Are STRONGLY RECOMMENDED to implement an assistant on the device to handle the Assist action.

查看宣告 android.hardware.audio.output 功能標記的智慧手錶裝置實作項目:

  • [3.10/W-1-1] 必須支援第三方無障礙服務。
  • [3.10/W-SR] 裝置「強烈建議」預先載入無障礙服務,這些服務的功能應與TalkBack 開放原始碼專案提供的切換控制和 TalkBack (適用於預先安裝的文字轉語音引擎支援的語言) 無障礙服務相當或更強大。

如果手錶裝置實作項目回報 android.hardware.audio.output 功能,則:

  • [3.11/W-SR] 強烈建議加入支援裝置可用語言的 TTS 引擎。

  • [3.11/W-0-1] 必須支援安裝第三方 TTS 引擎。

2.4.4. 效能和電力

如果手錶裝置實作項目包含 AOSP 內建的裝置電源管理改善功能,或擴充 AOSP 內建功能,則:

  • [8.3/W-SR] STRONGLY RECOMMENDED to provide user affordance to display all apps that are exempted from App Standby and Doze power-saving modes.
  • [8.3/W-SR] 強烈建議提供使用者介面,讓使用者啟用及停用省電模式功能。

觀看裝置實作內容:

  • [8.4/W-0-1] 必須提供每個元件的電源設定檔,定義每個硬體元件的耗電量值,以及元件隨時間造成的電池耗電量概略值,如 Android 開放原始碼計畫網站所述。
  • [8.4/W-0-2] 必須以毫安時 (mAh) 回報所有耗電量值。
  • [8.4/W-0-3] MUST report CPU power consumption per each process's UID. 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] 必須提供「首頁」功能,且可提供「返回」和「最近」功能。

  • [7.2.3/A-0-2] 必須將「返回」功能 (KEYCODE_BACK) 的一般和長按事件都傳送至前景應用程式。
  • [7.3/A-0-1] 必須實作並回報 GEAR_SELECTIONNIGHT_MODEPERF_VEHICLE_SPEEDPARKING_BRAKE_ON
  • [7.3/A-0-2] NIGHT_MODE 旗標的值必須與資訊主頁的日/夜間模式一致,且應以環境光感應器輸入內容為依據。底層的環境光感應器可能與照度計相同。
  • [7.3/A-0-3] 必須為提供的每個感應器,在 SensorAdditionalInfo 中提供感應器額外資訊欄位 TYPE_SENSOR_PLACEMENT
  • [7.3/A-0-1] MAY dead reckon Location by fusing GPS/GNSS with additional sensors. 如果「位置」是推估值,強烈建議您實作並回報使用的對應「感應器」類型和/或「車輛屬性 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,盡可能提高解析度

如果 Automotive 裝置實作項目包含 GPS/GNSS 接收器,但不包含以行動網路為基礎的數據連線,則:

  • [7.3.3/A-3-1] 首次開啟 GPS/GNSS 接收器或在 4 天後,必須在 60 秒內判斷位置。
  • [7.3.3/A-3-2] 必須符合 7.3.3/C-1-27.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] 必須支援藍牙,且應支援藍牙低功耗。
  • [7.4.3/A-0-2] Android Automotive 實作項目「必須」支援下列藍牙設定檔:
    • 透過免持聽筒設定檔 (HFP) 撥打電話。
    • 透過音訊散布設定檔 (A2DP) 播放媒體。
    • 透過遙控器設定檔 (AVRCP) 控制媒體播放。
    • 使用電話簿存取設定檔 (PBAP) 分享聯絡人。
  • [7.4.3/A-SR] Are STRONGLY RECOMMENDED to support Message Access Profile (MAP)。

  • [7.4.5/A] 應支援以行動網路為基礎的資料連線。

  • [7.4.5/A] MAY use the System API NetworkCapabilities#NET_CAPABILITY_OEM_PAID constant for networks that should be available to system apps.

外部檢視攝影機是指拍攝裝置實作外部場景的攝影機,例如行車記錄器。

車用裝置實作方式:

  • 應包含一或多部外部攝影機。

如果車輛裝置實作項目包含外部檢視攝影機,這類攝影機必須:

  • [7.5/A-1-1] 除非符合相機核心規定,否則不得透過 Android Camera API 存取外部攝影機。
  • [7.5/A-SR] 強烈建議不要旋轉或水平鏡像相機預覽畫面。
  • [7.5.5/A-SR] 強烈建議調整方向,讓相機的長邊對齊水平線。
  • [7.5/A-SR] 強烈建議解析度至少為 130 萬像素。
  • 應具備定焦或 EDOF (擴展景深) 硬體。
  • 應支援 Android 同步處理架構
  • 相機驅動程式「可能」會實作硬體自動對焦或軟體自動對焦功能。

車用裝置實作方式:

  • [7.6.1/A-0-1] 必須提供至少 4 GB 的非揮發性儲存空間,供應用程式私人資料使用 (又稱「/data」分割區)。

  • [7.6.1/A] SHOULD 格式化資料分割區,以提升快閃儲存裝置的效能和使用壽命,例如使用 f2fs 檔案系統。

如果 Automotive 裝置實作項目透過內部不可移除儲存空間的一部分提供共用外部儲存空間,則:

  • [7.6.1/A-SR] 強烈建議使用 SDCardFS,減少對外部儲存空間執行的作業 I/O 負擔。

如果 Automotive 裝置實作項目為 32 位元:

  • [7.6.1/A-1-1] 如果使用下列任一密度,核心和使用者空間可用的記憶體必須至少為 512 MB:

    • 小型/一般螢幕的 dpi 為 280 或更低
    • 在特大螢幕上使用 ldpi 或更低的密度
    • 大型螢幕上的 mdpi 或更低
  • [7.6.1/A-1-2] 如果使用下列任何密度,核心和使用者空間可用的記憶體必須至少為 608MB:

    • 小型/一般螢幕上的 xhdpi 以上
    • 大型螢幕上的 hdpi 以上
    • 在特大螢幕上為 mdpi 以上
  • [7.6.1/A-1-3] 如果使用下列任何密度,核心和使用者空間可用的記憶體必須至少為 896 MB:

    • 小型/一般螢幕的 dpi 須為 400 以上
    • 大型螢幕上的 xhdpi 以上
    • 在特大螢幕上,tvdp 或更高
  • [7.6.1/A-1-4] 如果使用下列任何密度,核心和使用者空間可用的記憶體必須至少為 1344MB:

    • 在小型/一般螢幕上,DPI 須為 560 以上
    • 大型螢幕的 dpi 須為 400 以上
    • 特大螢幕上為 xhdpi 以上

如果 Automotive 裝置實作項目為 64 位元:

  • [7.6.1/A-2-1] 如果使用下列任何密度,核心和使用者空間可用的記憶體必須至少為 816 MB:

    • 小型/一般螢幕的 dpi 為 280 或更低
    • 在特大螢幕上使用 ldpi 或更低的密度
    • 大型螢幕上的 mdpi 或更低
  • [7.6.1/A-2-2] 如果使用下列任何密度,核心和使用者空間可用的記憶體必須至少為 944MB:

    • 小型/一般螢幕上的 xhdpi 以上
    • 大型螢幕上的 hdpi 以上
    • 在特大螢幕上為 mdpi 以上
  • [7.6.1/A-2-3] 如果使用下列任何密度,核心和使用者空間可用的記憶體必須至少為 1280MB:

    • 小型/一般螢幕的 dpi 須為 400 以上
    • 大型螢幕上的 xhdpi 以上
    • 在特大螢幕上,tvdpi 或更高
  • [7.6.1/A-2-4] 如果使用下列任何密度,核心和使用者空間可用的記憶體必須至少為 1824MB:

    • 在小型/一般螢幕上,DPI 須為 560 以上
    • 大型螢幕的 dpi 須為 400 以上
    • 特大螢幕上為 xhdpi 以上

請注意,上文提及的「核心和使用者空間可用的記憶體」是指除了已專用於無線電、影片等硬體元件的記憶體空間外,額外提供的記憶體空間,這些元件並非由裝置實作中的核心控制。

車用裝置實作方式:

  • [7.7.1/A] SHOULD include a USB port supporting peripheral mode.

車用裝置實作方式:

  • [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 設定檔 (AAC+)
  • [5.1/A-0-3] AAC ELD (增強型低延遲 AAC)

車輛裝置實作項目「必須」支援下列影片編碼格式,並提供給第三方應用程式:

  • [5.2/A-0-1] H.264 AVC
  • [5.2/A-0-2] VP8

車輛裝置實作項目「必須」支援下列影片解碼格式,並提供給第三方應用程式:

  • [5.3/A-0-1] H.264 AVC
  • [5.3/A-0-2] MPEG-4 SP
  • [5.3/A-0-3] VP8
  • [5.3/A-0-4] VP9

強烈建議汽車裝置實作支援下列影片解碼:

  • [5.3/A-SR] H.265 HEVC

2.5.3. 軟體

車用裝置實作方式:

  • [3/A-0-1] MUST declare the feature android.hardware.type.automotive.

  • [3/A-0-2] 必須支援 uiMode = UI_MODE_TYPE_CAR

  • [3/A-0-3] 必須支援 android.car.* 命名空間中的所有公開 API。

如果 Automotive 裝置實作項目使用 android.car.CarPropertyManager 提供專屬 API (使用 android.car.VehiclePropertyIds),則:

  • [3/A-1-1] MUST NOT attach special privileges to system application's use of these properties, or prevent third-party applications from using these properties.
  • [3/A-1-2] 不得複製 SDK 中已有的車輛屬性。

車用裝置實作方式:

  • [3.2.1/A-0-1] MUST support and enforce all permissions constants as documented by the Automotive Permission reference page.

  • [3.2.3.1/A-0-1] 必須預先載入一或多個具有意圖處理常式的應用程式或服務元件,以處理這裡列出的所有應用程式意圖所定義的公開意圖篩選器模式。

  • [3.4.1/A-0-1] 必須完整實作 android.webkit.Webview API。

  • [3.8.3/A-0-1] MUST display notifications that use the Notification.CarExtender API when requested by third-party applications.

  • [3.8.4/A-SR] Strongly Recommended to implement an assistant on the device to handle the Assist action.

如果車用裝置導入項目包含「按鈕說話」按鈕,則:

  • [3.8.4/A-1-1] 必須使用一按即說按鈕的短按操作,做為啟動使用者選取輔助應用程式的指定互動方式,也就是實作 VoiceInteractionService 的應用程式。

車用裝置實作方式:

  • [3.8.3.1/A-0-1] MUST correctly render resources as described in the Notifications on Automotive OS SDK documentation.
  • [3.8.3.1/A-0-2] MUST display PLAY and MUTE for notification actions in the place of those provided through Notification.Builder.addAction()
  • [3.8.3.1/A] SHOULD 限制使用豐富的管理工作,例如個別通知管道控制項。可針對每個應用程式使用 UI 輔助功能,減少控制項。

車用裝置實作方式:

如果車輛裝置實作項目包含預設啟動器應用程式,則:

車用裝置實作方式:

  • [3.8/A] MAY restrict the application requests to enter a full screen mode as described in immersive documentation.
  • [3.8/A] MAY keep the status bar and the navigation bar visible at all times.
  • [3.8/A] MAY restrict the application requests to change the colors behind the system UI elements, to ensure those elements are clearly visible at all times.

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] MUST report CPU power consumption per each process's UID. Android 開放原始碼計畫透過 uid_cputime 核心模組實作項目,滿足這項需求。
  • [8.4/A] 如果無法將硬體元件耗電量歸因於應用程式,則應歸因於硬體元件本身。
  • [8.4/A-0-4] 必須透過 adb shell dumpsys batterystats shell 指令,向應用程式開發人員提供這項耗電量資訊。

2.5.5. 安全模式

如果車輛裝置實作支援多位使用者,則:

車用裝置實作方式:

  • [9.11/A-0-1] MUST back up the keystore implementation with an isolated execution environment.
  • [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] MUST 在隔離的執行環境中執行螢幕鎖定驗證,且只有在驗證成功時,才允許使用與驗證相關聯的金鑰。螢幕鎖定憑證的儲存方式必須確保只有隔離的執行環境可以執行螢幕鎖定驗證。上游 Android 開放原始碼計畫提供 Gatekeeper 硬體抽象層 (HAL) 和 Trusty,可用於滿足這項需求。
  • [9.11/A-0-4] 必須支援金鑰認證,其中認證簽署金鑰受到安全硬體保護,且簽署作業在安全硬體中執行。認證簽署金鑰必須在足夠數量的裝置間共用,才能防止金鑰做為裝置 ID 使用。如要符合這項規定,除非特定 SKU 的產量至少達到 10 萬部,否則請共用相同的認證金鑰。如果 SKU 的生產數量超過 10 萬個,每 10 萬個單位可能使用不同的金鑰。

請注意,如果裝置實作作業已在較早的 Android 版本上推出,則該裝置可免除必須具備由獨立執行環境支援的金鑰儲存區,以及支援金鑰認證的要求,除非裝置聲明 android.hardware.fingerprint 功能,而該功能需要由獨立執行環境支援的金鑰儲存區。

車用裝置實作方式:

  • [9.14/A-0-1] 必須控管來自 Android 架構車輛子系統的訊息,例如將允許的訊息類型和訊息來源新增至允許清單。
  • [9.14/A-0-2] MUST watchdog against denial of service attacks from the Android framework or third-party apps. 這項措施可防範惡意軟體以大量流量淹沒車輛網路,導致車輛子系統故障。

2.5.6. 開發人員工具和選項相容性

車用裝置實作方式:

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] MAY implement the 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.2.3.1/Tab-0-1] 必須預先載入一或多個應用程式或服務元件,並搭配意圖處理常式,以處理這裡列出的所有公開應用程式意圖所定義的意圖篩選器模式。

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 介面。非 SDK 介面是指 AOSP 開機類路徑中 Java 語言套件的方法和欄位,且不屬於公開 SDK。這包括以 @hide 註解裝飾的 API,但不包括 @SystemAPI,詳情請參閱 SDK 文件,以及私有和套件私有類別成員。

  • [C-0-6] 必須隨附每個非 SDK 介面,且這些介面與 AOSP 中適當 API 級別分支的 prebuilts/runtime/appcompat/hiddenapi-flags.csv 路徑中,透過暫時和拒絕清單旗標提供的受限制清單相同。

  • [C-0-7] 必須支援簽署設定動態更新機制,方法是在任何 APK 中嵌入簽署設定,並使用 AOSP 中現有的公開金鑰,從受限制清單中移除非 SDK 介面。

    不過,這些應用程式:

    • MAY:如果裝置實作中缺少隱藏 API 或實作方式不同,請將隱藏 API 移至拒絕清單,或從所有受限清單 (即淺灰色、深灰色、黑色) 中省略。
    • MAY:如果 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 級別允許的最低版本。舉例來說,執行 API 級別 24 的 Android 7.0 裝置實作項目「必須至少包含版本 1。

  • [C-0-2] MUST only return valid extension version number that have been defined by the AOSP.

  • [C-0-3] MUST support all the APIs defined by the extension versions returned by android.os.ext.SdkExtensions.getExtensionVersion(int apiLevel) in the same manner as other managed APIs are supported, following the requirements in section 3.1.

3.1.2. Android 程式庫

由於 Apache HTTP 用戶端已遭淘汰,裝置實作項目:

  • [C-0-1] 不得將 org.apache.http.legacy 程式庫放在啟動類別路徑中。
  • [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 應用程式的類似層面,這些 API 無法在應用程式編譯時強制執行。

3.2.1. 權限

  • [C-0-1] 裝置實作人員「必須」支援並強制執行權限參考頁面中記錄的所有權限常數。請注意,第 9 節列出了與 Android 安全模型相關的其他規定。

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_-]+$」規則運算式。產品生命週期內,這個裝置名稱不得變更。
指紋 可明確識別這個版本的字串。這項資訊應可供使用者解讀。必須符合以下範本:

$(BRAND)/$(PRODUCT)/
    $(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS)

例如:

acme/myproduct/
    mydevice:11/LMYXX/3359:userdebug/test-keys

指紋不得包含空白字元。這個欄位的值必須可編碼為 7 位元 ASCII。

硬體 硬體名稱 (來自核心指令列或 /proc)。這項資訊應可供使用者解讀。這個欄位的值必須可編碼為 7 位元 ASCII,且符合規則運算式「^[a-zA-Z0-9_-]+$」。
HOST 以人類可讀格式,唯一識別建構版本的主機。這個欄位的格式沒有任何規定,但不得為空值或空字串 ("")。
ID 裝置實作者選擇的 ID,用於以人類可讀的格式參照特定版本。這個欄位可以與 android.os.Build.VERSION.INCREMENTAL 相同,但「應」是對於終端使用者而言有意義的值,可區分軟體建構版本。這個欄位的值必須可編碼為 7 位元 ASCII,且符合規則運算式「^[a-zA-Z0-9._-]+$」。
製造商 產品原始設備製造商 (OEM) 的商標名稱。這個欄位的格式沒有任何規定,但「不得」為空值或空字串 ("")。這個欄位在產品生命週期內「不得」變更。
型號 裝置實作人員選擇的值,內含使用者所知的裝置名稱。這應與裝置向終端使用者行銷和銷售時使用的名稱相同。這個欄位的格式沒有任何規定,但「不得」為空值或空字串 ("")。這個欄位在產品生命週期內「不得」變更。
產品 裝置實作人員選擇的值,其中包含特定產品 (SKU) 的開發名稱或代號,且必須在同一品牌內保持不重複。必須是人類可讀的內容,但不一定會向使用者顯示。這個欄位的值必須可編碼為 7 位元 ASCII,且符合規則運算式「^[a-zA-Z0-9_-]+$」。產品名稱在產品生命週期內不得變更。
SERIAL 必須傳回「UNKNOWN」。
標記 裝置實作人員選擇的標記清單 (以半形逗號分隔),可進一步區分建構版本。標記必須可編碼為 7 位元 ASCII,且符合規則運算式「^[a-zA-Z0-9._-]+」,並須具備與三種常見 Android 平台簽署設定 (release-keys、dev-keys 和 test-keys) 對應的值。
時間 代表建構發生時間的時間戳記值。
TYPE 裝置實作人員選擇的值,用於指定建構作業的執行階段設定。這個欄位必須包含與三種常見 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 節中參照的每個 Intent 模式 (「設定」除外)。上游 Android 開放原始碼實作預設允許此行為。

  • [C-0-2] 裝置實作人員「不得」將特殊權限附加至系統應用程式對這些意圖模式的使用,或禁止第三方應用程式繫結至這些模式並取得控制權。這項禁令具體包括但不限於停用「選擇器」使用者介面,讓使用者無法在處理相同意圖模式的多個應用程式之間進行選擇。

  • [C-0-3] 裝置實作內容必須提供使用者介面,供使用者修改意圖的預設活動。

  • 不過,如果預設活動為資料 URI 提供更具體的屬性,裝置實作做法「可能」會為特定 URI 模式 (例如 http://play.google.com) 提供預設活動。舉例來說,指定資料 URI「http://www.android.com」的意圖篩選器模式,比瀏覽器的「http://」核心意圖模式更具體。

Android 也提供機制,讓第三方應用程式針對特定類型的網頁 URI Intent 宣告授權預設應用程式連結行為。在應用程式的意圖篩選器模式中定義這類權威宣告時,裝置實作項目:

  • [C-0-4] MUST attempt to validate any intent filters by performing the validation steps defined in the Digital Asset Links specification as implemented by the Package Manager in the upstream Android Open Source Project.
  • [C-0-5] MUST attempt validation of the intent filters during the installation of the application and set all successfully validated URI intent filters as default app handlers for their URIs.
  • 如果特定 URI 意圖篩選器通過驗證,但其他候選 URI 篩選器驗證失敗,MAY 可以將特定 URI 意圖篩選器設為 URI 的預設應用程式處理常式。如果裝置實作這項功能,就必須在設定選單中為使用者提供適當的 URI 模式覆寫。
  • 必須在「設定」中提供應用程式連結控制項,讓使用者逐一設定應用程式,如下所示:
    • [C-0-6] 使用者必須能夠全面覆寫應用程式的預設應用程式連結行為,讓應用程式一律開啟、一律詢問或一律不開啟,且這項設定必須同樣適用於所有候選 URI 意圖篩選器。
    • [C-0-7] 使用者必須能夠查看候選 URI 意圖篩選器清單。
    • 裝置實作「可能」會讓使用者逐一覆寫已成功驗證的特定候選 URI 意圖篩選器。
    • [C-0-8] 如果裝置實作可讓部分候選 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 說明文件也說明瞭背景應用程式的限制。此外,部分廣播 Intent 須視硬體支援情況而定。如果裝置支援必要硬體,就「必須」廣播 Intent,並提供符合 SDK 文件的行為。
3.2.3.5. 條件式應用程式意圖

Android 內建設定,方便使用者選取預設應用程式,例如主畫面或 SMS 應用程式。

在適當情況下,裝置實作項目「必須」提供類似的設定選單,並與 SDK 說明文件中所述的意圖篩選器模式和 API 方法相容,如下所示。

如果裝置實作報告 android.software.home_screen 顯示:

如果裝置實作報告 android.hardware.telephony 顯示:

如果裝置實作報告 android.hardware.nfc.hce 顯示:

如果裝置實作報告 android.hardware.nfc 顯示:

如果裝置實作項目支援 VoiceInteractionService,且同時安裝多個使用此 API 的應用程式,則:

如果裝置實作報告 android.hardware.bluetooth 顯示:

如果裝置實作支援「請勿打擾」功能,則:

  • [C-6-1] 必須實作活動,回應意圖 ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS。對於 UI_MODE_TYPE_NORMAL 實作項目,這項活動必須讓使用者授予或拒絕應用程式存取「請勿打擾」政策設定。

如果裝置實作項目允許使用者在裝置上使用第三方輸入法,則:

如果裝置實作項目支援第三方無障礙服務,則:

  • [C-8-1] 必須遵守 android.settings.ACCESSIBILITY_SETTINGS 意圖,提供使用者可存取的機制,以便啟用和停用第三方無障礙服務,以及預先載入的無障礙服務。

如果裝置實作項目支援 Wi-Fi Easy Connect,並向第三方應用程式公開這項功能,則:

如果裝置實作項目提供省電模式,則:* [C-10-1] 必須在設定中提供使用者介面,處理 Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS 意圖,讓使用者將應用程式新增至允許清單或從清單中移除。

如果裝置實作項目未提供數據節省模式,則:

如果裝置實作項目透過 android.hardware.camera.any 宣告支援攝影機,則:

如果裝置實作報告 android.software.device_admin 顯示:

如果裝置實作項目聲明 android.software.autofill 功能標記,則:

如果裝置實作項目包含預先安裝的應用程式,或希望允許第三方應用程式存取使用統計資料,則:

  • [C-SR] are STRONGLY RECOMMENDED provide user-accessible mechanism to grant or revoke access to the usage stats in response to the android.settings.ACTION_USAGE_ACCESS_SETTINGS intent for apps that declare the android.permission.PACKAGE_USAGE_STATS permission.

如果裝置實作項目打算禁止任何應用程式 (包括預先安裝的應用程式) 存取使用統計資料,則:

如果裝置實作項目回報 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 intent,並提供活動來滿足這些 intent,如 SDK 這裡所述。

Android 支援互動式螢幕保護程式 (舊稱「夢幻螢幕保護程式」)。當裝置連接電源或固定在桌面底座上時,使用者可以透過螢幕保護程式與應用程式互動。裝置實作方式:

  • 應支援螢幕保護程式,並提供設定選項,讓使用者回應 android.settings.DREAM_SETTINGS 意圖時設定螢幕保護程式。

3.2.4. 在第二個/多個螢幕上進行活動

如果裝置實作項目允許在多個螢幕上啟動一般 Android 活動,則:

  • [C-1-1] 必須設定 android.software.activities_on_secondary_displays 功能旗標。
  • [C-1-2] MUST guarantee API compatibility similar to an activity running on the primary display.
  • [C-1-3] 如果啟動新活動時未透過 ActivityOptions.setLaunchDisplayId() API 指定目標螢幕,新活動必須與啟動活動的螢幕相同。
  • [C-1-4] 移除具有 Display.FLAG_PRIVATE 旗標的螢幕時,必須終止所有活動。
  • [C-1-5] 裝置鎖定時,除非應用程式使用 Activity#setShowWhenLocked() API 選擇在鎖定畫面上顯示,否則 MUST 必須在所有畫面上安全地隱藏內容。
  • 如果活動是在副螢幕上啟動,則「應該」要有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 原生介面 (JNI) 語意呼叫原生程式碼。
  • [C-0-3] 必須與下方清單中的每個必要程式庫來源相容 (即標頭相容),且與 ABI 二進位檔相容。
  • [C-0-5] 必須透過 android.os.Build.SUPPORTED_ABISandroid.os.Build.SUPPORTED_32_BIT_ABISandroid.os.Build.SUPPORTED_64_BIT_ABIS 參數,準確回報裝置支援的原生應用程式二進位檔介面 (ABI),每個參數都是以半形逗號分隔的 ABI 清單,並依偏好程度排序,從最偏好到最不偏好。
  • [C-0-6] 必須透過上述參數回報下列 ABI 清單的子集,且不得回報清單以外的任何 ABI。

  • [C-0-7] 必須向包含原生程式碼的應用程式提供下列所有程式庫,並提供原生 API:

    • libaaudio.so (AAudio 原生音訊支援)
    • libamidi.so (原生 MIDI 支援,前提是如第 5.9 節所述,功能 android.software.midi 已聲明)
    • libandroid.so (原生 Android 活動支援)
    • libc (C 程式庫)
    • libcamera2ndk.so
    • libdl (動態連結器)
    • libEGL.so (原生 OpenGL Surface 管理)
    • 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 以上版本的第三方應用程式,不得公開 AOSP 中實作及提供的任何其他原生程式庫,因為這些程式庫是保留項目。
  • [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_surfaceVK_KHR_android_surfaceVK_KHR_swapchainVK_KHR_maintenance1VK_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 架構 (例如 「8」(適用於 ARMv8 裝置)。
  • [C-2-2] 即使 ABI 是在 ARMv8 架構上實作,也必須一律提供下列作業,無論是透過原生 CPU 支援或軟體模擬:

    • SWP 和 SWPB 指令。
    • SETEND 指令。
    • CP15ISB、CP15DSB 和 CP15DMB 障礙作業。
  • [C-2-3] 必須支援進階 SIMD (又稱 NEON) 擴充功能。

3.4. 網頁相容性

3.4.1. WebView 相容性

如果裝置實作項目提供 android.webkit.Webview API 的完整實作項目,則:

  • [C-1-1] MUST report 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] MUST render the provided content or remote URL content in a process that is distinct from the application that instantiates the WebView. 具體來說,個別的 Renderer 程序必須持有較低的權限、以個別使用者 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。請注意,由於網頁開發標準機構正逐步改用 IndexedDB 而非網頁儲存空間,IndexedDB 預計會在日後的 Android 版本中成為必要元件。
  • 可能在獨立的瀏覽器應用程式中傳送自訂使用者代理程式字串。
  • 獨立瀏覽器應用程式應盡可能支援 HTML5 (無論是以上游 WebKit 瀏覽器應用程式為基礎,還是第三方替代方案)。

不過,如果裝置實作項目不包含獨立的瀏覽器應用程式,則:

3.5. API 行為相容性

裝置實作方式:

  • [C-0-9] MUST ensure that API behavioral compatibility is applied for all installed apps unless they are restricted as described in Section 3.5.1.
  • [C-0-10] MUST NOT implement the allowlisting approach that ensures API behavioral compatibility only for apps that are selected by device implementers.

各 API 類型 (受管理、軟體、原生和網頁) 的行為必須與上游 Android 開放原始碼專案的偏好實作方式一致。相容性具體涵蓋的範圍包括:

  • [C-0-1] 裝置「不得」變更標準意圖的行為或語意。
  • [C-0-2] 裝置不得變更特定類型系統元件 (例如服務、活動、ContentProvider 等) 的生命週期或生命週期語意。
  • [C-0-3] 裝置「不得」變更標準權限的語意。
  • 裝置「不得」變更對背景應用程式強制執行的限制。具體來說,如果是背景應用程式:
    • [C-0-4] 他們「必須」停止執行應用程式註冊的回呼,以接收 GnssMeasurementGnssNavigationMessage 的輸出內容。
    • [C-0-5] 透過 LocationManager API 類別或 WifiManager.startScan() 方法提供給應用程式的更新頻率「必須」受到速率限制。
    • [C-0-6] 如果應用程式指定 API 級別 25 以上版本,則除非廣播意圖需要 "signature""signatureOrSystem" protectionLevel 權限,或位於豁免清單中,否則應用程式資訊清單中不得註冊標準 Android 意圖的隱含廣播接收器。
    • [C-0-7] 如果應用程式指定 API 級別 25 以上版本,系統「必須」停止應用程式的背景服務,就像應用程式已呼叫服務的 stopSelf() 方法一樣,除非應用程式已加入暫時允許清單,可處理使用者可見的工作。
    • [C-0-8] 如果應用程式指定 API 級別 25 以上版本,則必須釋出應用程式持有的喚醒鎖定。
  • [C-0-9] 裝置必須從 Security.getProviders() 方法傳回下列安全防護供應商,做為前七個陣列值,且順序和名稱 (由 Provider.getName() 傳回) 和類別必須符合規定,除非應用程式已透過 insertProviderAt()removeProvider() 修改清單。裝置「可能」會在下方指定的供應商清單後,傳回其他供應商。
    1. AndroidNSSP - android.security.net.config.NetworkSecurityConfigProvider
    2. AndroidOpenSSL - com.android.org.conscrypt.OpenSSLProvider
    3. CertPathProvider - sun.security.provider.CertPathProvider
    4. AndroidKeyStoreBCWorkaround - android.security.keystore.AndroidKeyStoreBCWorkaroundProvider
    5. BC - com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
    6. HarmonyJSSE - com.android.org.conscrypt.JSSEProvider
    7. AndroidKeyStore - android.security.keystore.AndroidKeyStoreProvider

請注意,上方清單僅列舉部分示例。Compatibility Test Suite (CTS) 會測試平台的大部分行為相容性,但並非全部。實作者有責任確保行為與 Android 開放原始碼專案相容。因此,裝置實作人員應盡可能使用 Android 開放原始碼計畫提供的原始碼,而非重新實作系統的重要部分。

3.5.1. 應用程式限制

如果裝置實作專屬機制來限制應用程式,且該機制比很少使用的應用程式待命值區更嚴格,則:

  • [C-1-1] 必須提供使用者介面,讓使用者查看受限應用程式清單。
  • [C-1-2] 必須提供使用者介面,讓使用者開啟 / 關閉各個應用程式的限制。
  • [C-1-3] 不得在沒有系統健康狀態不良行為證據的情況下自動套用限制,但偵測到系統健康狀態不良行為 (例如停滯的喚醒鎖定、長時間執行的服務和其他條件) 時,可對應用程式套用限制。裝置實作者「可以」決定條件,但「必須」與應用程式對系統健康狀態的影響相關。其他與系統健康狀態無關的條件 (例如應用程式在市場上缺乏人氣),不得做為評估標準。
  • [C-1-4] 如果使用者手動關閉應用程式限制,裝置就不得自動套用應用程式限制,但可以建議使用者套用。
  • [C-1-5] 如果系統自動對應用程式套用限制,必須通知使用者。這類資訊必須在限制生效後的 24 小時內提供。
  • [C-1-6] 受限應用程式呼叫此 API 時,必須傳回 true (ActivityManager.isBackgroundRestricted())。
  • [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] 不得位於其他機構擁有或參照的命名空間中。舉例來說,裝置實作人員「不得」在 com.google.* 或類似的命名空間中新增 API,只有 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] MUST configure Dalvik runtimes to allocate memory in accordance with the upstream Android platform, and as specified by the following table. (如需螢幕大小和螢幕密度的定義,請參閱第 7.1.1 節)。

  • 應使用 Android 執行階段 (ART)、Dalvik Executable Format 的上游參考實作,以及參考實作的套件管理系統。

  • 應在各種執行模式和目標架構下執行模糊測試,確保執行階段的穩定性。請參閱 Android 開放原始碼計畫網站中的 JFuzzDexFuzz

請注意,以下指定的記憶體值為最小值,裝置實作 MAY 會為每個應用程式分配更多記憶體。

螢幕版面配置 螢幕密度 應用程式記憶體下限
Android Watch 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 (hdpi)
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
small/normal 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 (hdpi)
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
large 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 (hdpi)
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 (hdpi)
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 物件。

如果裝置實作項目包含支援應用程式內捷徑固定功能的預設啟動器,則:

反之,如果裝置實作項目不支援在應用程式內固定捷徑,則:

如果裝置實作項目實作了預設啟動器,可透過 ShortcutManager API 快速存取第三方應用程式提供的額外快速鍵,則:

  • [C-4-1] 必須支援所有已記錄的捷徑功能 (例如靜態和動態捷徑、釘選捷徑),並完整實作 ShortcutManager API 類別的 API。

如果裝置實作項目包含預設的啟動器應用程式,且該應用程式會顯示應用程式圖示的徽章,則:

  • [C-5-1] 必須遵守 NotificationChannel.setShowBadge() API 方法。換句話說,如果值設為 true,則顯示與應用程式圖示相關聯的視覺效果,如果所有應用程式的通知管道都將值設為 false,則不顯示任何應用程式圖示徽章配置。
  • 當第三方應用程式透過專屬 API 表示支援專屬徽章配置時,MAY 覆寫應用程式圖示徽章,但 SHOULD 使用 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] 必須內建支援應用程式小工具,並提供使用者介面,讓使用者直接在啟動器中新增、設定、查看及移除應用程式小工具。
  • [C-1-3] MUST be capable of rendering widgets that are 4 x 4 in the standard grid size. 詳情請參閱 Android SDK 說明文件中的「應用程式小工具設計指南」。
  • 可能支援在螢幕鎖定畫面上顯示應用程式小工具。

如果裝置實作項目支援第三方應用程式小工具和應用程式內釘選捷徑,則:

3.8.3. 通知

Android 包含 NotificationNotificationManager API,可讓第三方應用程式開發人員使用裝置的硬體元件 (例如音效、震動和燈光) 和軟體功能 (例如通知匣、系統列),通知使用者重要事件並吸引使用者注意。

3.8.3.1. 通知呈現方式

如果裝置實作項目允許第三方應用程式通知使用者重要事件,則:

  • [C-1-1] 必須支援使用硬體功能的通知,如 SDK 說明文件所述,並盡可能搭配裝置實作硬體。舉例來說,如果裝置實作項目包含震動器,就「必須」正確實作震動 API。如果裝置實作缺少硬體,對應的 API 必須實作為無運算。詳情請參閱第 7 節
  • [C-1-2] 必須正確算繪 API 或狀態/系統列圖示樣式指南中提供的所有資源 (圖示、動畫檔案等),但可提供與 Android 開放原始碼實作參照不同的通知使用者體驗。
  • [C-1-3] 必須遵守並正確實作這些 API 所述的行為,才能更新、移除及分組通知。
  • [C-1-4] MUST provide the full behavior of the NotificationChannel API documented in the SDK.
  • [C-1-5] 必須提供使用者介面,讓使用者可以依管道和應用程式套件層級,封鎖及修改特定第三方應用程式的通知。
  • [C-1-6] MUST also provide a user affordance to display deleted notification channels.
  • [C-1-7] 必須正確顯示透過 Notification.MessagingStyle 提供的所有資源 (圖片、貼紙、圖示等) 和通知文字,不需使用者採取其他動作。舉例來說,在透過 setGroupConversation 設定的群組對話中,必須顯示所有資源,包括透過 android.app.Person 提供的圖示。
  • [C-SR] 強烈建議在使用者多次關閉特定第三方應用程式的通知後,自動顯示使用者可用的選項,讓使用者依管道和應用程式套件層級封鎖該應用程式的通知。
  • SHOULD support rich notifications.
  • SHOULD 將部分優先順序較高的通知顯示為抬頭通知。
  • SHOULD have a user affordance to snooze notifications.
  • MAY 只能管理第三方應用程式何時可通知使用者重要事件,以減輕駕駛人分心等安全問題。

Android 11 支援對話通知,這類通知會使用 MessagingStyle,並提供已發布的 People 捷徑 ID。

裝置實作方式:

如果裝置實作項目支援 conversation notifications,且應用程式提供 bubbles 的必要資料,則:

  • [C-SR] Are STRONGLY RECOMMENDED to display this conversation as a bubble. AOSP 實作項目符合這些需求,並使用預設的系統 UI、設定和啟動器。

如果裝置實作支援豐富通知,則:

  • [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] MUST correctly and promptly update notifications in their entirety to all such installed and user-enabled listener services, including any and all metadata attached to the Notification object.
  • [C-0-2] 必須遵守 snoozeNotification() API 呼叫,並在 API 呼叫中設定的暫緩時間過後,關閉通知並進行回呼。

如果裝置實作項目提供延後通知的使用者功能,則:

  • [C-1-1] 必須透過 NotificationListenerService.getSnoozedNotifications() 等標準 API 正確反映已暫緩通知的狀態。
  • [C-1-2] 必須提供這項使用者功能,讓使用者暫緩接收各個已安裝第三方應用程式的通知,但來自持續性/前景服務的通知除外。
3.8.3.3. DND (零打擾)

如果裝置實作支援「請勿打擾」功能,則:

  • [C-1-1] 裝置實作必須提供方法,讓使用者授予或拒絕第三方應用程式存取「勿擾」政策設定,並在使用者建立和預先定義的規則旁,顯示應用程式建立的自動勿擾規則
  • [C-1-3] 必須遵守透過 NotificationManager.Policy 傳遞的 suppressedVisualEffects 值,且如果應用程式已設定 SUPPRESSED_EFFECT_SCREEN_OFF 或 SUPPRESSED_EFFECT_SCREEN_ON 旗標,則應在「請勿打擾」設定選單中向使用者指出視覺效果已遭停用。

Android 內含多項 API,可供開發人員在應用程式中加入搜尋功能,並將應用程式資料公開到全域系統搜尋中。一般來說,這項功能包含單一系統層級的使用者介面,可供使用者輸入查詢內容、在使用者輸入時顯示建議,以及顯示結果。開發人員可透過 Android API 重複使用這個介面,在自己的應用程式中提供搜尋功能,並將結果提供給一般全域搜尋使用者介面。

  • Android 裝置實作項目「應」包含全域搜尋功能,也就是單一的系統共用搜尋使用者介面,能夠即時建議使用者輸入的內容。

如果裝置實作項目實作了全域搜尋介面,則:

  • [C-1-1] MUST implement the APIs that allow third-party applications to add suggestions to the search box when it is run in global search mode.

如果沒有安裝任何使用全域搜尋的第三方應用程式:

  • 預設行為應為顯示網頁搜尋引擎結果和建議。

Android 也提供 Assist API,讓應用程式選擇要與裝置上的助理分享多少目前情境的資訊。

如果裝置實作支援「協助」動作,則:

  • [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] MUST provide a user affordance to block an app from displaying alert windows that use the TYPE_APPLICATION_OVERLAY . AOSP 實作會在通知匣中提供控制項,以滿足這項需求。

  • [C-1-2] MUST honor the Toast API and display Toasts from applications to end users in some highly visible manner.

3.8.6. 主題

Android 提供「主題」機制,讓應用程式在整個 Activity 或應用程式中套用樣式。

Android 包含「Holo」和「Material」主題系列,應用程式開發人員可使用這組定義的樣式,配合 Android SDK 定義的 Holo 主題外觀和風格

如果裝置實作項目包含螢幕或視訊輸出,則:

  • [C-1-1] 不得變更向應用程式公開的任何 Holo 主題屬性
  • [C-1-2] 必須支援「Material」主題系列,且不得變更任何材質主題屬性或向應用程式公開的資產。
  • [C-1-3] 必須為 Roboto 支援的語言,將「sans-serif」字型系列設為 Roboto 2.x 版,或提供使用者功能,讓使用者能為 Roboto 支援的語言,將「sans-serif」字型系列使用的字型變更為 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] MUST report the platform feature flag android.software.live_wallpaper.

3.8.8. 切換活動

上游 Android 原始碼包含總覽畫面,這是系統層級的使用者介面,可切換工作,並顯示最近存取的活動和工作,方法是使用使用者上次離開應用程式時,應用程式圖形狀態的縮圖。

裝置實作 (包括「最近」功能導覽鍵,詳情請參閱第 7.2.3 節)「可能」會變更介面。

如果裝置實作項目 (包括第 7.2.3 節詳述的「最近使用的應用程式」功能導覽鍵) 會改變介面,則:

  • [C-1-1] 必須支援至少 7 項顯示的活動。
  • SHOULD at least display the title of 4 activities at a time.
  • [C-1-2] 必須實作螢幕固定行為,並提供設定選單供使用者切換這項功能。
  • 應在「最近」中顯示醒目顯示顏色、圖示和畫面標題。
  • 「應該」顯示關閉功能 (「x」),但「可以」延遲顯示,直到使用者與畫面互動。
  • SHOULD 實作快速鍵,以便輕鬆切換至上一個活動。
  • SHOULD 觸發最近使用的兩個應用程式之間的快速切換動作,方法是輕觸兩次「最近使用的應用程式」功能鍵。
  • 如果支援,長按「最近使用」功能鍵「應」會觸發分割畫面多視窗模式。
  • 可將相關的近期項目顯示為可一起移動的群組。
  • [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 貨幣符號區塊中的所有字形。
  • 應支援萬國碼技術報告 #51 中指定的膚色和多元家庭表情符號。

如果裝置實作項目包含 IME,則:

  • SHOULD 為使用者提供這些表情符號字元的輸入方式。

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] MUST honor android:resizeableActivity that is set by an app in the AndroidManifest.xml file as described in this SDK.
  • [C-1-3] 如果螢幕高度小於 440 dp 且螢幕寬度小於 440 dp,則不得提供分割畫面或任意形式模式。
  • [C-1-4] 在子母畫面以外的多視窗模式中,活動大小不得縮小至 220dp 以下。
  • 螢幕尺寸為 xlarge 的裝置實作項目「應」支援任意形式模式。

如果裝置實作項目支援多視窗模式和分割畫面模式,則:

  • [C-2-1] 必須預先載入可調整大小的啟動器做為預設啟動器。
  • [C-2-2] 如果啟動器應用程式是焦點視窗,則必須裁剪分割畫面多視窗模式的停駐活動,但應顯示部分內容。
  • [C-2-3] MUST honor the declared AndroidManifestLayout_minWidth and AndroidManifestLayout_minHeight values of the third-party launcher application and not override these values in the course of showing some content of the docked activity.

如果裝置實作項目支援多視窗模式和子母畫面多視窗模式,則:

  • [C-3-1] 應用程式必須在子母畫面多視窗模式下啟動活動,條件如下:* 目標 API 級別為 26 以上,且宣告 android:supportsPictureInPicture。* 目標 API 級別為 25 以下,且同時宣告 android:resizeableActivityandroid:supportsPictureInPicture
  • [C-3-2] 必須透過 setActions() API,在 SystemUI 中公開目前子母畫面活動指定的操作。
  • [C-3-3] 必須支援大於或等於 1:2.39 且小於或等於 2.39:1 的長寬比,如 PIP 活動透過 setAspectRatio() API 指定。
  • [C-3-4] 必須使用 KeyEvent.KEYCODE_WINDOW 控制子母畫面視窗;如果未實作子母畫面模式,則必須讓前景活動使用該鍵。
  • [C-3-5] 必須提供使用者功能,讓使用者封鎖應用程式以子母畫面模式顯示;AOSP 實作方式符合這項規定,因為通知陰影中含有控制項。
  • [C-3-6] 如果應用程式未宣告 AndroidManifestLayout_minWidthAndroidManifestLayout_minHeight 的任何值,則必須為子母畫面視窗分配下列最小寬度和高度:

    • 如果裝置的 Configuration.uiMode 設定不是 UI_MODE_TYPE_TELEVISION,則必須分配至少 108 dp 的寬度和高度。
    • 如果裝置的 Configuration.uiMode 設為 UI_MODE_TYPE_TELEVISION,則必須分配至少 240 dp 的寬度和 135 dp 的高度。

3.8.15。螢幕凹口

Android 支援 SDK 文件所述的螢幕凹口。DisplayCutout API 會定義顯示器邊緣的區域,由於顯示器凹口或邊緣的曲面,應用程式可能無法在該區域運作。

如果裝置實作項目包含螢幕凹口,則:

  • [C-1-5] 如果裝置的顯示比例為 1.0 (1:1),則「不得」有凹口。
  • [C-1-2] 每條邊緣最多只能有一個凹口。
  • [C-1-3] MUST honor the display cutout flags set by the app through the WindowManager.LayoutParams API as described in the SDK.
  • [C-1-4] 必須回報 DisplayCutout API 中定義的所有剪裁指標的正確值。

3.8.16. 裝置控制

Android 包含 ControlsProviderServiceControl API,可讓第三方應用程式發布裝置控制項,供使用者快速查看狀態及執行動作。

如要瞭解裝置專屬需求,請參閱第 2_2_3 節。

3.9. 裝置管理

Android 內建多項功能,可讓注重安全性的應用程式透過 Android 裝置管理 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-2] 必須在佈建程序開始前或進行期間,要求使用者採取確認動作,同意將應用程式設為裝置擁有者。同意聲明可透過使用者操作或程式輔助方式取得,但啟動裝置擁有者佈建程序前,必須顯示適當的揭露事項通知 (如 AOSP 所述)。此外,企業用於佈建裝置擁有者的程式輔助裝置擁有者同意聲明機制,不得干擾非企業用途的開箱體驗。
  • [C-1-3] 不得硬式編碼同意聲明,或禁止使用其他裝置擁有者應用程式。

如果裝置實作項目宣告 android.software.device_admin,但同時包含專屬的裝置擁有者管理解決方案,並提供機制將解決方案中設定的應用程式升級為「裝置擁有者等同項目」,以取代標準 Android DevicePolicyManager API 辨識的標準「裝置擁有者」,則:

  • [C-2-1] 必須建立程序,確認宣傳的特定應用程式屬於正當的企業裝置管理解決方案,且已在專有解決方案中設定,具備等同於「裝置擁有者」的權限。
  • [C-2-2] 註冊 DPC 應用程式為「裝置擁有者」前,必須顯示與 android.app.action.PROVISION_MANAGED_DEVICE 啟動流程相同的 AOSP 裝置擁有者同意聲明揭露事項。
  • 在將 DPC 應用程式註冊為「裝置擁有者」之前,裝置上「可能」有使用者資料。
3.9.1.2 受管理設定檔佈建

如果裝置實作項目宣告 android.software.managed_users,則:

  • [C-1-1] MUST implement the APIs allowing a Device Policy Controller (DPC) application to become the owner of a new Managed Profile.

  • [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] MUST allow one and only one managed profile to be created.
  • [C-1-3] 必須使用圖示徽章 (類似於 AOSP 上游工作徽章),代表受管理應用程式和 Widget,以及其他帶有徽章的 UI 元素,例如「最近使用的應用程式」和「通知」。
  • [C-1-4] 必須顯示通知圖示 (類似於 AOSP 上游工作徽章),指出使用者何時位於受管理設定檔應用程式中。
  • [C-1-5] 裝置喚醒 (ACTION_USER_PRESENT) 時,如果前景應用程式位於受管理設定檔中,就必須顯示訊息,指出使用者位於受管理設定檔。
  • [C-1-6] 如果有受管理設定檔,則必須在 Intent「選擇器」中顯示視覺提示,讓使用者將 Intent 從受管理設定檔轉送至主要使用者,或反向轉送 (如果裝置政策控制器已啟用)。
  • [C-1-7] 如果有受管理設定檔,則必須為主要使用者和受管理設定檔提供下列使用者功能:
    • 分別計算主要使用者和受管理設定檔的電池、位置資訊、行動數據和儲存空間用量。
    • 獨立管理主要使用者或受管理設定檔中安裝的 VPN 應用程式。
    • 獨立管理主要使用者或受管理設定檔中安裝的應用程式。
    • 在主要使用者或受管理設定檔中,獨立管理帳戶。
  • [C-1-8] 必須確保預先安裝的撥號、聯絡人和訊息應用程式可以從受管理設定檔 (如有) 和主要設定檔中搜尋及查詢來電者資訊 (如果裝置政策控制器允許)。
  • [C-1-9] 即使受管理設定檔不計為主要使用者以外的其他使用者,也必須確保符合適用於啟用多使用者裝置的所有安全性規定 (請參閱第 9.5 節)。

如果裝置實作項目宣告 android.software.managed_usersandroid.software.secure_lock_screen,則:

  • [C-2-1] 必須支援指定符合下列規定的獨立鎖定畫面,僅授予受管理設定檔中執行的應用程式存取權。
  • 當預先安裝的通話記錄、通話中 UI、進行中和未接來電通知中顯示受管理設定檔的聯絡人時,聯絡人和訊息應用程式「應該」會標示與受管理設定檔應用程式相同的徽章。

3.9.3 受管理使用者支援

如果裝置實作項目宣告 android.software.managed_users,則:

  • [C-1-1] isLogoutEnabled 傳回 true 時,必須提供使用者介面,讓使用者登出目前使用者,並切換回多使用者工作階段中的主要使用者。使用者必須能在不解鎖裝置的情況下,從鎖定畫面存取使用者介面。

3.10. 無障礙功能

Android 提供無障礙層,可協助身心障礙使用者更輕鬆地操作裝置。此外,Android 也提供平台 API,讓無障礙服務實作項目接收使用者和系統事件的回呼,並產生替代意見回饋機制,例如文字轉語音、觸覺回饋,以及觸控球/D-Pad 導覽。

如果裝置實作項目支援第三方無障礙服務,則:

  • [C-1-1] 必須實作 Android 無障礙架構,如 Accessibility API SDK 說明文件所述。
  • [C-1-2] MUST generate accessibility events and deliver the appropriate AccessibilityEvent to all registered AccessibilityService implementations as documented in the SDK.
  • [C-1-4] 啟用的無障礙服務宣告 AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON 時,系統的導覽列中必須新增按鈕,讓使用者控制無障礙服務。請注意,如果裝置實作項目沒有系統導覽列,則不適用這項規定,但裝置實作項目「應」提供使用者控制這些無障礙服務的機制。

如果裝置實作項目包含預先安裝的無障礙服務,則:

  • [C-2-1] 如果資料儲存空間採用檔案加密 (FBE) 技術加密,則必須將這些預先安裝的無障礙服務實作為直接啟動感知應用程式。
  • 在開箱即用的設定流程中,SHOULD 提供機制,讓使用者啟用相關無障礙服務,以及調整字型大小、顯示大小和放大手勢的選項。

3.11. Text-to-Speech

Android 內含的 API 可供應用程式使用文字轉語音 (TTS) 服務,服務供應商也能提供 TTS 服務的實作項目。

如果裝置實作項目回報 android.hardware.audio.output 功能,則:

如果裝置實作支援安裝第三方 TTS 引擎,則:

  • [C-2-1] MUST provide user affordance to allow the user to select a TTS engine for use at system level.

3.12. 電視輸入架構

Android 電視輸入架構 (TIF) 可簡化將直播內容傳送到 Android 電視裝置的程序。TIF 提供標準 API,可建立控制 Android TV 裝置的輸入模組。

如果裝置實作支援 TIF,則:

  • [C-1-1] 必須宣告平台功能 android.software.live_tv
  • [C-1-2] 必須支援所有 TIF API,以便在裝置上安裝及使用這些 API 和第三方 TIF 輸入服務。

3.13. 快速設定

Android 提供「快速設定」UI 元件,可快速存取常用或緊急需要的動作。

如果裝置實作項目包含「快速設定」使用者介面元件,且支援第三方「快速設定」,則:

  • [C-1-1] MUST allow the user to add or remove the tiles provided through the quicksettings APIs from a third-party app.
  • [C-1-2] 不得直接將第三方應用程式的動態磚自動新增至「快速設定」。
  • [C-1-3] 必須顯示使用者從第三方應用程式新增的所有動態磚,以及系統提供的快速設定動態磚。

3.14. 媒體 UI

如果裝置實作項目包含透過 MediaBrowserMediaSession 與第三方應用程式互動的非語音啟動應用程式 (以下簡稱「應用程式」),則這些應用程式:

  • [C-1-2] 必須清楚顯示透過 getIconBitmap() 或 getIconUri() 取得的圖示,以及透過 getTitle() 取得的標題,如 MediaDescription 所述。可能會縮短標題,以符合安全法規 (例如駕駛人分心)。

  • [C-1-3] 顯示第三方應用程式提供的內容時,必須顯示第三方應用程式圖示。

  • [C-1-4] 必須允許使用者與整個 MediaBrowser 階層互動。為遵守安全法規 (例如駕駛人分心),MAY 限制部分層級的存取權,但 MUST NOT 根據內容或內容供應商給予優先待遇。

  • [C-1-5] MUST consider double tap of KEYCODE_HEADSETHOOK or KEYCODE_MEDIA_PLAY_PAUSE as KEYCODE_MEDIA_NEXT for MediaSession.Callback#onMediaButtonEvent.

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 預設的系統 UI、設定和啟動器符合相關規定。
  • [C-1-2] MUST provide a user affordance to view and delete Instant Apps locally cached for each individual app package.
  • [C-1-3] 免安裝應用程式在前台執行時,必須提供可收合的常駐使用者通知。這則使用者通知「必須」包含免安裝應用程式不需要安裝的說明,並提供使用者提示,將使用者導向「設定」中的應用程式資訊畫面。如果是透過網頁意圖啟動的免安裝應用程式 (定義方式為使用動作設為 Intent.ACTION_VIEW 的意圖,且配置「http」或「https」的架構),額外的使用者功能應允許使用者不啟動免安裝應用程式,而是透過設定的網頁瀏覽器啟動相關聯的連結 (如果裝置上有瀏覽器)。
  • [C-1-4] 如果裝置提供「最近」功能,則「最近」功能必須允許存取執行的即時應用程式。
  • [C-1-5] MUST preload one or more applications or service components with an intent handler for the intents listed in the SDK here and make the intents visible for Instant Apps.

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] MUST provide a UI affordance to chose the app that won't participate in the normal state save/restore mechanism once the user launches a second app declared with cantSaveState attribute.
  • [C-1-3] 不得對指定 cantSaveState 的應用程式套用其他政策變更,例如變更 CPU 效能或排程優先順序。

如果裝置實作項目未宣告 FEATURE_CANT_SAVE_STATE 功能,則:

  • [C-1-1] MUST ignore the cantSaveState attribute set by apps and MUST NOT change the app behavior based on that attribute.

3.18. 聯絡人

Android 包含 Contacts Provider API,可讓應用程式管理裝置上儲存的聯絡資訊。直接輸入裝置的聯絡人資料通常會與網路服務同步,但資料也可能只儲存在裝置上。只儲存在裝置上的聯絡人稱為本機聯絡人

當原始聯絡人的 ACCOUNT_NAMEACCOUNT_TYPE 欄與帳戶的對應 Account.nameAccount.type 欄位相符時,原始聯絡人會「與」帳戶「建立關聯」或「儲存在」帳戶中。

預設本機帳戶:原始聯絡人帳戶,只會儲存在裝置上,不會與 AccountManager 中的帳戶建立關聯,且會為 ACCOUNT_NAMEACCOUNT_TYPE 欄建立 null 值。

自訂本機帳戶:原始聯絡人專用的帳戶,只會儲存在裝置上,不會與 AccountManager 中的帳戶建立關聯,且是使用 ACCOUNT_NAMEACCOUNT_TYPE 欄的至少一個非空值建立。

裝置實作方式:

  • [C-SR] 強烈建議不要建立自訂本機帳戶

如果裝置實作項目使用自訂本機帳戶

4. 應用程式封裝相容性

裝置實作方式:

  • [C-0-1] 必須能夠安裝及執行 Android「.apk」檔案,這些檔案是由官方 Android SDK 內含的「aapt」工具產生。
  • 由於上述要求可能較為困難,建議裝置實作項目使用 AOSP 參考實作項目的套件管理系統。

裝置實作方式:

  • [C-0-2] 必須支援使用 APK 簽署配置 v3APK 簽署配置 v2JAR 簽署驗證「.apk」檔案。
  • [C-0-3] 不得擴充 .apkAndroid 資訊清單Dalvik 位元碼或 RenderScript 位元碼格式,以免這些檔案無法在其他相容裝置上正確安裝及執行。
  • [C-0-4] 根據 DELETE_PACKAGE 權限的 SDK 說明文件,應用程式不得允許套件的「記錄安裝程式」以外的應用程式,在未經使用者確認的情況下,以無聲模式解除安裝應用程式。例外狀況只有處理 PACKAGE_NEEDS_VERIFICATION Intent 的系統套件驗證器應用程式,以及處理 ACTION_MANAGE_STORAGE Intent 的儲存空間管理員應用程式。

  • [C-0-5] 必須有處理 android.settings.MANAGE_UNKNOWN_APP_SOURCES 意圖的活動。

  • [C-0-6] 不得安裝來源不明的應用程式套件,除非要求安裝的應用程式符合下列所有規定:

    • 必須宣告 REQUEST_INSTALL_PACKAGES 權限,或將 android:targetSdkVersion 設為 24 以下。
    • 使用者必須已授予權限,允許安裝來源不明的應用程式。
  • SHOULD provide a user affordance to grant/revoke the permission to install apps from unknown sources per application, but MAY choose to implement this as a no-op and return RESULT_CANCELED for startActivityForResult(), if the device implementation does not want to allow users to have this choice. 不過,即使在這種情況下,他們也「應該」向使用者說明為何沒有顯示這類選項。

  • [C-0-7] 啟動應用程式中的活動前,如果該應用程式已由系統 API PackageManager.setHarmfulAppWarning 標示為可能有害,則 MUST 向使用者顯示警告對話方塊,並提供透過系統 API PackageManager.setHarmfulAppWarning 提供的警告字串。

  • SHOULD 提供使用者介面,讓使用者在警告對話方塊中選擇解除安裝或啟動應用程式。

  • [C-0-8] MUST implement support for Incremental File System as documented here.

  • [C-0-9] MUST support verifying .apk files using the APK Signature Scheme v4.

  • 如果裝置實作項目已在舊版 Android 上推出,且無法透過系統軟體更新滿足 [C-0-8] 和 [C-0-9] 的需求,則「可能」可免除這些需求。

5. 多媒體相容性

裝置實作方式:

  • [C-0-1] 必須支援第 5.1 節中定義的媒體格式、編碼器、解碼器、檔案類型和容器格式,適用於 MediaCodecList 宣告的每個轉碼器。
  • [C-0-2] MUST declare and report support of the encoders, decoders available to third-party applications via MediaCodecList.
  • [C-0-3] 必須能夠正確解碼,並向第三方應用程式提供所有可編碼的格式。包括編碼器產生的所有位元串流,以及 CamcorderProfile 中回報的設定檔。

裝置實作方式:

  • SHOULD aim for minimum codec latency, in others words, they
    • 不應取用及儲存輸入緩衝區,且處理完畢後只能傳回輸入緩衝區。
    • 不應保留解碼緩衝區,時間長度超出標準 (例如 SPS) 指定的時間。
    • SHOULD NOT hold onto encoded buffers longer than required by the GOP structure.

下列各節列出的所有轉碼器,都是以軟體實作方式提供,且是 Android 開放原始碼計畫中偏好的 Android 實作方式。

請注意,Google 和 Open Handset Alliance 均未聲明這些轉碼器不受第三方專利限制。有意在硬體或軟體產品中使用這項原始碼者,請注意,實作這項程式碼 (包括在開放原始碼軟體或共享軟體中) 可能需要向相關專利權人取得專利授權。

5.1. 媒體轉碼器

5.1.1. 音訊編碼

詳情請參閱 5.1.3 節。音訊轉碼器詳細資料

如果裝置實作項目聲明 android.hardware.microphone,就「必須」支援下列音訊格式的編碼,並提供給第三方應用程式:

  • [C-1-1] PCM/WAVE
  • [C-1-2] FLAC
  • [C-1-3] Opus

所有音訊編碼器都必須支援:

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 設定檔 (AAC+)
  • [C-1-3] MPEG-4 HE AACv2 設定檔 (增強型 AAC+)
  • [C-1-4] AAC ELD (增強型低延遲 AAC)
  • [C-1-11] xHE-AAC (ISO/IEC 23003-3 擴充 HE AAC 設定檔,包括 USAC 基準設定檔和 ISO/IEC 23003-4 動態範圍控制設定檔)
  • [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 的「Dynamic Range Control (DRC)」一節所定義,且 android.media.MediaFormat DRC 鍵可設定音訊解碼器的動態範圍相關行為。API 21 導入了 AAC DRC 金鑰,包括:KEY_AAC_DRC_ATTENUATION_FACTORKEY_AAC_DRC_BOOST_FACTORKEY_AAC_DRC_HEAVY_COMPRESSIONKEY_AAC_DRC_TARGET_REFERENCE_LEVELKEY_AAC_ENCODED_TARGET_LEVEL
  • [SR] 強烈建議所有 AAC 音訊解碼器都符合上述 C-2-1 和 C-2-2 規定。

解碼 USAC 音訊時,MPEG-D (ISO/IEC 23003-4):

  • [C-3-1] 必須根據 MPEG-D DRC Dynamic Range Control Profile Level 1 解讀及套用響度和 DRC 中繼資料。
  • [C-3-2] 解碼器必須根據使用下列 android.media.MediaFormat 鍵設定的設定運作:KEY_AAC_DRC_TARGET_REFERENCE_LEVELKEY_AAC_DRC_EFFECT_TYPE

MPEG-4 AAC、HE AAC 和 HE AACv2 設定檔解碼器:

  • MAY 支援使用 ISO/IEC 23003-4 動態範圍控制設定檔控制音量和動態範圍。

如果系統支援 ISO/IEC 23003-4,且解碼位元串流中同時存在 ISO/IEC 23003-4 和 ISO/IEC 14496-3 中繼資料,則:

  • ISO/IEC 23003-4 中繼資料應優先採用。

所有音訊解碼器「必須」支援輸出:

5.1.3. 音訊轉碼器詳細資料

格式/轉碼器 詳細資料 支援的檔案類型/容器格式
MPEG-4 AAC 設定檔
(AAC LC)
支援單聲道/立體聲/5.0/5.1 內容,標準取樣率為 8 到 48 kHz。
  • 3GPP (.3gp)
  • MPEG-4 (.mp4、.m4a)
  • ADTS 原始 AAC (.aac,不支援 ADIF)
  • MPEG-TS (.ts,無法搜尋,只能解碼)
  • Matroska (.mkv,僅限解碼)
MPEG-4 HE AAC 設定檔 (AAC+) 支援單聲道/立體聲/5.0/5.1 內容,標準取樣率為 16 至 48 kHz。
  • 3GPP (.3gp)
  • MPEG-4 (.mp4、.m4a)
MPEG-4 HE AACv2
設定檔 (增強型 AAC+)
支援單聲道/立體聲/5.0/5.1 內容,標準取樣率為 16 至 48 kHz。
  • 3GPP (.3gp)
  • MPEG-4 (.mp4、.m4a)
AAC ELD (增強型低延遲 AAC) 支援取樣率介於 16 到 48 kHz 的單聲道/立體聲內容。
  • 3GPP (.3gp)
  • MPEG-4 (.mp4、.m4a)
USAC 支援取樣率介於 7.35 至 48 kHz 的單聲道/立體聲內容。 MPEG-4 (.mp4、.m4a)
AMR-NB 以 8 kHz 取樣時,為 4.75 至 12.2 kbps 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 位元音訊資料的功能必須搭配浮點音訊設定使用。
  • FLAC (.flac)
  • MPEG-4 (.mp4、.m4a,僅限解碼)
  • Matroska (.mkv,僅限解碼)
MP3 單聲道/立體聲 8-320Kbps 固定位元率 (CBR) 或可變位元率 (VBR)
  • MP3 (.mp3)
  • MPEG-4 (.mp4、.m4a,僅限解碼)
  • Matroska (.mkv,僅限解碼)
MIDI MIDI 類型 0 和 1。DLS 第 1 版和第 2 版。XMF 和 Mobile XMF。支援 RTTTL/RTX、OTA 和 iMelody 鈴聲格式
  • 類型 0 和 1 (.mid、.xmf、.mxmf)
  • RTTTL/RTX (.rtttl、.rtx)
  • iMelody (.imy)
Vorbis
  • Ogg (.ogg)
  • MPEG-4 (.mp4、.m4a,僅限解碼)
  • Matroska (.mkv)
  • Webm (.webm)
PCM/WAVE PCM 轉碼器必須支援 16 位元線性 PCM 和 16 位元浮點數。WAVE 擷取器必須支援 16 位元、24 位元、32 位元線性 PCM 和 32 位元浮點數 (速率上限為硬體限制)。取樣率必須支援 8 kHz 至 192 kHz。 WAVE (.wav)
Opus 解碼:支援取樣率為 8000、12000、16000、24000 和 48000 Hz 的單聲道、立體聲、5.0 和 5.1 內容。
編碼:支援取樣率為 8000、12000、16000、24000 和 48000 Hz 的單聲道和立體聲內容。
  • Ogg (.ogg)
  • MPEG-4 (.mp4、.m4a,僅限解碼)
  • Matroska (.mkv)
  • Webm (.webm)

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 編碼,則:

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] Raw

如果裝置實作項目支援 HEVC 影片解碼,則:* [C-1-1] 必須支援 HEIF (HEIC) 圖片解碼。

支援高位元深度格式 (每個管道 9 位元以上) 的圖片解碼器:

  • [C-2-1] 如應用程式要求,例如透過 android.graphics.BitmapARGB_8888 設定,則 MUST 支援輸出 8 位元等效格式。

5.1.6. 圖片轉碼器詳細資料

格式/轉碼器 詳細資料 支援的檔案類型/容器格式
JPEG Base+progressive 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] STRONGLY RECOMMENDED to support RGB888 color format for input Surface mode.

  • [C-1-3] 必須支援平面或半平面 YUV420 8:8:8 色彩格式,至少支援其中一種:COLOR_FormatYUV420PackedPlanar (相當於 COLOR_FormatYUV420Planar) 或 COLOR_FormatYUV420PackedSemiPlanar (相當於 COLOR_FormatYUV420SemiPlanar)。強烈建議同時支援這兩種格式。

5.1.7. 視訊轉碼器

  • 為確保網路影片串流和視訊會議服務的品質符合要求,裝置實作項目「應」使用符合規定的 VP8 硬體轉碼器。

如果裝置實作項目包含影片解碼器或編碼器:

  • [C-1-1] 視訊轉碼器「必須」支援輸出和輸入 bytebuffer 大小,以容納標準和設定所規定的最大可行壓縮和未壓縮影格,但也不會過度分配。

  • [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] MUST support the refresh periods in the range of 10 - 60 frames and accurately operate within 20% of configured refresh period.

除非應用程式使用 KEY_COLOR_FORMAT 格式鍵另行指定,否則影片解碼器實作項目:

  • [C-4-1] 如果使用 Surface 輸出設定,則必須預設為針對硬體螢幕最佳化的色彩格式。
  • [C-4-2] 如果設定為不使用 Surface 輸出,則必須預設為 YUV420 8:8:8 色彩格式,並針對 CPU 讀取進行最佳化。

5.1.8. 視訊轉碼器清單

格式/轉碼器 詳細資料 支援的檔案類型/容器格式
H.263
  • 3GPP (.3gp)
  • MPEG-4 (.mp4)
  • Matroska (.mkv,僅限解碼)
H.264 AVC 詳情請參閱第 5.2 節第 5.3 節
  • 3GPP (.3gp)
  • MPEG-4 (.mp4)
  • MPEG-2 TS (.ts,無法搜尋)
  • Matroska (.mkv,僅限解碼)
H.265 HEVC 詳情請參閱第 5.3 節
  • MPEG-4 (.mp4)
  • Matroska (.mkv,僅限解碼)
MPEG-2 主要設定檔
  • MPEG2-TS (.ts,無法搜尋)
  • MPEG-4 (.mp4,僅解碼)
  • Matroska (.mkv,僅限解碼)
MPEG-4 SP
  • 3GPP (.3gp)
  • MPEG-4 (.mp4)
  • Matroska (.mkv,僅限解碼)
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] STRONGLY RECOMMENDED that the OMX software codecs run in a codec process that does not have access to hardware drivers other than memory mappers.

如果裝置實作項目支援 Codec 2.0 API,則:

  • [C-3-1] 裝置支援的每種媒體格式和類型 (編碼器或解碼器),都必須包含 Android 開放原始碼專案中對應的 Codec 2.0 軟體轉碼器 (如有)。
  • [C-3-2] 必須在 Android 開放原始碼計畫提供的軟體轉碼器程序中,存放 Codec 2.0 軟體轉碼器,以便更精確地授予軟體轉碼器存取權。
  • [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] 編解碼器名稱不得誤導使用者。舉例來說,名為「解碼器」的轉碼器必須支援解碼,名為「編碼器」的轉碼器則必須支援編碼。名稱包含媒體格式的轉碼器「必須」支援這些格式。

如果裝置實作支援影片轉碼器:

  • [C-2-1] 如果轉碼器支援下列大小,所有影片轉碼器都必須發布可達成的影格速率資料:
SD (畫質不佳) SD (高畫質) HD 720p HD 1080p UHD
影片解析度
  • 176 x 144 像素 (H263、MPEG2、MPEG4)
  • 352 x 288 像素 (MPEG4 編碼器、H263、MPEG2)
  • 320 x 180 像素 (VP8、VP8)
  • 320 x 240 像素 (其他)
  • 704 x 576 像素 (H263)
  • 640 x 360 像素 (VP8、VP9)
  • 640 x 480 像素 (MPEG4 編碼器)
  • 720 x 480 像素 (其他)
  • 1408 x 1152 像素 (H263)
  • 1280 x 720 像素 (其他)
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] 必須支援動態設定位元率。
  • SHOULD support variable frame rates, where video encoder SHOULD determine instantaneous frame duration based on the timestamps of input buffers, and allocate its bit bucket based on that frame duration.

如果裝置實作項目支援 MPEG-4 SP 視訊編碼器,並提供給第三方應用程式使用,則:

  • 支援的編碼器「應」支援動態設定位元率。

如果裝置實作項目提供硬體加速的視訊或圖片編碼器,並支援透過 android.camera API 公開的一或多個附加或可插拔的硬體攝影機:

  • [C-4-1] 所有硬體加速影片和圖片編碼器都必須支援從硬體攝影機編碼影格。
  • 應支援透過所有影片或圖片編碼器,從硬體攝影機編碼影格。

5.2.1. H.263

如果裝置實作項目支援 H.263 編碼器,並提供給第三方應用程式,則:

  • [C-1-1] MUST support Baseline Profile Level 45.
  • 支援的編碼器「應」支援動態設定位元率。

5.2.2. H.264

如果裝置實作項目支援 H.264 轉碼器,則:

  • [C-1-1] MUST support Baseline Profile Level 3. 不過,ASO (任意切片排序)、FMO (彈性巨集區塊排序) 和 RS (冗餘切片) 支援為選用功能。此外,為維持與其他 Android 裝置的相容性,建議編碼器不要將 ASO、FMO 和 RS 用於基準設定檔。
  • [C-1-2] 必須支援下表中的 SD (標準畫質) 視訊編碼設定檔。
  • SHOULD support 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] MUST support the SD video encoding profiles.
  • 應支援下列高畫質視訊編碼設定檔。
  • [C-1-2] 必須支援寫入 Matroska WebM 檔案。
  • SHOULD provide a hardware VP8 codec that meets the WebM project RTC hardware coding requirements, to ensure acceptable quality of web video streaming and video-conference services.

如果裝置實作項目透過媒體 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] 必須支援設定檔 0 第 3 級。
  • [C-1-1] 必須支援寫入 Matroska WebM 檔案。
  • [C-1-3] 必須產生 CodecPrivate 資料。
  • 應支援下表所示的 HD 解碼設定檔。
  • [SR] are STRONGLY RECOMMENDED to support the HD decoding profiles as indicated in the following table if there is a hardware encoder.
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 支援設定檔 2 或設定檔 3:

  • 支援 12 位元格式為選用項目。

5.2.5. H.265

如果裝置實作項目支援 H.265 轉碼器,則:

  • [C-1-1] MUST support Main Profile Level 3.
  • 應支援下表所示的 HD 編碼設定檔。
  • [SR] 如果有硬體編碼器,強烈建議支援下表所示的 HD 編碼設定檔。
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] MUST support Baseline Profile Level 30 and Level 45.

5.3.3. MPEG-4

如果裝置實作項目包含 MPEG-4 解碼器,則:

  • [C-1-1] MUST support Simple Profile Level 3.

5.3.4. H.264

如果裝置實作項目支援 H.264 解碼器,則:

  • [C-1-1] 必須支援 Main Profile Level 3.1 和 Baseline Profile。ASO (任意切片排序)、FMO (彈性巨集區塊排序) 和 RS (冗餘切片) 為選用功能。
  • [C-1-2] 必須能夠解碼下列表格中列出的 SD (標準畫質) 設定檔影片,並以 Baseline Profile 和 Main Profile 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 設定檔層級 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 轉碼器。
  • SHOULD 支援下表中的 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 (支援 VP9 硬體解碼的電視為 60 fps) 60 fps
影片位元率 600 Kbps 1.6 Mbps 4 Mbps 5 Mbps 20 Mbps

如果裝置實作項目透過 'CodecProfileLevel' 媒體 API 聲稱支援 VP9Profile2VP9Profile3

  • 支援 12 位元格式為選用項目。

如果裝置實作項目聲稱透過媒體 API 支援 HDR 設定檔 (VP9Profile2HDRVP9Profile2HDR10PlusVP9Profile3HDRVP9Profile3HDR10Plus):

  • [C-4-1] 裝置實作項目必須接受應用程式提供的必要 HDR 中繼資料 (所有 HDR 設定檔的 KEY_HDR_STATIC_INFO,以及 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 起,本節列出的一些規定為「SHOULD」,但日後版本的相容性定義預計會將這些規定改為「MUST」。強烈建議現有和新的 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] MUST capture at above sample rates without up-sampling.

  • [C-1-3] 使用降取樣擷取上述取樣率時,必須加入適當的抗鋸齒濾波器。
  • 應允許以 AM 廣播和 DVD 品質擷取原始音訊內容,也就是具備下列特徵:

  • [C-2-1] MUST capture without up-sampling at any ratio higher than 16000:22050 or 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 振幅位準在麥克風的 90 dB SPL 範圍內,至少從 -18 dB 到 +12 dB,線性追蹤輸入 SPL 變化。
  • SHOULD 錄製語音辨識音訊串流,在麥克風的 90 dB SPL 輸入音量下,1 kHz 的總諧波失真 (THD) 應低於 1%。

如果裝置實作項目聲明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.outputandroid.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,則:

  • SHOULD 實作針對語音通訊調整的聲學回音消除器 (AEC) 技術,並在透過 AudioSource.VOICE_COMMUNICATION 擷取時套用至擷取路徑

如果裝置實作項目提供聲學回音消除器,且在選取 AudioSource.VOICE_COMMUNICATION 時插入擷取音訊路徑,則:

5.4.5. 同時擷取

如果裝置實作項目宣告 android.hardware.microphone,就「必須」實作並行擷取功能,如這份文件所述。具體來說:

  • [C-1-1] 必須允許無障礙服務透過 AudioSource.VOICE_RECOGNITION 擷取麥克風音訊,且至少有一個應用程式透過任何 AudioSource 擷取麥克風音訊。
  • [C-1-2] 預先安裝的應用程式必須允許同時存取麥克風,該應用程式必須具備 Google 助理角色,且至少有一個應用程式使用任何 AudioSource 擷取內容,但 AudioSource.VOICE_COMMUNICATIONAudioSource.CAMCORDER 除外。
  • [C-1-3] 應用程式使用 AudioSource.VOICE_COMMUNICATIONAudioSource.CAMCORDER 擷取音訊時,除了無障礙服務外,其他應用程式的音訊擷取功能都必須靜音。不過,如果應用程式透過 AudioSource.VOICE_COMMUNICATION 擷取音訊,且是具備 CAPTURE_AUDIO_OUTPUT 權限的預先安裝應用程式,就能擷取語音通話內容。
  • [C-1-4] 如果有兩個以上的應用程式同時擷取音訊,且沒有任何應用程式的 UI 位於最上層,則最近開始擷取的應用程式會收到音訊。

5.4.6. 麥克風增益等級

如果裝置實作項目宣告 android.hardware.microphone,則:

  • 在中間頻率範圍內,應呈現大致平坦的振幅與頻率特性:具體來說,用於錄製語音辨識音訊來源的每個麥克風,在 100 Hz 到 4000 Hz 範圍內應為 ±3dB。
  • 應設定音訊輸入靈敏度,使以 90 dB 音壓級 (SPL) 播放的 1000 Hz 正弦波音調來源,能為用於錄製語音辨識音訊來源的每個麥克風,產生 RMS 為 2500 的 16 位元樣本 (或浮點/雙精度樣本的 -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 子類別 EqualizerLoudnessEnhancer 控制的 EFFECT_TYPE_EQUALIZEREFFECT_TYPE_LOUDNESS_ENHANCER 實作項目。
  • [C-1-2] 必須支援視覺化工具 API 實作,並透過 Visualizer 類別控制。
  • [C-1-3] MUST support the EFFECT_TYPE_DYNAMICS_PROCESSING implementation controllable through the AudioEffect subclass DynamicsProcessing.
  • 應支援可透過 AudioEffect 子類別 BassBoostEnvironmentalReverbPresetReverbVirtualizer 控制的 EFFECT_TYPE_BASS_BOOSTEFFECT_TYPE_ENV_REVERBEFFECT_TYPE_PRESET_REVERBEFFECT_TYPE_VIRTUALIZER 實作項目。
  • [C-SR] 強烈建議支援浮點和多聲道效果。

5.5.3. 音訊輸出音量

車用裝置實作方式:

  • SHOULD allow adjusting audio volume separately per each audio stream using the content type or usage as defined by AudioAttributes and car audio usage as publicly defined in android.car.CarAudioManager.

5.6. 音訊延遲

音訊延遲是指音訊訊號通過系統時的時間延遲。許多類別的應用程式都依賴低延遲,才能實現即時音效。

本節所用定義如下:

  • 輸出延遲。應用程式寫入 PCM 編碼資料影格的時間間隔,以及對應聲音在裝置上轉換器呈現給環境的時間間隔,或訊號透過連接埠離開裝置並可從外部觀察的時間間隔。
  • 冷輸出延遲。第一個影格的輸出延遲時間,前提是音訊輸出系統在要求前處於閒置狀態並已關機。
  • 連續輸出延遲時間。裝置播放音訊後,後續影格的輸出延遲時間。
  • 輸入延遲。環境透過裝置上的轉換器向裝置發出聲音,或訊號透過連接埠進入裝置,到應用程式讀取相應的 PCM 編碼資料影格之間的時間間隔。
  • 遺失輸入內容。輸入信號的初始部分,無法使用或無法取得。
  • 冷輸入延遲。音訊輸入系統在要求前處於閒置和關機狀態時,遺失的輸入時間和第一個影格的輸入延遲時間總和。
  • 持續輸入延遲。裝置擷取音訊時,後續影格的輸入延遲時間。
  • 冷輸出抖動。各項冷啟動延遲值測量結果的變異性。
  • 冷輸入抖動。冷輸入延遲值各項測量結果之間的變異性。
  • 連續往返延遲時間。連續輸入延遲時間、連續輸出延遲時間和一個緩衝區週期的總和。緩衝期可讓應用程式處理訊號,並縮短輸入和輸出串流之間的相位差。
  • OpenSL ES PCM 緩衝區佇列 APIAndroid NDK 中的 PCM 相關 OpenSL ES API 集。
  • AAudio 原生音訊 APIAndroid NDK 中的 AAudio API 集。
  • 時間戳記。這類配對包含串流中的相對影格位置,以及該影格進入或離開相關端點音訊處理管道的預估時間。另請參閱 AudioTimestamp
  • glitch. 音訊訊號暫時中斷或樣本值不正確,通常是由於輸出發生緩衝區欠位、輸入發生緩衝區溢位,或任何其他數位或類比雜訊來源。

如果裝置實作項目聲明 android.hardware.audio.output,則必須符合或超過下列需求:

  • [C-1-1] AudioTrack.getTimestampAAudioStream_getTimestamp 傳回的輸出時間戳記精確度為 +/- 2 毫秒。
  • [C-1-2] 冷輸出延遲時間不超過 500 毫秒。

如果裝置實作項目聲明 android.hardware.audio.output,強烈建議符合或超過下列需求:

  • [C-SR] 冷輸出延遲時間不超過 100 毫秒。強烈建議現有和新裝置現在就符合這些規定,在 2021 年的未來平台版本中,我們將要求冷輸出延遲時間必須為 200 毫秒或更短。
  • [C-SR] 連續輸出延遲時間為 45 毫秒或更短的時間。
  • [C-SR] Minimize the cold output jitter.
  • [C-SR] AudioTrack.getTimestampAAudioStream_getTimestamp 傳回的輸出時間戳記精確度為 +/- 1 毫秒。

如果裝置實作符合上述需求,在完成任何初始校準後,使用 OpenSL ES PCM 緩衝區佇列和 AAudio 原生音訊 API 時,至少有一個支援的音訊輸出裝置的連續輸出延遲和冷輸出延遲時間為:

如果裝置實作無法透過 OpenSL ES PCM 緩衝區佇列和 AAudio 原生音訊 API,滿足低延遲音訊的需求,則:

  • [C-2-1] 不得回報支援低延遲音訊。

如果裝置實作項目包含 android.hardware.microphone,就必須符合下列輸入音訊規定:

  • [C-3-1] 將 AudioRecord.getTimestampAAudioStream_getTimestamp 傳回的輸入時間戳記錯誤限制為 +/- 2 毫秒。此處的「錯誤」是指與正確值的偏差。
  • [C-3-2] 冷輸入延遲時間不得超過 500 毫秒。

如果裝置實作項目包含 android.hardware.microphone,強烈建議符合下列輸入音訊需求:

  • [C-SR] 冷輸入延遲時間不超過 100 毫秒。強烈建議現有和新裝置現在就符合這些規定,在 2021 年的未來平台版本中,我們將要求冷輸入延遲時間必須為 200 毫秒以下。
  • [C-SR] 連續輸入延遲時間為 30 毫秒或更短的時間。
  • [C-SR] 連續往返延遲時間為 50 毫秒或更短的時間。
  • [C-SR] Minimize the cold input jitter.
  • [C-SR] 將 AudioRecord.getTimestampAAudioStream_getTimestamp 傳回的輸入時間戳記錯誤限制在 +/- 1 毫秒內。

5.7. 網路通訊協定

裝置實作項目「必須」支援 Android SDK 說明文件中指定的音訊和影片播放媒體網路通訊協定

如果裝置實作項目包含音訊或視訊解碼器,則:

  • [C-1-1] 必須透過 HTTP(S) 支援第 5.1 節中的所有必要轉碼器和容器格式。

  • [C-1-2] 必須透過 HTTP 即時串流草案通訊協定第 7 版,支援下表「媒體區段格式」中顯示的媒體區段格式。

  • [C-1-3] 必須支援下列 RTP 音訊視訊設定檔,以及下方 RTSP 表格中的相關轉碼器。如需例外狀況,請參閱第 5.1 節中的表格註腳。

媒體片段格式

區隔格式 參考資料 必須支援的轉碼器
MPEG-2 傳輸串流 ISO 13818 影片轉碼器:
  • H264 AVC
  • MPEG-4 SP
  • MPEG-2
如要瞭解 H264 AVC、MPEG2-4 SP 和 MPEG-2 的詳細資料,請參閱第 5.1.3 節

音訊轉碼器:

  • AAC
如要進一步瞭解 AAC 和其變體,請參閱第 5.1.1 節
含有 ADTS 框架和 ID3 標記的 AAC 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
詳情請參閱第 5.1.3 節
H263-2000 RFC 4629 詳情請參閱第 5.1.3 節
AMR RFC 4867 如要瞭解 AMR-NB 的詳細資訊,請參閱第 5.1.1 節
AMR-WB RFC 4867 詳情請參閱第 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 支援)

  • 應支援透過 USB 周邊裝置模式傳輸 MIDI,請參閱第 7.7 節

5.10. 專業音訊

如果裝置實作項目透過 android.content.pm.PackageManager 類別回報支援功能 android.hardware.audio.pro,則:

  • [C-1-1] MUST report support for feature android.hardware.audio.low_latency.
  • [C-1-2] 必須具有連續往返音訊延遲時間,如第 5.6 節「音訊延遲」所定義,且至少在一個支援的路徑中,必須為 20 毫秒或更短,建議為 10 毫秒或更短。
  • [C-1-3] 必須包含支援 USB 主機模式和 USB 周邊模式的 USB 連接埠。
  • [C-1-4] MUST report support for feature android.software.midi.
  • [C-1-5] 必須使用 OpenSL ES PCM 緩衝區佇列 API 和至少一個 AAudio 原生音訊 API 路徑,滿足延遲和 USB 音訊要求。
  • [SR] Are STRONGLY RECOMMENDED to meet latencies and USB audio requirements using the AAudio native audio API over the MMAP path.
  • [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 的漂移。
  • SHOULD minimize audio latency over on-device transducers.
  • SHOULD minimize audio latency over USB digital audio.
  • SHOULD document audio latency measurements over all paths.
  • SHOULD 盡量減少音訊緩衝區完成回呼項目時間的抖動,因為這會影響回呼可用的完整 CPU 頻寬百分比。
  • 在正常使用情況下,應在回報的延遲時間內提供零音訊故障。
  • SHOULD 提供零通道間延遲差異。
  • SHOULD 盡量減少所有傳輸的 MIDI 平均延遲時間。
  • 在所有傳輸方式中,都應盡量減少負載下的 MIDI 延遲變異性 (抖動)。
  • SHOULD provide accurate MIDI timestamps over all transports.
  • SHOULD minimize audio signal noise over on-device transducers, including the period immediately after cold start.
  • 如果對應端點都處於啟用狀態,輸入和輸出端之間應提供零音訊時鐘差異。對應的端點包括裝置上的麥克風和喇叭,或是音訊插孔輸入和輸出。
  • 如果輸入和輸出端點都處於啟用狀態,則應在同一執行緒上處理相應端點的音訊緩衝區完成回呼,並在從輸入回呼傳回後立即進入輸出回呼。或者,如果無法在同一個執行緒上處理回呼,請在輸入回呼後不久輸入輸出回呼,讓應用程式的輸入和輸出端保持一致的時間。
  • SHOULD minimize the phase difference between HAL audio buffering for the input and output sides of corresponding end-points.
  • SHOULD 盡量縮短觸控延遲時間。
  • SHOULD minimize touch latency variability under load (jitter).
  • 從觸控輸入到音訊輸出,延遲時間應小於或等於 40 毫秒。

如果裝置實作項目符合上述所有規定,則:

如果裝置實作項目包含 4 導體 3.5 公釐音訊插孔,則:

如果裝置實作省略 4 導體 3.5 公釐音訊插孔,並包含支援 USB 主機模式的 USB 連接埠,則:

  • [C-3-1] 必須實作 USB 音訊類別。
  • [C-3-2] MUST have a continuous round-trip audio latency of 20 milliseconds or less over the USB host mode port using USB audio class.
  • 透過 USB 主機模式連接埠使用 USB 音訊類別時,音訊往返延遲時間應不超過 10 毫秒。
  • [C-SR] 搭配也支援這些需求的 USB 音訊周邊裝置時,強烈建議支援雙向最多 8 個聲道、96 kHz 取樣率,以及 24 位元或 32 位元深度,以進行同步 I/O 作業。

如果裝置實作項目包含 HDMI 連接埠,則:

  • 應支援以 20 位元或 24 位元深度和 192 kHz 輸出立體聲和八個聲道,且至少在一個設定中不會遺失位元深度或重新取樣。

5.11. 擷取未處理的資料

Android 支援透過 android.media.MediaRecorder.AudioSource.UNPROCESSED 音訊來源錄製未經處理的音訊。在 OpenSL ES 中,可以使用錄音預設值 SL_ANDROID_RECORDING_PRESET_UNPROCESSED 存取。

如果裝置實作項目打算支援未經處理的音訊來源,並提供給第三方應用程式,則:

  • [C-1-1] MUST report the support through the android.media.AudioManager property PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED.

  • [C-1-2] 必須在中頻範圍內呈現大致平坦的振幅與頻率特性:具體來說,用於錄製未經處理音訊來源的每個麥克風,在 100 Hz 至 7000 Hz 範圍內必須為 ±10dB。

  • [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 正弦波音調來源,針對用於錄製未處理音訊來源的每個麥克風,產生 RMS 為 520 的 16 位元樣本 (或浮點/雙精度樣本的 -36 dB 滿刻度) 回應。

  • [C-1-6] 用於錄製未經處理音訊來源的每個麥克風,訊號雜訊比 (SNR) 必須達到 60 dB 以上。(而訊噪比的測量方式為 94 dB SPL 與等效 SPL 自我噪音 (A 加權) 之間的差異)。

  • [C-1-7] 錄製未經處理的音訊來源時,每個麥克風在 90 dB SPL 輸入位準下,1 kHz 的總諧波失真 (THD) 必須小於 1%。

  • 路徑中不得有任何其他訊號處理作業 (例如自動增益控制、高通濾波器或迴音消除),只能有將音量帶入所需範圍的音量乘數。換句話說:

  • [C-1-8] 如果架構中因任何原因出現信號處理程序,則必須停用該程序,並有效將信號路徑的延遲或額外延遲時間降至零。
  • [C-1-9] 雖然路徑上可以有位準乘數,但不得為訊號路徑帶來延遲或延遲時間。

所有聲壓位準測量值都是在受測麥克風旁直接測得。如果有多個麥克風設定,這些規定適用於每個麥克風。

如果裝置實作項目宣告 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 開發人員工具。
  • Android Debug Bridge (adb)

    • [C-0-2] MUST support adb as documented in the Android SDK and the shell commands provided in the AOSP, which can be used by app developers, including dumpsys cmd stats
    • [C-0-11] 必須支援殼層指令 cmd testharness。如果裝置實作項目是從較舊的 Android 版本升級,且沒有持續性資料區塊,則可能可免除 C-0-11 規定。
    • [C-0-3] 不得變更透過 dumpsys 指令記錄的裝置系統事件 (batterystats、diskstats、指紋、graphicsstats、netstats、通知、procstats) 格式或內容。
    • [C-0-10] 必須完整記錄下列事件,並透過 cmd stats shell 指令和 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 Debug Bridge。
    • [C-0-5] 必須支援安全 ADB。Android 支援安全 adb。安全 adb 可讓已知已驗證的主機使用 adb。
    • [C-0-6] MUST provide a mechanism allowing adb to be connected from a host machine. 具體來說:

    如果沒有 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
  • Dalvik 偵錯監視器服務 (ddms)

    • [C-0-7] MUST support all ddms features as documented in the Android SDK. 由於 ddms 使用 adb,因此預設情況下,系統「應」停用 ddms 支援,但只要使用者已啟用 Android 偵錯橋接器 (如上所述),系統「必須」支援 ddms。
  • Monkey
    • [C-0-8] 必須包含 Monkey 架構,並供應用程式使用。
  • SysTrace
    • [C-0-9] MUST support the systrace tool as documented in the Android SDK. Systrace 預設必須處於非啟用狀態,且必須提供使用者可存取的機制來啟用 Systrace。
  • Perfetto
    • [C-SR] STRONGLY RECOMMENDED to expose a /system/bin/perfetto binary to the shell user which cmdline complies with the perfetto documentation.
    • [C-SR] 強烈建議 perfetto 二進位檔接受符合perfetto 說明文件中定義結構的 protobuf 設定做為輸入內容。
    • [C-SR] 強烈建議 perfetto 二進位檔將 protobuf 追蹤記錄寫入輸出內容,並遵守perfetto 說明文件中定義的結構定義。
    • [C-SR] 強烈建議透過 perfetto 二進位檔提供至少perfetto 說明文件中描述的資料來源。
  • 記憶體不足終止工具
    • [C-0-10] 應用程式遭 Low Memory Killer 終止時,必須將 LMK_KILL_OCCURRED_FIELD_NUMBER Atom 寫入 statsd 記錄檔。
  • 測試控管工具模式 如果裝置實作項目支援 cmd testharness 殼層指令並執行 cmd testharness enable,則:
    • [C-2-1] MUST return true for ActivityManager.isRunningInUserTestHarness()
    • [C-2-2] MUST implement Test Harness Mode as described in Test Harness Mode documentation.

如果裝置實作項目透過 android.hardware.vulkan.version 功能標記回報支援 Vulkan 1.0 以上版本,則:

  • [C-1-1] MUST provide an affordance for the app developer to enable/disable GPU debug layers.
  • [C-1-2] 啟用 GPU 偵錯層時,必須列舉偵錯應用程式基本目錄中,外部工具 (即不屬於平台或應用程式套件) 所提供程式庫中的層,以支援 vkEnumerateInstanceLayerProperties()vkCreateInstance() API 方法。

6.2. 開發人員選項

Android 支援開發人員設定應用程式開發相關設定。

裝置實作「必須」提供一致的「開發人員選項」體驗,包括:

  • [C-0-1] MUST honor the android.settings.APPLICATION_DEVELOPMENT_SETTINGS intent to show application development-related settings. 上游 Android 實作會預設隱藏「開發人員選項」選單,使用者只要依序按下「設定」 >「關於裝置」 >「版本號碼」選單項目七次,即可啟動「開發人員選項」。
  • [C-0-2] 必須預設隱藏「開發人員選項」。
  • [C-0-3] 必須提供明確機制,不得偏袒任何第三方應用程式,以啟用「開發人員選項」。必須提供公開文件或網站,說明如何啟用「開發人員選項」。這個文件或網站「必須」可從 Android SDK 文件連結。
  • 如果啟用「開發人員選項」且使用者安全堪慮,裝置「應該」持續向使用者顯示視覺通知。
  • MAY 會暫時限制存取「開發人員選項」選單,方法是隱藏或停用該選單,避免使用者在安全堪慮的情況下分心。

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] 如果 SDK 說明文件不允許空值,API 方法必須傳回類別的無運算實作項目。
  • [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 螢幕完成正規化,計算方式為:像素 = 密度獨立像素 * (密度/160)。

7.1.1. 螢幕設定

7.1.1.1. 螢幕大小和形狀

Android UI 架構支援各種不同的邏輯螢幕版面配置大小,並允許應用程式透過 Configuration.screenLayout,使用 SCREENLAYOUT_SIZE_MASKConfiguration.smallestScreenWidthDp 查詢目前設定的螢幕版面配置大小。

裝置實作方式:

  • [C-0-1] MUST report the correct layout size for the Configuration.screenLayout as defined in the Android SDK documentation. 具體來說,裝置實作內容「必須」回報正確的邏輯密度獨立像素 (dp) 螢幕尺寸,如下所示:

    • 如果裝置的 Configuration.uiMode 設為 UI_MODE_TYPE_WATCH 以外的任何值,且回報的 Configuration.screenLayout 大小為 small,則必須至少為 426 dp x 320 dp。
    • 回報 Configuration.screenLayout normal 大小的裝置,必須至少有 480 dp x 320 dp。
    • 回報 Configuration.screenLayoutlarge 大小的裝置,必須至少為 640 dp x 480 dp。
    • 回報 Configuration.screenLayout xlarge 大小的裝置必須至少為 960 dp x 720 dp。
  • [C-0-2] 必須正確遵守應用程式透過 AndroidManifest.xml 中的 <supports-screens> 屬性聲明的螢幕尺寸支援,如 Android SDK 文件所述。

  • 可能具有圓角設計的 Android 相容螢幕。

如果裝置實作項目支援 UI_MODE_TYPE_NORMAL,且包含具有圓角的 Android 相容螢幕,則:

  • [C-1-1] 必須確保符合下列至少一項規定:
  • 圓角的半徑小於或等於 38 dp。
  • 當 15 dp x 15 dp 的方塊錨定在邏輯螢幕的每個角落時,每個方塊至少有一個像素會顯示在畫面上。

  • 應包含使用者可切換至矩形圓角顯示模式的介面。

如果裝置實作項目包含可折疊的 Android 相容螢幕,或包含多個顯示面板之間的折疊式轉軸,並可供顯示第三方應用程式,則:

如果裝置實作項目包含可折疊的 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):

  • [C-0-2] Configuration.uiMode 設為 UI_MODE_TYPE_NORMAL 的裝置實作項目必須有大於或等於 1.3333 (4:3) 的顯示比例值,除非應用程式符合下列其中一項條件,可拉伸得更寬:

  • [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 倍
  • 預設值:1 倍 (原生顯示比例)
  • Large:1.15 倍
  • 較大:1.3 倍
  • 最大 1.45 倍

7.1.2. 顯示指標

如果裝置實作項目包含與 Android 相容的螢幕,或與 Android 相容的螢幕視訊輸出,則:

如果裝置實作項目未內建螢幕或視訊輸出功能,則:

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.orientationandroid.view.Display.getOrientation() 或其他 API 查詢時,必須回報裝置目前方向的正確值。

如果裝置實作項目同時支援這兩種螢幕方向,則:

  • [C-1-1] MUST support dynamic orientation by applications to either portrait or landscape screen orientation. 也就是說,裝置必須尊重應用程式對特定螢幕方向的要求。
  • [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] MUST include the support for all the corresponding managed APIs and native APIs for every OpenGL ES versions they identified to support.

如果裝置實作項目包含螢幕或視訊輸出,則:

  • [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 擴充功能時,必須透過 OpenGL ES 管理 API 和原生 API 回報,反之,不得回報不支援的擴充功能字串。
  • [C-2-2] 必須支援 EGL_KHR_imageEGL_KHR_image_baseEGL_ANDROID_image_native_bufferEGL_ANDROID_get_native_client_bufferEGL_KHR_wait_syncEGL_KHR_get_all_proc_addressesEGL_ANDROID_presentation_timeEGL_KHR_swap_buffers_with_damageEGL_ANDROID_recordableEGL_ANDROID_GLES_layers 擴充功能。
  • [C-SR] 強烈建議支援 EGL_KHR_partial_updateOES_EGL_image_external 擴充功能。
  • 應透過 getString() 方法準確回報支援的任何紋理壓縮格式,這通常是供應商專屬格式。

如果裝置實作項目聲明支援 OpenGL ES 3.0、3.1 或 3.2,則:

  • [C-3-1] 除了 libGLESv2.so 程式庫中的 OpenGL ES 2.0 函式符號外,還必須匯出這些版本的對應函式符號。
  • [SR] STRONGLY RECOMMENDED to support the OES_EGL_image_external_essl3 extension.

如果裝置實作項目支援 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,這是一種低負擔的跨平台 API,可提供高效能的 3D 圖像。

如果裝置實作項目支援 OpenGL ES 3.1,則:

  • [SR] 強烈建議納入 Vulkan 1.1 支援。

如果裝置實作項目包含螢幕或視訊輸出,則:

  • 應支援 Vulkan 1.1。

Vulkan dEQP 測試會劃分成多個測試清單,每個清單都有相關聯的日期/版本。這些檔案位於 Android 原始碼樹狀結構的 external/deqp/android/cts/main/vk-master-YYYY-MM-DD.txt 中。如果裝置支援 Vulkan 自我回報等級,表示裝置能通過此等級和先前等級所有測試清單中的 dEQP 測試。

如果裝置實作項目支援 Vulkan 1.0 以上版本,則:

  • [C-1-1] 必須使用 android.hardware.vulkan.levelandroid.hardware.vulkan.version 功能旗標回報正確的整數值。
  • [C-1-2] 必須列舉至少一個 Vulkan 原生 API vkEnumeratePhysicalDevices()VkPhysicalDevice
  • [C-1-3] MUST fully implement the Vulkan 1.0 APIs for each enumerated VkPhysicalDevice.
  • [C-1-4] 必須透過 Vulkan 原生 API vkEnumerateInstanceLayerProperties()vkEnumerateDeviceLayerProperties(),列舉應用程式套件原生程式庫目錄中名為 libVkLayer*.so 的原生程式庫所含的層。
  • [C-1-5] 除非應用程式的 android:debuggable 屬性設為 true,否則不得列舉應用程式套件以外程式庫提供的層,也不得提供其他追蹤或攔截 Vulkan API 的方式。
  • [C-1-6] MUST report all extension strings that they do support via the Vulkan native APIs , and conversely MUST NOT report extension strings that they do not correctly support.
  • [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.levelandroid.hardware.vulkan.version)。
  • [C-2-2] 不得列舉任何 Vulkan 原生 API vkEnumeratePhysicalDevices()VkPhysicalDevice

如果裝置實作項目支援 Vulkan 1.1,並宣告任何 Vulkan 功能旗標,則:

  • [C-3-1] MUST expose support for the SYNC_FD external semaphore and handle types and the VK_ANDROID_external_memory_android_hardware_buffer extension.
7.1.4.3 RenderScript
  • [C-0-1] 裝置實作項目「必須」支援 Android RenderScript,詳情請參閱 Android SDK 說明文件。
7.1.4.4 2D 圖形加速

Android 提供應用程式機制,可透過資訊清單標記 android:hardwareAccelerated 或直接呼叫 API,在應用程式、活動、視窗或檢視區塊層級,宣告要啟用 2D 圖像的硬體加速功能。

裝置實作方式:

  • [C-0-1] 預設必須啟用硬體加速,且如果開發人員要求停用硬體加速 (方法是設定 android:hardwareAccelerated="false” 或直接透過 Android View API 停用硬體加速),則必須停用。
  • [C-0-2] MUST exhibit behavior consistent with the Android SDK documentation on hardware acceleration.

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 空間中,面積必須至少為 DCI-P3 的 90%。
  • [C-1-4] 必須支援 OpenGL ES 3.1 或 3.2,並正確回報。
  • [C-1-5] 必須宣傳支援 EGL_KHR_no_config_contextEGL_EXT_pixel_format_floatEGL_KHR_gl_colorspaceEGL_EXT_gl_colorspace_scrgbEGL_EXT_gl_colorspace_scrgb_linearEGL_EXT_gl_colorspace_display_p3EGL_EXT_gl_colorspace_display_p3_linearEGL_EXT_gl_colorspace_display_p3_passthrough 擴充功能。
  • [C-SR] Are STRONGLY RECOMMENDED to support 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] 必須具有介於 0.9 和 1.15 之間的像素顯示比例 (PAR)。也就是說,像素顯示比例必須接近正方形 (1.0),容許 10% 到 15% 的誤差。

7.1.7. 第二螢幕

Android 支援與 Android 相容的第二螢幕,可啟用媒體分享功能,並提供開發人員 API 來存取外部螢幕。

如果裝置實作支援外接螢幕 (透過有線、無線或內建額外螢幕連線),則:

  • [C-1-1] 必須按照 Android SDK 說明文件所述,實作 DisplayManager 系統服務和 API。

7.2. 輸入裝置

裝置實作方式:

7.2.1. 鍵盤

如果裝置實作項目支援第三方輸入法編輯器 (IME) 應用程式,則:

裝置實作:* [C-0-1] 不得包含與 android.content.res.Configuration.keyboard (QWERTY 或 12 鍵) 中指定格式不符的實體鍵盤。* 應包含額外的軟鍵盤實作項目。* 可能包含實體鍵盤。

7.2.2. 非觸控導覽

Android 支援方向鍵、滾球和滾輪,做為非觸控導覽機制。

裝置實作方式:

如果裝置實作項目缺少非觸控導覽功能,則:

  • [C-1-1] 必須提供合理的替代使用者介面機制,以選取及編輯文字,且須與輸入管理引擎相容。上游 Android 開放原始碼實作項目包含適用於缺少非觸控導覽輸入內容的裝置的選取機制。

7.2.3. 瀏覽鍵

主畫面最近使用的應用程式返回功能通常是透過與專用實體按鈕或觸控螢幕特定部分的互動提供,對於 Android 導覽模式至關重要,因此裝置實作項目:

  • [C-0-1] 針對電視裝置實作項目,必須提供使用者介面,啟動含有 <intent-filter> 活動的已安裝應用程式,並將 ACTION=MAINCATEGORY=LAUNCHERCATEGORY=LEANBACK_LAUNCHER 設為 <intent-filter>。「首頁」功能應做為這項使用者輔助功能的機制。
  • 應提供「最近」和「返回」功能按鈕。

如果提供「主畫面」、「最近使用」或「返回」功能,這些功能:

  • [C-1-1] 只要可存取其中任一項目,就必須透過單一動作 (例如輕觸、按兩下或手勢) 存取。
  • [C-1-2] 必須清楚指出哪個單一動作會觸發各項功能。例如在按鈕上印製可見的圖示、在螢幕的導覽列部分顯示軟體圖示,或在開箱設定體驗期間,引導使用者逐步完成示範流程。

裝置實作方式:

  • [SR] are STRONGLY RECOMMENDED to not provide the input mechanism for the Menu function as it is deprecated in favor of action bar since Android 4.0.

如果裝置實作提供「選單」功能,則:

  • [C-2-1] 只要動作溢位選單彈出式視窗不為空白,且動作列可見,就必須顯示動作溢位按鈕。
  • [C-2-2] 不得修改透過選取動作列中的溢位按鈕顯示的動作溢位彈出式視窗位置,但可修改透過選取「選單」功能顯示的動作溢位彈出式視窗位置。

如果裝置實作項目未提供「選單」功能,為確保回溯相容性,請採取下列做法:

  • [C-3-1] 當 targetSdkVersion 小於 10 時,應用程式「必須」提供「選單」功能,可透過實體按鈕、軟體鍵或手勢操作。除非與其他導覽功能一併隱藏,否則應可存取「選單」功能。

如果裝置實作項目提供輔助功能,則:

  • [C-4-1] 必須在其他導覽鍵可存取時,透過單一動作 (例如輕觸、按兩下或手勢) 存取「Google 助理」功能。
  • [SR] STRONGLY RECOMMENDED to use long press on HOME function as this designated interaction.

如果裝置實作項目使用螢幕的特定部分顯示導覽鍵,則:

  • [C-5-1] 導覽鍵必須使用螢幕上應用程式無法存取的獨立部分,且不得遮蔽或干擾應用程式可用的螢幕部分。
  • [C-5-2] 必須提供部分螢幕畫面給應用程式,且須符合第 7.1.1 節定義的規定。
  • [C-5-3] 必須遵守應用程式透過 View.setSystemUiVisibility() API 方法設定的標記,以便正確隱藏螢幕的這部分 (即導覽列),如 SDK 說明文件所述。

如果導覽功能是以螢幕上的手勢動作提供:

如果螢幕目前方向的左右兩側邊緣提供導覽功能:

  • [C-7-1] 導覽功能必須是「返回」,且必須提供從螢幕目前方向的左右兩側滑動的手勢。
  • [C-7-2] 如果在左側或右側邊緣提供可自訂的滑動式系統面板,這些面板必須放置在螢幕頂端 1/3 處,並提供清楚的視覺指標,持續顯示拖曳會叫用上述面板,而非返回。使用者「可以」設定系統面板,使其位於螢幕邊緣頂端 1/3 處下方,但系統面板「不得」使用超過邊緣 1/3 的長度。
  • [C-7-3] 如果前景應用程式已設定 View.SYSTEM_UI_FLAG_IMMERSIVEView.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 標記,從邊緣滑動時的行為必須與 AOSP 實作方式相同,詳情請參閱 SDK
  • [C-7-4] 如果前景應用程式已設定 View.SYSTEM_UI_FLAG_IMMERSIVEView.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 標記,自訂可滑動系統面板必須隱藏,直到使用者帶入 AOSP 實作的系統資訊列 (又稱導覽列和狀態列)。

7.2.4. 觸控螢幕輸入

Android 支援多種指標輸入系統,例如觸控螢幕、觸控板和模擬觸控輸入裝置。觸控螢幕裝置實作會與螢幕相關聯,讓使用者感覺自己是直接操作螢幕上的項目。由於使用者是直接觸控螢幕,系統不需要任何額外的可供性來指出正在操控的物件。

裝置實作方式:

  • 應具備某種指標輸入系統 (類似滑鼠或觸控)。
  • SHOULD support fully independently tracked pointers.

如果裝置實作項目在主要 Android 相容螢幕上包含觸控螢幕 (單點觸控或更佳),則:

  • [C-1-1] 必須回報 TOUCHSCREEN_FINGER Configuration.touchscreen API 欄位。
  • [C-1-2] 必須回報 android.hardware.touchscreenandroid.hardware.faketouch 功能旗標。

如果裝置實作項目包含觸控螢幕,且該螢幕可在主要 Android 相容螢幕上追蹤多點觸控,則:

  • [C-2-1] 必須回報與裝置上特定觸控螢幕類型相應的適當功能旗標 android.hardware.touchscreen.multitouchandroid.hardware.touchscreen.multitouch.distinctandroid.hardware.touchscreen.multitouch.jazzhand

如果裝置實作項目依賴外部輸入裝置 (例如滑鼠或軌跡球) 在主要 Android 相容螢幕上輸入內容,且符合第 7.2.5 節中的虛擬觸控規定,則:

  • [C-3-1] MUST NOT report any feature flag starting with android.hardware.touchscreen.
  • [C-3-2] MUST report only android.hardware.faketouch.
  • [C-3-3] MUST report TOUCHSCREEN_NOTOUCH for the Configuration.touchscreen API field.

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)
Y1 0x09 0x0005 KEYCODE_BUTTON_Y (100)
D-pad up1
D-pad down1
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 度,且按下向上和向左鍵。

4 MotionEvent

類比控制項1 HID 用法 Android 按鈕
左觸發鍵 0x02 0x00C5 AXIS_LTRIGGER
右側觸發鍵 0x02 0x00C4 AXIS_RTRIGGER
左搖桿 0x01 0x0030
0x01 0x0031
AXIS_X
AXIS_Y
右搖桿 0x01 0x0032
0x01 0x0035
AXIS_Z
AXIS_RZ

1 MotionEvent

7.2.7. 遙控器

如要瞭解裝置專屬需求,請參閱第 2.3.1 節

7.3. 感應器

如果裝置實作包含特定感應器類型,且該類型有對應的第三方開發人員 API,裝置實作「必須」實作該 API,如 Android SDK 說明文件和 Android 開放原始碼說明文件 (感應器) 所述。

裝置實作方式:

  • [C-0-1] 必須根據 android.content.pm.PackageManager 類別,準確回報感應器的存在與否。
  • [C-0-2] MUST return an accurate list of supported sensors via the SensorManager.getSensorList() and similar methods.
  • [C-0-3] 對於所有其他感應器 API,都必須採取合理的行為 (例如,應用程式嘗試註冊事件監聽器時,視情況傳回 truefalse;對應感應器不存在時,不呼叫感應器事件監聽器等)。

如果裝置實作項目包含特定感應器類型,且第三方開發人員可使用對應的 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] MUST ensure that the sensor event stream MUST NOT prevent the device CPU from entering a suspend state or waking up from a suspend state.
  • [C-1-6] 必須以奈秒為單位回報事件時間,如 Android SDK 說明文件所述,代表事件發生並與 SystemClock.elapsedRealtimeNano() 時鐘同步的時間。
  • [C-SR] 強烈建議時間戳記同步錯誤低於 100 毫秒,且應低於 1 毫秒。
  • 啟用多個感應器時,耗電量「不得」超過個別感應器回報耗電量的總和。

上述清單並非詳盡無遺,Android SDK 和 Android 開放原始碼文件感應器的記錄行為才是權威來源。

如果裝置實作項目包含特定感應器類型,且第三方開發人員可使用對應的 API,則:

  • [C-1-6] 必須為所有感應器設定非零解析度,並透過 Sensor.getResolution() API 方法回報值。

部分感應器類型是複合類型,也就是說,這類感應器可從一或多個其他感應器提供的資料衍生而來。(例如方向感應器和線性加速度感應器)。

裝置實作方式:

  • 如果包含感應器類型所述的必要實體感應器,就「應該」實作這些感應器類型。

如果裝置實作項目包含複合感應器,則:

  • [C-2-1] MUST implement the sensor as described in the Android Open Source documentation on composite sensors.

如果裝置實作項目包含特定感應器類型,且該感應器類型有對應的第三方開發人員 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] MUST comply with the Android sensor coordinate system as detailed in the Android APIs.
  • [C-1-4] 必須能夠測量任何軸上高達四倍重力(4g) 或以上的自由落體。
  • [C-1-5] 解析度必須至少為 12 位元。
  • [C-1-6] 標準差不得大於 0.05 m/s^,且應以最快的取樣率,根據至少 3 秒內收集的樣本,按軸計算標準差。
  • [SR] 強烈建議導入 TYPE_SIGNIFICANT_MOTION 複合感應器。
  • [SR] are STRONGLY RECOMMENDED to implement and report TYPE_ACCELEROMETER_UNCALIBRATED sensor. 強烈建議 Android 裝置符合這項規定,以便升級至日後的平台版本,屆時可能必須符合這項規定。
  • 應實作 Android SDK 文件所述的 TYPE_SIGNIFICANT_MOTIONTYPE_TILT_DETECTORTYPE_STEP_DETECTORTYPE_STEP_COUNTER 複合感應器。
  • SHOULD report events up to at least 200 Hz.
  • 解析度應至少為 16 位元。
  • 如果特性在生命週期內發生變化,則應在使用時校準並補償,且在裝置重新啟動時保留補償參數。
  • SHOULD be temperature compensated.

如果裝置實作項目包含 3 軸式加速度計,且實作了 TYPE_SIGNIFICANT_MOTIONTYPE_TILT_DETECTORTYPE_STEP_DETECTORTYPE_STEP_COUNTER 複合感應器中的任一項:

  • [C-2-1] 這些裝置的耗電量總和必須一律低於 4 mW。
  • 在動態或靜態條件下,各項值應低於 2 mW 和 0.5 mW。

如果裝置實作項目包含 3 軸加速計和 3 軸陀螺儀感應器,則:

  • [C-3-1] 必須實作 TYPE_GRAVITYTYPE_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] MUST comply with the Android sensor coordinate system as detailed in the Android APIs.
  • [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 軸磁力計和加速度計,則:

  • MAY implement the TYPE_GEOMAGNETIC_ROTATION_VECTOR sensor.

如果裝置實作項目包含 3 軸磁力計、加速度計和 TYPE_GEOMAGNETIC_ROTATION_VECTOR 感應器,則:

  • [C-3-1] MUST consume less than 10 mW.
  • 感應器以 10 Hz 註冊批次模式時,耗電量「應」低於 3 mW。

7.3.3. GPS

裝置實作方式:

  • [C-SR] 強烈建議包含 GPS/GNSS 接收器。

如果裝置實作項目包含 GPS/GNSS 接收器,並透過 android.hardware.location.gps 功能旗標向應用程式回報功能,則:

  • [C-1-1] 透過 LocationManager#requestLocationUpdate 要求時,必須支援至少 1 Hz 的位置輸出速率。
  • [C-1-2] 連線至 0.5 Mbps 以上的網際網路時,在空曠環境 (訊號強、多路徑可忽略、HDOP < 2) 下,裝置必須能在 10 秒內判斷位置 (快速首次定位時間)。通常會使用某種形式的輔助或預測 GPS/GNSS 技術,盡量縮短 GPS/GNSS 定位時間 (輔助資料包括參考時間、參考位置和衛星星曆/時鐘),以符合這項規定。
    • [C-1-6] 進行這類位置計算後,裝置實作必須在 5 秒內判斷出空曠處的位置,即使後續要求是在沒有資料連線的情況下提出,和/或是在電源循環後提出,也必須在初始位置計算後一小時內完成。
  • 在空曠處判斷位置後,靜止不動或以小於 1 公尺/秒平方的加速度移動時:

    • [C-1-3] 至少 95% 的時間內,必須能夠判斷 20 公尺內的定位,以及 0.5 公尺/秒內的速度。
    • [C-1-4] 必須透過 GnssStatus.Callback 同時追蹤及回報至少 8 顆來自一個星群的衛星。
    • 應能同時追蹤至少 24 顆衛星,來自多個星系 (例如 GPS + 至少一個全球導航衛星系統、北斗、Galileo)。
    • [C-SR] 強烈建議在緊急電話通話期間,繼續透過 GNSS Location Provider API 傳送正常的 GPS/GNSS 位置輸出內容。
    • [C-SR] 強烈建議回報所有追蹤的 GNSS 星座圖 (如 GnssStatus 訊息所回報) 的 GNSS 測量結果,但 SBAS 除外。
    • [C-SR] 強烈建議回報 AGC 和 GNSS 測量頻率。
    • [C-SR] 強烈建議回報所有準確度估計值 (包括方位、速度和垂直) 做為每個 GPS/GNSS 位置的一部分。
    • [C-SR] 強烈建議您在發現 GNSS 測量資料時立即回報,即使尚未回報從 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] MUST be temperature compensated.
  • [C-1-6] 必須在使用時校正和補償,並在裝置重新啟動時保留補償參數。
  • [C-1-7] MUST have a variance no greater than 1e-7 rad^2 / s^2 per Hz (variance per Hz, or rad^2 / s). 變異數可隨取樣率而異,但必須受此值限制。換句話說,如果以 1 Hz 的取樣率測量陀螺儀的變異數,變異數「應該」不大於 1e-7 rad^2/s^2。
  • [SR] 裝置在室溫下靜止不動時,強烈建議校準誤差小於 0.01 rad/s。
  • SHOULD report events up to at least 200 Hz.

如果裝置實作項目包含 3 軸陀螺儀、加速計感應器和磁力計感應器,則:

  • [C-2-1] 必須實作 TYPE_ROTATION_VECTOR 複合感應器。

如果裝置實作項目包含 3 軸加速計和 3 軸陀螺儀感應器,則:

  • [C-3-1] 必須實作 TYPE_GRAVITYTYPE_LINEAR_ACCELERATION 複合感應器。
  • [C-SR] 強烈建議實作 TYPE_GAME_ROTATION_VECTOR 複合感應器。

7.3.5. 氣壓計

裝置實作方式:

  • [C-SR] 強烈建議加入氣壓計 (環境氣壓感應器)。

如果裝置實作項目包含氣壓計,則:

  • [C-1-1] MUST implement and report TYPE_PRESSURE sensor.
  • [C-1-2] 必須能夠以 5 Hz 以上的頻率傳送事件。
  • [C-1-3] MUST be temperature compensated.
  • [SR] STRONGLY RECOMMENDED to be able to report pressure measurements in the range 300hPa to 1100hPa.
  • 應具有 1 hPa 的絕對準確度。
  • 在 20 hPa 範圍內,相對準確度應為 0.12 hPa (相當於海平面上 ~200 公尺變化範圍內的 ~1 公尺準確度)。

7.3.6. 溫度計

如果裝置實作項目包含環境溫度計 (溫度感應器),則:

  • [C-1-1]「必須」定義SENSOR_TYPE_AMBIENT_TEMPERATURE周邊溫度感應器,且感應器「必須」測量使用者與裝置互動位置的周邊 (室內/車輛駕駛室) 溫度 (以攝氏度為單位)。

如果裝置實作項目包含溫度計感應器,可測量環境溫度以外的溫度 (例如 CPU 溫度),則:

7.3.7. 光度計

  • 裝置實作「可能」包含光度計 (環境光度感應器)。

7.3.8. 鄰近感應器

  • 裝置實作「可能」包含鄰近感應器。

如果裝置實作項目包含鄰近感應器,則:

  • [C-1-1] MUST measure the proximity of an object in the same direction as the screen. 也就是說,近接感應器「必須」朝向螢幕,偵測靠近螢幕的物體,因為這類感應器的主要用途是偵測使用者是否正在使用手機。如果裝置實作項目包含任何其他方向的近接感應器,則「不得」透過這個 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 mW。
    • [C-SR] 強烈建議 3dB 測量頻寬至少為奈奎斯特頻率的 80%,且此頻寬內的白噪音頻譜。
    • SHOULD have an acceleration random walk less than 30 μg √Hz tested at room temperature.
    • 偏差變化與溫度的關係應為 ≤ +/- 1 mg/°C。
    • 最佳擬合線非線性應 ≤ 0.5%,感應度變化與溫度變化比應 ≤ 0.03%/C°。
    • 在裝置作業溫度範圍內,應具備 < 2.5 % 的跨軸向靈敏度,以及 < 0.2% 的跨軸向靈敏度變化。
  • [C-2-2] 必須具有與 TYPE_ACCELEROMETER 相同的品質規定。TYPE_ACCELEROMETER_UNCALIBRATED

  • [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 測量頻寬至少為奈奎斯特頻率的 80%,且此頻寬內的白噪音頻譜。
    • 在室溫下測試時,速率隨機漫步應小於 0.001 °/s √Hz。
    • SHOULD have a bias change vs. temperature of ≤ +/- 0.05 °/ s / °C.
    • 相較於溫度,靈敏度變化應 ≤ 0.02% / °C。
    • 最佳適配線非線性度應 ≤ 0.2%。
    • SHOULD have a noise density of ≤ 0.007 °/s/√Hz.
    • 裝置靜止不動時,在 10 ~ 40 ℃ 的溫度範圍內,校準誤差應小於 0.002 rad/s。
    • 應具備小於 0.1°/s/g 的 g 靈敏度。
    • 在裝置運作溫度範圍內,應具備 < 4.0 % 的跨軸向靈敏度,以及 < 0.3% 的跨軸向靈敏度變化。
  • [C-2-4] 必須具有與 TYPE_GYROSCOPE 相同品質規定的 TYPE_GYROSCOPE_UNCALIBRATED

  • [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 mW。
  • [C-2-8] 必須具備 TYPE_GAME_ROTATION_VECTOR 感應器。
  • [C-2-9] 必須具備 TYPE_SIGNIFICANT_MOTION 感應器,且:
    • 裝置靜止時的耗電量不得超過 0.5 mW,移動時不得超過 1.5 mW。
  • [C-2-10] 必須具備 TYPE_STEP_DETECTOR 感應器,且:
    • 必須實作這類感應器的非喚醒形式,且緩衝功能至少要能處理 100 個感應器事件。
    • 裝置靜止時的耗電量不得超過 0.5 mW,移動時不得超過 1.5 mW。
    • 批次處理耗電量不得超過 4 mW。
  • [C-2-11] 必須具備 TYPE_STEP_COUNTER 感應器,且:
    • 裝置靜止時的耗電量不得超過 0.5 mW,移動時不得超過 1.5 mW。
  • [C-2-12] 必須具備 TILT_DETECTOR 感應器,且:
    • 裝置靜止時的耗電量不得超過 0.5 mW,移動時不得超過 1.5 mW。
  • [C-2-13] 加速度計、陀螺儀和磁力計回報的同一實體事件,其事件時間戳記彼此間的差異不得超過 2.5 毫秒。加速度計和陀螺儀回報的同一實體事件,其事件時間戳記的差異應在 0.25 毫秒內。
  • [C-2-14] 陀螺儀感應器事件時間戳記必須與攝影機子系統的時間基準相同,且誤差在 1 毫秒內。
  • [C-2-15] MUST deliver samples to applications within 5 milliseconds from the time when the data is available on any of the above physical sensors to the application.
  • [C-2-16] 啟用下列任一感應器組合時,裝置靜止時的耗電量不得超過 0.5 mW,移動時不得超過 2.0 mW:
    • SENSOR_TYPE_SIGNIFICANT_MOTION
    • SENSOR_TYPE_STEP_DETECTOR
    • SENSOR_TYPE_STEP_COUNTER
    • SENSOR_TILT_DETECTORS
  • [C-2-17] MAY have a TYPE_PROXIMITY sensor, but if present MUST have a minimum buffer capability of 100 sensor events.

請注意,本節中的所有耗電量規定都不包含應用程式處理器的耗電量。包括整個感應器鏈結的耗電量,例如感應器、任何支援電路、任何專用感應器處理系統等。

如果裝置實作項目包含直接感應器支援,則:

  • [C-3-1] 必須透過 isDirectChannelTypeSupportedgetHighestDirectReportRateLevel API 正確聲明支援的直接管道類型和直接回報率層級。
  • [C-3-2] 對於聲明支援感應器直接管道的所有感應器,都必須支援至少一種感應器直接管道類型。
  • SHOULD support event reporting through sensor direct channel for primary sensor (non-wakeup variant) of the following types:
    • 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.BiometricManagerandroid.hardware.biometrics.BiometricPromptandroid.provider.Settings.ACTION_BIOMETRIC_ENROLL,向第三方應用程式提供生物特徵辨識感應器,則:

  • [C-4-1] 必須符合本文定義的第 3 級第 2 級生物特徵辨識需求。
  • [C-4-2] 必須辨識並遵守在 Authenticators 類別中定義為常數的每個參數名稱,以及這些名稱的任何組合。反之,如果傳遞至 canAuthenticate(int)setAllowedAuthenticators(int) 方法的整數常數並非 Authenticators 中記錄的公開常數,或這些常數的任何組合,則不得接受或辨識。
  • [C-4-3] 裝置必須實作 ACTION_BIOMETRIC_ENROLL 動作,且具備第 3 級第 2 級生物特徵辨識功能。這項動作只能顯示第 3 級第 2 級生物辨識的註冊進入點。

如果裝置實作支援被動式生物辨識技術,則:

  • [C-5-1] 預設必須要求額外的確認步驟 (例如按下按鈕)。
  • [C-SR] 強烈建議提供設定,允許使用者覆寫應用程式偏好設定,並一律要求進行確認步驟。
  • [C-SR] 強烈建議您確保確認動作安全無虞,作業系統或核心遭入侵時不會遭到偽造。舉例來說,這表示根據實體按鈕的確認動作會透過安全元件 (SE) 的僅輸入通用輸入/輸出 (GPIO) 接腳傳送,且只能透過按下實體按鈕驅動。
  • [C-5-2] 此外,還必須實作對應於 setConfirmationRequired (boolean) 的隱含驗證流程(不含確認步驟),應用程式可設定使用此流程進行登入。

如果裝置實作項目有多個生物特徵辨識感應器,則:

  • [C-SR] 強烈建議每次驗證時只要求確認一項生物特徵辨識資訊 (例如,如果裝置同時提供指紋和臉部感應器,則在確認其中一項資訊後,應傳送 onAuthenticationSucceeded)。

如要讓裝置實作允許第三方應用程式存取金鑰儲存區金鑰,必須符合下列條件:

  • [C-6-1] 必須符合本節下方定義的第 3 類要求。
  • [C-6-2] 驗證需要 BIOMETRIC_STRONG 時,或驗證是透過 CryptoObject 叫用時,只能提供第 3 級生物特徵辨識。

如果裝置實作項目希望將生物特徵辨識感應器視為第 1 級 (舊稱「便利」),則:

  • [C-1-1] 誤接受率必須低於 0.002%。
  • [C-1-2] 如果根據 Android 生物特徵辨識測試通訊協定測得的偽造和冒用接受率高於 7%,則必須揭露此模式的安全性可能不如高強度 PIN 碼、解鎖圖案或密碼,並清楚列舉啟用此模式的風險。
  • [C-1-3] 生物特徵辨識驗證嘗試失敗五次後,必須限制嘗試次數,至少 30 秒內不得再次嘗試。失敗的嘗試是指擷取品質良好 (BIOMETRIC_ACQUIRED_GOOD) 但與已註冊的生物特徵辨識資料不符的嘗試。
  • [C-1-4] MUST prevent adding new biometrics without first establishing a chain of trust by having the user confirm existing or add a new device credential (PIN/pattern/password) that's secured by TEE; the Android Open Source Project implementation provides the mechanism in the framework to do so.
  • [C-1-5] 使用者帳戶移除時 (包括透過恢復原廠設定),必須完全移除所有可識別的使用者生物特徵辨識資料。
  • [C-1-6] 必須遵守該生物特徵辨識的個別標記 (即 DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINTDevicePolicymanager.KEYGUARD_DISABLE_FACEDevicePolicymanager.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] Are STRONGLY RECOMMENDED to include liveness detection for all biometric modalities and attention detection for Face biometrics.

如果裝置實作項目希望將生物特徵辨識感應器視為第 3 級 (舊稱「」),則:

  • [C-3-1] 必須符合上述第 2 類的所有規定,但 [C-1-7] 和 [C-1-8] 除外。從舊版 Android 升級的裝置不適用於 C-2-7。
  • [C-3-2] 必須實作硬體支援的金鑰儲存區。
  • [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. 轉軸角度感應器

如果裝置實作項目支援轉軸角度感應器,則:

7.4. 資料連線

7.4.1. 電話通訊系統

Android API 和本文所用的「電話」一詞,專指透過 GSM 或 CDMA 網路撥打語音電話和傳送簡訊的相關硬體。雖然這些語音通話可能採用封包交換技術,也可能沒有,但就 Android 而言,這些通話與使用相同網路實作的任何資料連線無關。換句話說,Android「電話」功能和 API 專指語音通話和簡訊。舉例來說,無論裝置是否使用行動網路連線傳輸資料,只要無法撥打電話或傳送/接收簡訊,就不屬於電話裝置。

  • Android 可用於不含電話硬體的裝置。也就是說,Android 可與非手機的裝置相容。

如果裝置實作項目包含 GSM 或 CDMA 電話通訊,則:

  • [C-1-1] 必須根據技術宣告 android.hardware.telephony 功能旗標和其他子功能旗標。
  • [C-1-2] 必須完整支援該技術的 API。

如果裝置實作項目不含電話硬體,則:

  • [C-2-1] 必須將完整 API 實作為無作業。

如果裝置實作支援 eUICC 或 eSIM/嵌入式 SIM 卡,並包含專屬機制,可供第三方開發人員使用 eSIM 功能,則:

7.4.1.1. 封鎖號碼功能適用裝置

如果裝置實作項目回報 android.hardware.telephony feature,則:

  • [C-1-1] 必須支援封鎖號碼
  • [C-1-2] 必須按照 SDK 說明文件所述,完整實作 BlockedNumberContract 和對應的 API。
  • [C-1-3] MUST block all calls and messages from a phone number in 'BlockedNumberProvider' without any interaction with apps. 唯一的例外狀況是暫時解除號碼封鎖,詳情請參閱 SDK 說明文件。
  • [C-1-4] 針對遭封鎖的通話,不得寫入平台通話記錄供應商
  • [C-1-5] MUST NOT write to the Telephony provider for a blocked message.
  • [C-1-6] 必須實作封鎖號碼管理 UI,並使用 TelecomManager.createManageBlockedNumbersIntent() 方法傳回的意圖開啟該 UI。
  • [C-1-7] Android 平台會假設主要使用者完全控管裝置上的單一電話服務執行個體,因此不得允許次要使用者查看或編輯裝置上封鎖的號碼。次要使用者必須隱藏所有封鎖相關的 UI,且系統仍須遵守封鎖清單。
  • 裝置更新至 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] STRONGLY RECOMMENDED to preload the default dialer app that shows a call log entry and the name of a third-party app in its call log when the third-party app sets the EXTRA_LOG_SELF_MANAGED_CALLS extras key on its PhoneAccount to true.

  • [C-SR] 強烈建議處理音訊耳機的 KEYCODE_MEDIA_PLAY_PAUSEKEYCODE_HEADSETHOOK 事件,以用於 android.telecom API,如下所示:

7.4.2. IEEE 802.11 (Wi-Fi)

裝置實作方式:

  • SHOULD include support for one or more forms of 802.11.

如果裝置實作項目包含 802.11 支援,並將功能公開給第三方應用程式,則:

  • [C-1-1]「必須」實作對應的 Android API。
  • [C-1-2] MUST report the hardware feature flag android.hardware.wifi.
  • [C-1-3] 必須按照 SDK 說明文件所述,實作多播 API
  • [C-1-4] 必須支援多點傳送 DNS (mDNS),且不得在任何作業時間 (包括:
    • 即使螢幕未處於啟用狀態。
    • 如果是 Android 電視裝置實作,即使處於待機電源狀態也一樣。
  • [C-1-5] 不得將 WifiManager.enableNetwork() API 方法呼叫視為充分的指標,藉此切換目前用於應用程式流量的預設 Network,以及 ConnectivityManager API 方法 (例如 getActiveNetworkregisterDefaultNetworkCallback) 傳回的 Network。換句話說,只有在成功驗證 Wi-Fi 網路提供網際網路存取權時,他們「可能」才會停用任何其他網路供應商 (例如行動數據) 提供的網際網路存取權。
  • [C-1-6] 強烈建議在呼叫 ConnectivityManager.reportNetworkConnectivity() API 方法時,重新評估 Network 的網際網路存取權,一旦評估結果顯示目前的 Network 不再提供網際網路存取權,就切換至任何其他可用的網路 (例如行動數據),以提供網際網路存取權。
  • [C-SR] 強烈建議在 STA 斷線時,於每次掃描開始時隨機產生探測要求影格的來源 MAC 位址和序號。
    • 組成一次掃描的每個探查要求框架群組,都應使用一致的 MAC 位址 (掃描期間不應隨機產生 MAC 位址)。
    • 掃描中的探查要求序號應在探查要求之間正常 (依序) 疊代。
    • 探測要求序號應在掃描的最後一個探測要求與下一次掃描的第一個探測要求之間隨機產生。
  • [C-SR] 強烈建議在 STA 斷線時,僅允許探查要求框架中的下列元素:
    • SSID 參數集 (0)
    • DS 參數集 (3)

如果裝置實作項目包含支援 IEEE 802.11 標準定義的 Wi-Fi 省電模式,則:

  • [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 掃描位置資訊,則:

7.4.2.1. Wi-Fi Direct

裝置實作方式:

  • 應支援 Wi-Fi Direct (Wi-Fi 點對點)。

如果裝置實作項目包含 Wi-Fi Direct 支援,則:

  • [C-1-1] 必須按照 SDK 說明文件所述,實作對應的 Android API
  • [C-1-2] MUST report the hardware feature android.hardware.wifi.direct.
  • [C-1-3] 必須支援一般 Wi-Fi 作業。
  • [C-1-4] 必須同時支援 Wi-Fi 和 Wi-Fi Direct 作業。

裝置實作方式:

如果裝置實作項目包含 TDLS 支援,且 TDLS 是由 WiFiManager API 啟用,則:

  • [C-1-1] 必須透過 WifiManager.isTdlsSupported 宣告支援 TDLS。
  • 只有在可能且有利時,才應使用 TDLS。
  • SHOULD 有一些啟發式方法,且在效能可能比透過 Wi-Fi 存取點更差時,不使用 TDLS。
7.4.2.3. Wi-Fi Aware

裝置實作方式:

如果裝置實作項目支援 Wi-Fi Aware,並向第三方應用程式公開這項功能,則:

  • [C-1-1] 必須按照 SDK 說明文件所述,實作 WifiAwareManager API。
  • [C-1-2] 必須宣告 android.hardware.wifi.aware 功能旗標。
  • [C-1-3] 必須同時支援 Wi-Fi 和 Wi-Fi Aware 作業。
  • [C-1-4] 除非正在進行 Aware 測距作業或 Aware 資料路徑處於啟用狀態 (資料路徑處於啟用狀態時不應隨機化),否則必須在不超過 30 分鐘的時間間隔內,以及每次啟用 Wi-Fi Aware 時,隨機化 Wi-Fi Aware 管理介面位址。

如果裝置實作項目包含對 Wi-Fi Aware 和 Wi-Fi 定位功能的支援 (如第 7.4.2.5 節所述),並將這些功能公開給第三方應用程式,則:

7.4.2.4. Wi-Fi Passpoint

如果裝置實作項目包含 802.11 (Wi-Fi) 支援,則:

如果裝置實作項目支援 Wi-Fi Passpoint,則:

  • [C-1-2] 必須按照 SDK 說明文件所述,實作 Passpoint 相關的 WifiManager API。
  • [C-1-3] 必須支援 IEEE 802.11u 標準,特別是與網路探索和選取相關的標準,例如通用廣告服務 (GAS) 和存取網路查詢通訊協定 (ANQP)。

反之,如果裝置實作項目不支援 Wi-Fi Passpoint:

  • [C-2-1] 實作 Passpoint 相關 WifiManager API 時,必須擲回 UnsupportedOperationException
7.4.2.5. Wi-Fi 定位 (Wi-Fi 封包往返時間 - RTT)

裝置實作方式:

如果裝置實作項目支援 Wi-Fi 定位,並向第三方應用程式公開這項功能,則:

  • [C-1-1] 必須按照 SDK 說明文件所述,實作 WifiRttManager API。
  • [C-1-2] 必須宣告 android.hardware.wifi.rtt 功能旗標。
  • [C-1-3] MUST randomize the source MAC address for each RTT burst which is executed while the Wi-Fi interface on which the RTT is being executed is not associated to an Access Point.
7.4.2.6. Wi-Fi 保持運作卸載

裝置實作方式:

  • SHOULD include support for Wi-Fi keepalive offload.

如果裝置實作項目包含 Wi-Fi 保持連線卸載支援,並向第三方應用程式公開這項功能,則:

  • [C-1-1] 必須支援 SocketKeepAlive API。

  • [C-1-2] 必須支援至少三個 Wi-Fi 並行連線保留位置,以及至少一個行動網路連線保留位置。

如果裝置實作項目不支援 Wi-Fi 保持連線卸載,則:

7.4.2.7. Wi-Fi 輕鬆連線 (裝置佈建通訊協定)

裝置實作方式:

如果裝置實作項目支援 Wi-Fi Easy Connect,並向第三方應用程式公開這項功能,則:

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.bluetoothandroid.hardware.bluetooth_le),並實作平台 API。
  • 應視裝置情況實作相關藍牙設定檔,例如 A2DP、AVRCP、OBEX、HFP 等。

如果裝置實作項目支援藍牙低功耗 (BLE),則:

  • [C-3-1] 必須宣告硬體功能 android.hardware.bluetooth_le
  • [C-3-2] 必須啟用以 GATT (通用屬性設定檔) 為基礎的藍牙 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 時,應支援將篩選邏輯卸載至藍牙晶片組。
  • 應支援將批次掃描作業卸載至藍牙晶片組。
  • SHOULD support multi advertisement with at least 4 slots.

如果裝置實作項目支援藍牙低功耗,並使用藍牙低功耗掃描位置資訊,則:

  • [C-4-1] 必須提供使用者介面,讓使用者啟用/停用透過 System API BluetoothAdapter.isBleScanAlwaysAvailable() 讀取的值。

如果裝置實作項目包含對藍牙 LE 和助聽器設定檔的支援,如「使用藍牙 LE 支援助聽器音訊」所述,則:

7.4.4. 近距離無線通訊

裝置實作方式:

  • 應包含近距離無線通訊 (NFC) 的收發器和相關硬體。
  • [C-0-1] 即使不支援 NFC 或宣告 android.hardware.nfc 功能,也必須實作 android.nfc.NdefMessageandroid.nfc.NdefRecord API,因為這些類別代表與通訊協定無關的資料表示格式。

如果裝置實作項目包含 NFC 硬體,且計畫向第三方應用程式開放使用,則:

  • [C-1-1] MUST report the android.hardware.nfc feature from the android.content.pm.PackageManager.hasSystemFeature() method.
  • 必須能夠透過下列 NFC 標準讀取及寫入 NDEF 訊息:
  • [C-1-2] 必須能夠透過下列 NFC 標準,做為 NFC 論壇讀取器/寫入器 (如 NFC 論壇技術規格 NFCForum-TS-DigitalProtocol-1.0 所定義):
    • NfcA (ISO14443-3A)
    • NfcB (ISO14443-3B)
    • NFC-F (JIS X 6319-4)
    • IsoDep (ISO 14443-4)
    • NFC 論壇標記類型 1、2、3、4、5 (由 NFC 論壇定義)
  • [SR] 強烈建議能夠透過下列 NFC 標準讀取及寫入 NDEF 訊息和原始資料。請注意,雖然 NFC 標準目前是「強烈建議」,但日後版本的相容性定義預計會將這些標準改為「必須」。這個版本可選擇是否採用這些標準,但日後推出的版本將強制採用。強烈建議現有和新裝置現在就符合這些需求,以便日後升級至平台新版本。

  • [C-1-13] MUST poll for all supported technologies while in NFC discovery mode.

  • 裝置處於喚醒狀態、螢幕開啟且螢幕鎖定解除時,應處於 NFC 探索模式。
  • 應能讀取 Thinfilm NFC 條碼產品的條碼和網址 (如已編碼)。

請注意,上述 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] MUST report the android.hardware.nfc.hcef feature constant.
  • [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] MUST report the feature com.nxp.mifare from the android.content.pm.PackageManager.hasSystemFeature() method. 請注意,這並非標準 Android 功能,因此不會以常數形式出現在 android.content.pm.PackageManager 類別中。

7.4.5. 網路通訊協定和 API

7.4.5.1. 最低網路功能

裝置實作方式:

  • [C-0-1] 必須支援一或多種形式的資料網路。具體來說,裝置實作內容必須支援至少一個資料標準,且傳輸速率可達 200 Kbit/sec 以上。符合這項規定的技術包括 EDGE、HSPA、EV-DO、802.11g、乙太網路和藍牙 PAN。
  • 如果實體網路標準 (例如乙太網路) 是主要資料連線,也「應」支援至少一個常見的無線資料標準,例如 802.11 (Wi-Fi)。
  • MAY 實作多種資料連線形式。
7.4.5.2. IPv6

裝置實作方式:

  • [C-0-2] 必須包含 IPv6 網路堆疊,並支援使用受管理 API (例如 java.net.Socketjava.net.URLConnection) 以及原生 API (例如 AF_INET6 插座) 的 IPv6 通訊。
  • [C-0-3] MUST enable IPv6 by default.
  • MUST 確保 IPv6 通訊的可靠性與 IPv4 相同,例如:
    • [C-0-4] 必須在微量模式下維持 IPv6 連線。
    • [C-0-5] 在使用 RA 生命週期至少 180 秒的任何 IPv6 相容網路上,速率限制不得導致裝置失去 IPv6 連線能力。
  • [C-0-6] 連線至 IPv6 網路時,裝置 MUST 為第三方應用程式提供直接 IPv6 網路連線,且裝置不得在本機進行任何形式的位址或連接埠轉譯。無論是受管理的 API (例如 Socket#getLocalAddressSocket#getLocalPort),還是 NDK API (例如 getsockname()IPV6_PKTINFO),都必須傳回實際用於在網路上傳送及接收封包的 IP 位址和通訊埠,且這些 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] 必須提供網頁認證入口應用程式,以便處理意圖 ACTION_CAPTIVE_PORTAL_SIGN_IN,並在呼叫系統 API ConnectivityManager#startCaptivePortalApp(Network, Bundle) 時傳送該意圖,顯示網頁認證入口登入頁面。
  • [C-1-2] 裝置連線至任何網路類型 (包括行動網路、Wi-Fi、乙太網路或藍牙) 時,必須偵測網頁認證入口,並支援透過網頁認證入口應用程式登入。
  • [C-1-3] 裝置設為使用嚴格模式的私人 DNS 時,必須支援使用純文字 DNS 登入強制回應入口網站。
  • [C-1-4] 必須根據 SDK 文件,針對並未明確與連線驗證入口網站通訊的所有網路流量,使用 android.net.LinkProperties.getPrivateDnsServerNameandroid.net.LinkProperties.isPrivateDnsActive 的加密 DNS。
  • [C-1-5] 必須確保使用者登入連線區網時,應用程式使用的預設網路 (由 ConnectivityManager.getActiveNetworkConnectivityManager.registerDefaultNetworkCallback 傳回,且預設由 Java 網路 API (例如 java.net.Socket) 和原生 API (例如 connect()) 使用) 是任何其他可提供網際網路存取的可用網路 (如有)。

7.4.6. 同步設定

裝置實作方式:

7.4.7. 數據節省模式

如果裝置實作項目包含付費連線,則為:

  • [SR] STRONGLY RECOMMENDED to provide the data saver mode.

如果裝置實作項目提供數據節省模式,則:

  • [C-1-1] 必須支援 ConnectivityManager 類別中的所有 API,如 SDK 說明文件所述

如果裝置實作項目未提供數據節省模式,則:

7.4.8. 安全元件

如果裝置實作項目支援 Open Mobile API 相容的安全元件,並提供給第三方應用程式,則:

7.5. 攝影機

如果裝置實作項目包含至少一個相機,則:

  • [C-1-1] 必須宣告 android.hardware.camera.any 功能旗標。
  • [C-1-2] 應用程式必須能夠同時分配 3 個 RGBA_8888 點陣圖,大小與裝置上最大解析度相機感應器產生的圖片相同,且相機已開啟,用於基本預覽和靜態影像擷取。
  • [C-1-3] 預先安裝的預設相機應用程式處理意圖 MediaStore.ACTION_IMAGE_CAPTUREMediaStore.ACTION_IMAGE_CAPTURE_SECUREMediaStore.ACTION_VIDEO_CAPTURE 時,如接收應用程式沒有 ACCESS_FINE_LOCATION,則必須負責在將圖片中繼資料傳送至接收應用程式前,移除使用者位置資訊。

7.5.1. 後置鏡頭

後置鏡頭位於裝置螢幕的背面,可拍攝裝置遠端的場景,就像傳統相機一樣。

裝置實作方式:

  • 應包含後置鏡頭。

如果裝置實作項目包含至少一個後置鏡頭,則:

  • [C-1-1] 必須回報功能旗標 android.hardware.cameraandroid.hardware.camera.any
  • [C-1-2] 解析度必須至少為 200 萬像素。
  • 相機驅動程式「應」實作硬體自動對焦或軟體自動對焦功能 (對應用程式軟體而言是透明的)。
  • 可能具有定焦或 EDOF (擴展景深) 硬體。
  • 可能包含閃光燈。

如果攝影機有閃光燈:

  • [C-2-1] 在 Camera 預覽畫面上註冊 android.hardware.Camera.PreviewCallback 例項時,閃光燈不得亮起,除非應用程式已透過啟用 Camera.Parameters 物件的 FLASH_MODE_AUTOFLASH_MODE_ON 屬性,明確啟用閃光燈。請注意,這項限制不適用於裝置內建的系統相機應用程式,只適用於使用 Camera.PreviewCallback 的第三方應用程式。

7.5.2. 前置鏡頭

前置鏡頭位於裝置螢幕的同一側,通常用於拍攝使用者,例如視訊會議和類似應用程式。

裝置實作方式:

  • 可包含前置鏡頭。

如果裝置實作項目包含至少一個前置鏡頭,則:

  • [C-1-1] 必須回報功能旗標 android.hardware.camera.anyandroid.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] MUST mirror the image displayed by the postview in the same manner as the camera preview image stream.
  • 可包括第 7.5.1 節所述後置鏡頭可用的功能 (例如自動對焦、閃光燈等)。

如果裝置實作項目可由使用者旋轉 (例如透過加速計自動旋轉,或透過使用者輸入內容手動旋轉):

  • [C-2-1] 相機預覽畫面必須相對於裝置目前的方向,水平鏡像顯示。

7.5.3. 外接攝影機

裝置實作方式:

  • 可能包括支援不一定總是連線的外接攝影機。

如果裝置實作項目包含外接攝影機支援,則:

  • [C-1-1] 必須宣告平台功能旗標 android.hardware.camera.externalandroid.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 裝置實作項目「必須」確保持續支援本節和 Android SDK 中說明的 API。

在已淘汰的 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,則傳遞至 onPreviewFrame() 的 byte[] 中的資料必須採用 NV21 編碼格式。也就是說,NV21 必須是預設值。
  • [C-0-3] 必須支援前置和後置鏡頭的相機預覽畫面 (以 android.graphics.ImageFormat.YV12 常數表示) 的 YV12 格式 (適用於 android.hardware.Camera)。(硬體視訊編碼器和攝影機可使用任何原生像素格式,但裝置實作內容「必須」支援轉換為 YV12。)
  • [C-0-4] 針對在 android.request.availableCapabilities 中宣傳 REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE 功能的 android.hardware.camera2 裝置,必須支援透過 android.media.ImageReader API 輸出 android.hardware.ImageFormat.YUV_420_888android.hardware.ImageFormat.JPEG 格式。
  • [C-0-5] 裝置是否包含硬體自動對焦或其他功能,都必須實作 Android SDK 說明文件中包含的完整 Camera API。舉例來說,即使自動對焦與非自動對焦相機無關,缺少自動對焦功能的相機仍須呼叫任何已註冊的 android.hardware.Camera.AutoFocusCallback 執行個體。請注意,這適用於前置鏡頭;舉例來說,即使大多數前置鏡頭不支援自動對焦,API 回呼仍須如所述「偽造」。
  • [C-0-6] MUST recognize and honor each parameter name defined as a constant in the android.hardware.Camera.Parameters class and the android.hardware.camera2.CaptureRequest class. 反之,裝置實作項目「不得」接受或辨識傳遞至 android.hardware.Camera.setParameters() 方法的字串常數,除非這些常數已記錄在 android.hardware.Camera.Parameters 中。也就是說,如果硬體允許,裝置實作項目「必須」支援所有標準攝影機參數,且「不得」支援自訂攝影機參數類型。舉例來說,支援使用高動態範圍 (HDR) 成像技術拍攝圖片的裝置實作,必須支援相機參數 Camera.SCENE_MODE_HDR
  • [C-0-7] 必須使用 Android SDK 中說明的 android.info.supportedHardwareLevel 屬性回報適當的支援層級,並回報適當的架構功能旗標
  • [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.camera2 API 存取所有可透過已淘汰的 android.hardware.Camera API 存取的攝影機。
  • [C-0-12] 必須確保臉部外觀不會變更,包括但不限於變更臉部幾何形狀、臉部膚色或臉部皮膚平滑度,適用於任何 android.hardware.camera2android.hardware.Camera API。
  • [C-SR] 如果裝置有多個朝向相同方向的 RGB 攝影機,強烈建議支援列出功能 CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA 的邏輯攝影機裝置,其中包含所有朝向該方向的 RGB 攝影機,做為實體子裝置。

如果裝置實作項目為第三方應用程式提供專屬的 Camera 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 權限時除外。

裝置實作「可能」會使用下列任一方式,滿足上述需求:

  • 使用者可存取的可卸除式儲存空間,例如 SD 卡插槽。
  • Android 開放原始碼計畫 (AOSP) 實作的內部 (不可移除) 儲存空間部分。

如果裝置實作項目使用可移除式儲存空間來滿足上述需求,則:

  • [C-1-1] 如果插槽中未插入儲存媒體,必須實作祝酒詞或彈出式使用者介面,向使用者發出警告。
  • [C-1-2] 必須隨附 FAT 格式的儲存媒體 (例如 SD 卡),或在購買時的包裝盒和其他素材上註明儲存媒體須另行購買。

如果裝置實作項目使用部分不可移除的儲存空間來滿足上述需求,則:

  • 應使用內部應用程式共用儲存空間的 AOSP 實作項目。
  • MAY share the storage space with the application private data.

如果裝置實作項目具有支援 USB 周邊裝置模式的 USB 連接埠,則:

  • [C-3-1] 必須提供從主機存取應用程式共用儲存空間資料的機制。
  • 應透過 Android 的媒體掃描器服務和 android.provider.MediaStore,公開顯示兩個儲存路徑的內容。
  • 可使用 USB 大量儲存裝置,但應使用媒體傳輸通訊協定來滿足這項需求。

如果裝置實作項目具有 USB 連接埠 (採用 USB 周邊模式) 並支援媒體傳輸通訊協定,則:

  • 應與參考 Android MTP 主機「Android 檔案傳輸」相容。
  • SHOULD report a USB device class of 0x00.
  • 應回報「MTP」的 USB 介面名稱。

7.6.3. 合併儲存空間

如果裝置預期會是行動裝置 (與電視不同),裝置實作方式如下:

  • [SR] 強烈建議在長期穩定的位置實作可攜式儲存空間,因為意外中斷連線可能會導致資料遺失/毀損。

如果可移除式儲存裝置連接埠位於長期穩定的位置,例如電池盒或其他保護蓋內,裝置實作方式如下:

7.7. USB

如果裝置實作項目有 USB 連接埠,則:

  • 應支援 USB 周邊裝置模式,且應支援 USB 主機模式。

7.7.1. USB 周邊裝置模式

如果裝置實作項目包含支援周邊模式的 USB 連接埠:

  • [C-1-1] 連接埠必須可連接至具有標準 Type-A 或 Type-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] SHOULD implement support to draw 1.5 A current during HS chirp and traffic as specified in the USB Battery Charging specification, revision 1.2. 強烈建議現有和新的 Android 裝置符合這些需求,以便升級至未來的平台版本。
  • [SR] 強烈建議不要支援專有充電方法,因為這類方法會將 Vbus 電壓修改為超出預設等級,或變更接收器/來源角色,可能導致充電器或支援標準 USB Power Delivery 方法的裝置發生互通性問題。雖然這項規定標示為「強烈建議」,但日後 Android 版本可能會要求所有 Type-C 裝置支援標準 Type-C 充電器,以確保完整互通性。
  • [SR] 強烈建議支援 Power Delivery,以便在支援 Type-C USB 和 USB 主機模式時,交換資料和電源角色。
  • 應支援高電壓充電的 Power Delivery,以及顯示器輸出等替代模式。
  • 應實作 Android Open Accessory (AOA) API 和規格,如 Android SDK 說明文件所述。

如果裝置實作包含 USB 連接埠並實作 AOA 規格,則:

  • [C-2-1] MUST declare support for the hardware feature android.hardware.usb.accessory.
  • [C-2-2] USB 大量儲存類別的介面說明 iInterface 字串結尾必須包含「android」字串。

7.7.2. USB 主機模式

如果裝置實作項目包含支援主機模式的 USB 連接埠,則:

  • [C-1-1] 必須實作 Android USB 主機 API,如 Android SDK 中所述,且必須宣告支援硬體功能 android.hardware.usb.host
  • [C-1-2] 必須支援連線至標準 USB 周邊裝置,換句話說,必須符合下列任一條件:
    • 具備裝置上的 C 型連接埠,或隨附可將裝置上的專屬連接埠轉換為標準 USB C 型連接埠的傳輸線 (USB C 型裝置)。
    • 具備 A 型連接埠,或隨附可將裝置專屬連接埠轉換為標準 USB A 型連接埠的傳輸線。
    • 具備裝置端 micro-AB 連接埠,且應隨附可轉接至標準 Type-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] 必須支援偵測和對應 USB HID 用途表語音指令用途要求中指定的下列 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

如果裝置實作項目包含支援主機模式和儲存空間存取架構 (SAF) 的 USB 連接埠,則:

  • [C-3-1] 必須辨識任何遠端連線的 MTP (媒體傳輸通訊協定) 裝置,並透過 ACTION_GET_CONTENTACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT Intent 存取裝置內容。。

如果裝置實作項目包含支援主機模式和 USB Type-C 的 USB 連接埠,則:

  • [C-4-1] 必須實作 USB Type-C 規格 (第 4.5.1.3.3 節) 定義的雙重角色連接埠功能。
  • [SR] 強烈建議支援 DisplayPort,應支援 USB SuperSpeed 資料速率,並強烈建議支援電力傳輸,以進行資料和電源角色交換。
  • [SR] 強烈建議不要支援「USB Type-C Cable and Connector Specification Revision 1.2」附錄 A 所述的音訊轉接頭配件模式。
  • 應實作最適合裝置板型規格的 Try.* 模型。舉例來說,手持裝置「應」實作 Try.SNK 模型。

7.8. 音訊

7.8.1. 麥克風

如果裝置實作項目包含麥克風,則:

  • [C-1-1] MUST report the android.hardware.microphone feature constant.
  • [C-1-2] 必須符合第 5.4 節的錄音規定。
  • [C-1-3] 必須符合第 5.6 節的音訊延遲規定。
  • [SR] 強烈建議支援近超音波錄音功能,詳情請參閱第 7.8.3 節

如果裝置實作項目省略麥克風,則:

  • [C-2-1] 不得回報 android.hardware.microphone 功能常數。
  • [C-2-2] 必須至少以無運算的形式實作音訊錄製 API,詳情請參閱第 7 節

7.8.2. 音訊輸出

如果裝置實作項目包含喇叭或音訊/多媒體輸出埠 (適用於音訊輸出周邊裝置,例如 4 導體 3.5 公釐音訊插孔或使用 USB 音訊類別的 USB 主機模式埠),則:

  • [C-1-1] MUST report the android.hardware.audio.output feature constant.
  • [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
  • [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
  • [C-SR] 強烈建議支援 OMTP 針腳順序的音訊插頭。
  • [C-SR] 強烈建議支援透過附麥克風的立體聲耳機錄音。

如果裝置實作項目具有 4 導體 3.5 公釐音訊插孔,且支援麥克風,並以麥克風額外值設為 1 廣播 android.intent.action.HEADSET_PLUG,則:

  • [C-2-1] MUST support the detection of microphone on the plugged in audio accessory.
7.8.2.2. 數位音訊埠

為確保與使用 USB-C 接頭並在 Android 生態系統中實作 (USB 音訊類別) 的耳機和其他音訊配件相容,請參閱 Android USB 耳機規格

如要瞭解裝置專屬需求,請參閱第 2.2.1 節。

7.8.3. 近超音波

近超音波音訊的頻帶為 18.5 kHz 至 20 kHz。

裝置實作方式:

如果 PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND 為「true」,VOICE_RECOGNITIONUNPROCESSED 音訊來源必須符合下列規定:

  • [C-1-1] 麥克風在 18.5 kHz 至 20 kHz 頻帶的平均功率回應,必須比 2 kHz 的回應低 15 dB 以下。
  • [C-1-2] 在 18.5 kHz 至 20 kHz 的頻率範圍內,麥克風的未加權訊號雜訊比 (19 kHz 音調,-26 dBFS) 必須不低於 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) 執行「Automated Glitch Test」。

測試時需要音訊迴路轉接頭,可直接插入 3.5 公釐插孔,或搭配 USB-C 對 3.5 公釐轉接器使用。應測試所有音訊輸出埠。

OboeTester 目前支援 AAudio 路徑,因此應使用 AAudio 測試下列組合是否有故障:

Perf 模式 分享 輸出取樣率 在頻道中 Out Chans
LOW_LATENCY 獨家 未指定 1 2
LOW_LATENCY 獨家 未指定 2 1
LOW_LATENCY 已共用 未指定 1 2
LOW_LATENCY 已共用 未指定 2 1
已共用 48000 1 2
已共用 48000 2 1
已共用 44100 1 2
已共用 44100 2 1
已共用 16000 1 2
已共用 16000 2 1

可靠的串流「應」符合以下訊號雜訊比 (SNR) 和總諧波失真 (THD) 的 2000 Hz 正弦波標準。

換能器 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 支援虛擬實境模式,這項功能可處理通知的立體算繪作業,並在虛擬實境應用程式取得使用者焦點時,停用單眼系統 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] MUST support android.hardware.vulkan.level 0.
  • 應支援 android.hardware.vulkan.level 1 以上版本。
  • [C-1-6] 必須實作 EGL_KHR_mutable_render_bufferEGL_ANDROID_front_buffer_auto_refreshEGL_ANDROID_get_native_client_bufferEGL_KHR_fence_syncEGL_KHR_wait_syncEGL_IMG_context_priorityEGL_EXT_protected_contentEGL_EXT_image_gl_colorspace,並在可用 EGL 擴充功能的清單中公開擴充功能。
  • [C-1-8] 必須實作 GL_EXT_multisampled_render_to_texture2GL_OVR_multiviewGL_OVR_multiview2GL_EXT_protected_textures,並在可用的 GL 擴充功能清單中公開擴充功能。
  • [C-SR] STRONGLY RECOMMENDED to implement GL_EXT_external_buffer, GL_EXT_EGL_image_array, GL_OVR_multiview_multisampled_render_to_texture, and expose the extensions in the list of available GL extensions.
  • [C-SR] 強烈建議支援 Vulkan 1.1。
  • [C-SR] 強烈建議實作 VK_ANDROID_external_memory_android_hardware_bufferVK_GOOGLE_display_timingVK_KHR_shared_presentable_image,並在可用的 Vulkan 擴充功能清單中公開。
  • [C-SR] 強烈建議公開至少一個 Vulkan 佇列系列,其中 flags 同時包含 VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT,且 queueCount 至少為 2。
  • [C-1-7] GPU 和螢幕必須能夠同步存取共用的前端緩衝區,以便以兩個算繪環境,以 60 FPS 的速度算繪 VR 內容的交替眼睛畫面,且不會出現明顯的畫面撕裂瑕疵。
  • [C-1-9] 必須實作 NDK 中所述的 AHardwareBuffer 標記 AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFERAHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATAAHARDWAREBUFFER_USAGE_PROTECTED_CONTENT
  • [C-1-10] 必須支援 AHardwareBuffer,且至少須支援下列格式的 AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUTAHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGEAHARDWAREBUFFER_USAGE_PROTECTED_CONTENT 用途標記組合:AHARDWAREBUFFER_FORMAT_R5G6B5_UNORMAHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORMAHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORMAHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT
  • [C-SR] 強烈建議支援分配具有多個圖層的 AHardwareBuffer,以及 C-1-10 中指定的標記和格式。
  • [C-1-11] 必須支援 H.264 解碼,至少 3840 x 2160 (30 fps),壓縮至平均 40 Mbps (相當於 4 個 1920 x 1080 (30 fps) - 10 Mbps 或 2 個 1920 x 1080 (60 fps) - 20 Mbps)。
  • [C-1-12] 必須支援 HEVC 和 VP9,必須能夠以 30 FPS 解碼至少 1920 x 1080 的影片,壓縮後平均為 10 Mbps,且應能夠以 30 FPS 解碼 3840 x 2160 的影片 (20 Mbps,相當於以 30 FPS 解碼 4 個 1920 x 1080 的影片,每個 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] MUST support and properly report Direct Channel Type for all of the following default sensor types:
    • 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] 必須符合android.hardware.hifi_sensors的陀螺儀、加速計和磁力計相關規定,如第 7.3.9 節所述。
  • [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) 開始,每個 Android 版本都定義了媒體效能類別的要求。特殊值 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 的檔案。
  • 隨機寫入效能。測量方式為使用 4KB 寫入緩衝區寫入 256MB 檔案。
  • 循序讀取效能。使用 10 MB 的寫入緩衝區讀取 256 MB 的檔案時測得。
  • 隨機讀取效能。使用 4KB 寫入緩衝區讀取 256MB 檔案時測得。

8.3.省電模式

如果裝置實作項目包含 AOSP 提供的裝置電源管理改善功能 (例如應用程式待命值區、打盹模式),或擴充的功能不會套用比很少使用的應用程式待命值區更嚴格的限制,則:

  • [C-1-1] 觸發、維護、喚醒演算法,以及應用程式待機和微光省電模式的全域系統設定,皆不得與 AOSP 實作方式有所差異。
  • [C-1-2] MUST NOT deviate from the AOSP implementation for the use of global settings to manage the throttling of jobs, alarm and network for apps in each bucket for App standby.
  • [C-1-3] 用於應用程式待命的應用程式待命值區數量不得與 AOSP 實作有所差異。
  • [C-1-4] 必須按照「電源管理」一節所述,實作應用程式待命儲存區和打盹模式。
  • [C-1-5] 裝置處於省電模式時,必須傳回 PowerManager.isPowerSaveMode()true
  • [C-SR] 強烈建議提供使用者介面,讓使用者啟用及停用省電模式功能。
  • [C-SR] Are STRONGLY RECOMMENDED to provide user affordance to display all Apps that are exempted from App Standby and Doze power-saving modes.

如果裝置實作項目擴充了 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] STRONGLY RECOMMENDED to report all power consumption values in milliampere hours (mAh).
  • [SR] 強烈建議回報每個程序 UID 的 CPU 耗電量。Android 開放原始碼計畫透過 uid_cputime 核心模組實作項目,滿足這項需求。
  • [SR] STRONGLY RECOMMENDED to make this power usage available via the adb shell dumpsys batterystats shell command to the app developer.
  • 如果無法將硬體元件耗電量歸因於應用程式,則應歸因於硬體元件本身。

8.5. 一致的效能

對於長時間執行的效能密集型應用程式,效能可能會大幅波動,原因可能是背景執行的其他應用程式,或是因溫度限制而導致 CPU 受到節流。Android 包含程式化介面,因此當裝置有能力時,最上層的前景應用程式可以要求系統最佳化資源分配,以解決這類波動。

裝置實作方式:

如果裝置實作項目回報支援持續效能模式,則:

  • [C-1-1] 應用程式要求時,必須至少 30 分鐘為頂層前景應用程式提供一致的效能。
  • [C-1-2] MUST honor the Window.setSustainedPerformanceMode() API and other related APIs.

如果裝置實作項目包含兩個以上的 CPU 核心,則:

  • SHOULD provide at least one exclusive core that can be reserved by the top foreground application.

如果裝置實作支援為頂層前景應用程式保留一個專屬核心,則:

  • [C-2-1] MUST report through the Process.getExclusiveCores() API method the ID numbers of the exclusive cores that can be reserved by the top foreground application.
  • [C-2-2] 除了應用程式在專屬核心上執行的裝置驅動程式外,不得允許任何使用者空間程序,但可視需要允許部分核心程序執行。

如果裝置實作項目不支援專屬核心,則:

9. 安全性模型相容性

裝置實作方式:

  • [C-0-1] MUST implement a security model consistent with the Android platform security model as defined in Security and Permissions reference document in the APIs in the Android developer documentation.

  • [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 Key Vault 服務所述,可防止鎖定螢幕知識因素遭到暴力攻擊。

裝置實作方式:

  • [C-0-7] 應用程式透過標準 Android API 或專屬機制要求位置資訊或體能活動資料時,必須遵守 Android 位置資訊權限屬性。這類資料包括但不限於:

    • 裝置位置 (例如經緯度)。
    • 可用於判斷或估算裝置位置的資訊 (例如 SSID、BSSID、Cell 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] MUST support running multiple applications as the same Linux user ID, provided that the applications are properly signed and constructed, as defined in the Security and Permissions reference.

9.3. 檔案系統權限

裝置實作方式:

9.4. 替代執行環境

即使裝置實作項目包含執行應用程式的執行階段環境,且這些應用程式使用 Dalvik 可執行格式或原生程式碼以外的軟體或技術,也必須維持 Android 安全性和權限模型的穩定性。換句話說:

  • [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] 替代執行階段「不得」啟動,也不得授予或授予其他應用程式超級使用者 (根) 或任何其他使用者 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] 必須為每位使用者實作與 Android 平台安全模型一致的安全模型,如 API 的「安全性與權限參考文件」中所定義。
  • [C-1-3] 每個使用者執行個體都必須有獨立且隔離的共用應用程式儲存空間 (又稱 /sdcard) 目錄。
  • [C-1-4] 必須確保由特定使用者擁有及代表該使用者執行的應用程式,無法列出、讀取或寫入任何其他使用者擁有的檔案,即使兩位使用者的資料儲存在相同磁碟區或檔案系統中也一樣。
  • [C-1-5] 如果裝置實作使用可移除式媒體做為外部儲存空間 API,則啟用多使用者時,必須使用僅儲存在非可移除式媒體上的金鑰加密 SD 卡內容,且只有系統可以存取該金鑰。因為這樣主機電腦就無法讀取媒體,裝置實作必須切換至 MTP 或類似系統,才能讓主機電腦存取目前使用者的資料。

9.6. 付費簡訊警告

Android 支援向使用者發出警告,提醒他們注意任何傳送出去的付費簡訊。付費簡訊是指傳送給電信業者註冊服務的簡訊,使用者可能需要支付相關費用。

如果裝置實作項目聲明支援 android.hardware.telephony,則:

  • [C-1-1] MUST warn users before sending a SMS message to numbers identified by regular expressions defined in /data/misc/sms/codes.xml file in the device. 上游 Android 開放原始碼計畫提供的實作項目符合這項需求。

9.7. 安全防護功能

裝置實作項目「必須」確保核心和平台中的安全防護功能符合下列規定。

Android 沙箱包含使用 Security-Enhanced Linux (SELinux) 強制存取控制 (MAC) 系統、seccomp 沙箱,以及 Linux 核心中其他安全防護功能的功能。裝置實作方式:

  • [C-0-1] 即使在 Android 架構下方實作 SELinux 或任何其他安全功能,也必須維持與現有應用程式的相容性。
  • [C-0-2] 如果 Android 架構下方的安全性功能偵測到安全性違規行為並成功封鎖,則「不得」顯示使用者介面;但如果發生未封鎖的安全性違規行為,導致成功遭到利用,則「可以」顯示使用者介面。
  • [C-0-3] MUST NOT make SELinux or any other security features implemented below the Android framework configurable to the user or app developer.
  • [C-0-4] 不得允許應用程式透過 API (例如裝置管理 API) 影響其他應用程式,進而設定不相容的政策。
  • [C-0-5] 媒體架構必須分割成多個程序,以便根據 Android 開放原始碼計畫網站所述,為每個程序授予更精細的存取權。
  • [C-0-6] MUST implement a kernel application sandboxing mechanism which allows filtering of system calls using a configurable policy from multithreaded programs. 上游 Android 開放原始碼計畫會啟用 seccomp-BPF,並透過執行緒群組同步處理 (TSYNC) 滿足這項需求,詳情請參閱 source.android.com 的「Kernel Configuration」一節

核心完整性和自我保護功能是 Android 安全性的重要環節。裝置實作方式:

  • [C-0-7] MUST implement kernel stack buffer overflow protection mechanisms. 這類機制包括 CC_STACKPROTECTOR_REGULARCONFIG_CC_STACKPROTECTOR_STRONG
  • [C-0-8] 必須實作嚴格的核心記憶體保護措施,確保可執行程式碼為唯讀,唯讀資料不可執行也不可寫入,可寫入資料不可執行 (例如 CONFIG_DEBUG_RODATACONFIG_STRICT_KERNEL_RWX)。
  • [C-0-9] 對於原先搭載 API 級別 28 以上版本的裝置,在使用者空間和核心空間之間複製時,必須實作靜態和動態物件大小界限檢查 (例如 CONFIG_HARDENED_USERCOPY)。
  • [C-0-10] 在核心模式下執行時 (例如硬體 PXN,或透過 CONFIG_CPU_SW_DOMAIN_PANCONFIG_ARM64_SW_TTBR0_PAN 模擬),不得在原先搭載 API 級別 28 以上版本的裝置上執行使用者空間記憶體。
  • [C-0-11] 在原始出廠時搭載 API 級別 28 以上版本的裝置上,核心不得在正常 usercopy 存取 API (例如硬體 PAN,或透過 CONFIG_CPU_SW_DOMAIN_PANCONFIG_ARM64_SW_TTBR0_PAN 模擬) 之外,讀取或寫入核心中的使用者空間記憶體。
  • [C-0-12] 如果硬體容易受到 CVE-2017-5754 影響,則所有原先搭載 API 級別 28 以上版本的裝置 (例如 CONFIG_PAGE_TABLE_ISOLATIONCONFIG_UNMAP_KERNEL_AT_EL0) 都必須實作核心頁表隔離功能。
  • [C-0-13] 如果硬體容易受到 CVE-2017-5715 影響,則必須在所有原先搭載 API 級別 28 以上版本的裝置 (例如 CONFIG_HARDEN_BRANCH_PREDICTOR) 上,實作分支預測強化功能。
  • [SR] STRONGLY RECOMMENDED to keep kernel data which is written only during initialization marked read-only after initialization (e.g. __ro_after_init).
  • [C-SR] 強烈建議隨機安排核心程式碼和記憶體的版面配置,並避免暴露會影響隨機安排的資訊 (例如透過 /chosen/kaslr-seed Device Tree nodeEFI_RNG_PROTOCOL 使用開機載入程式熵)。 CONFIG_RANDOMIZE_BASE

  • [C-SR] 強烈建議在核心中啟用控制流程完整性 (CFI),進一步防範程式碼重用攻擊 (例如 CONFIG_CFI_CLANGCONFIG_SHADOW_CALL_STACK)。

  • [C-SR] 強烈建議不要在已啟用控制流程完整性 (CFI)、陰影呼叫堆疊 (SCS) 或整數溢位清除 (IntSan) 的元件上停用這些功能。
  • [C-SR] 強烈建議為任何額外的安全防護敏感使用者空間元件啟用 CFI、SCS 和 IntSan,詳情請參閱 CFIIntSan
  • [C-SR] 強烈建議在核心中啟用堆疊初始化,防止使用未初始化的本機變數 (CONFIG_INIT_STACK_ALLCONFIG_INIT_STACK_ALL_ZERO)。此外,裝置實作「不應」假設編譯器用於初始化本機的值。
  • [C-SR] 強烈建議在核心中啟用堆積初始化,防止使用未初始化的堆積分配 (CONFIG_INIT_ON_ALLOC_DEFAULT_ON),且不應假設核心用於初始化這些分配的值。

如果裝置實作項目使用 Linux 核心,則:

  • [C-1-1] 必須實作 SELinux。
  • [C-1-2] 必須將 SELinux 設為全域強制執行模式。
  • [C-1-3] MUST configure all domains in enforcing mode. 不允許任何寬鬆模式網域,包括裝置/供應商專屬網域。
  • [C-1-4] MUST NOT modify, omit, or replace the neverallow rules present within the system/sepolicy folder provided in the upstream Android Open Source Project (AOSP) and the policy MUST compile with all neverallow rules present, for both AOSP SELinux domains as well as device/vendor specific domains.
  • [C-1-5] MUST run third-party applications targeting API level 28 or higher in per-application SELinux sandboxes with per-app SELinux restrictions on each application's private data directory.
  • 應保留上游 Android 開放原始碼計畫系統/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] MUST keep a reasonable retention period of such user history.
  • [SR] 建議您保留 14 天的保留期限,這是 AOSP 實作中預設的設定。

Android 會使用 StatsLog 識別碼儲存系統事件,並透過 StatsManagerIncidentManager 系統 API 管理這類記錄。

裝置實作方式:

  • [C-0-2] 只能包含系統 API 類別 IncidentManager 建立的事件報告中標有 DEST_AUTOMATIC 的欄位。
  • [C-0-3] 除了 StatsLog SDK 文件所述事件外,不得使用系統事件 ID 記錄任何其他事件。如果記錄其他系統事件,這些事件「可能」會使用 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 是由 Device Policy Controller 透過 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 透過 System 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] MUST only send all such data and the log of the device using a privacy-preserving mechanism. 隱私權保護機制定義為「僅允許匯總分析,並防止記錄的事件或衍生結果與個別使用者相符」,以避免任何使用者資料可供檢查 (例如使用差異化隱私權技術 (如 RAPPOR) 實作)。
  • [C-1-4] 不得將這類資料與裝置上的任何使用者身分 (例如 Account) 建立關聯,除非每次建立關聯時都徵得使用者的明確同意。
  • [C-1-5] 不得與其他應用程式分享這類資料,除非每次分享時都取得使用者明確同意。
  • [C-1-6] 如果ContentCaptureService或專有方式收集的資料以任何形式儲存在裝置上,則必須提供使用者清除這類資料的機制。

如果裝置實作項目包含實作 System API ContentCaptureService 的服務,或任何會擷取上述資料的專屬服務,則:

  • [C-2-1] 不得允許使用者以可安裝的應用程式或服務取代內容擷取服務,且只能允許預先安裝的服務擷取這類資料。
  • [C-2-2] 除了預先安裝的內容擷取服務機制外,不得允許任何應用程式擷取這類資料。
  • [C-2-3] 必須提供使用者選項,停用內容擷取服務。
  • [C-2-4] 不得省略使用者管理內容擷取服務所持有的 Android 權限,且必須遵循第 9.1 節所述的 Android 權限模式。權限
  • [C-SR] 強烈建議將內容擷取服務元件與其他系統元件分開,例如不要繫結服務或共用程序 ID,但下列情況除外:

    • 電話、聯絡人、系統 UI 和媒體

9.8.7. 剪貼簿存取權

裝置實作方式:

  • [C-0-1] 除非應用程式是預設 IME 或目前具有焦點的應用程式,否則不得傳回剪貼簿上經過裁剪的資料 (例如透過 ClipboardManager API)。

9.8.8. 位置

裝置實作方式:

  • [C-0-1] 未經使用者明確同意或主動操作,不得開啟/關閉裝置定位設定和 Wi-Fi/藍牙掃描設定。
  • [C-0-2] 必須提供使用者介面,讓使用者存取位置相關資訊,包括最近的位置要求、應用程式層級權限,以及使用 Wi-Fi/藍牙掃描功能判斷位置資訊的情形。
  • [C-0-3] MUST ensure that the application using Emergency Location Bypass API [LocationRequest.setLocationSettingsIgnored()] is a user initiated emergency session (e.g. dial 911 or text to 911). 不過,如果偵測到車禍/事故 (例如為了滿足 eCall 需求),車輛「可能」會啟動緊急救援工作階段,不必等待使用者主動互動。
  • [C-0-4] 必須保留 Emergency Location Bypass API 的功能,在不變更設定的情況下略過裝置位置資訊設定。
  • [C-0-5] MUST schedule a notification that reminds the user after an app in the background has accessed their location using the [ACCESS_BACKGROUND_LOCATION] permission.

9.8.9. 已安裝的應用程式

根據預設,指定 API 級別 30 以上版本的 Android 應用程式無法查看其他已安裝應用程式的詳細資料 (請參閱 Android SDK 說明文件中的「套件瀏覽權限」)。

裝置實作方式:

  • [C-0-1] 不得向指定 API 級別 30 以上版本的應用程式公開任何其他已安裝應用程式的詳細資料,除非該應用程式已可透過受管理 API 查看其他已安裝應用程式的詳細資料。這包括但不限於裝置實作人員新增的任何自訂 API 所公開的詳細資料,或可透過檔案系統存取的資料。

9.8.10. 連線錯誤報告

如果裝置實作項目使用 BugreportManager 透過系統 API BUGREPORT_MODE_TELEPHONY 產生錯誤報告,則:

  • [C-1-1] 每次呼叫 System API BUGREPORT_MODE_TELEPHONY 產生報表時,都必須取得使用者同意聲明,且不得提示使用者同意應用程式日後的所有要求。
  • [C-1-2] 開始產生報告時,必須顯示並取得使用者的明確同意聲明,且未取得使用者明確同意聲明前,不得將產生的報告傳回要求應用程式。
  • [C-1-3] MUST generate requested reports containing at least the following information:
    • TelephonyDebugService dump
    • TelephonyRegistry dump
    • WifiService dump
    • ConnectivityService dump
    • 通話套件的 CarrierService 執行個體傾印 (如已繫結)
    • 無線電記錄緩衝區
  • [C-1-4] 生成的報表不得包含下列內容:
    • 任何與連線偵錯無關的資訊。
    • 任何種類的使用者安裝應用程式流量記錄,或使用者安裝應用程式/套件的詳細設定檔 (UID 沒問題,但不得包含套件名稱)。
  • 可能包含與任何使用者身分無關的其他資訊。(例如供應商記錄)。

如果裝置實作項目在錯誤報告中包含其他資訊 (例如供應商記錄),且這些資訊會影響隱私權/安全性/電池/儲存空間/記憶體,則:

  • [C-SR] STRONGLY RECOMMENDED to have a developer setting defaulted to disabled. 為符合這項規定,AOSP 在開發人員設定中提供 Enable verbose vendor logging 選項,可將其他裝置專屬供應商記錄納入錯誤報告。

9.8.11. 分享資料 blob

Android 透過 BlobStoreManager 允許應用程式將資料 blob 提供給系統,並與所選的一組應用程式共用。

如果裝置實作項目支援共用資料 blob (如 SDK 說明文件所述),則:

9.9. 資料儲存加密

所有裝置都必須符合第 9.9.1 節的規定。如果裝置的推出 API 級別早於本文件,則可免除 9.9.2 和 9.9.3 節的要求,但必須符合 Android 相容性定義文件 9.9 節的要求,且該文件對應的 API 級別必須與裝置推出時的 API 級別相同。

9.9.1. 直接開機

裝置實作方式:

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] MUST NOT offer any method to unlock the CE protected storage without either the user-supplied credentials, a registered escrow key or a resume on reboot implementation meeting the requirements in section 9.9.4.
  • [C-1-4] 必須使用驗證開機程序。

9.9.3.1. 檔案型加密與中繼資料加密

如果裝置實作項目使用檔案型加密搭配中繼資料加密,則:

  • [C-1-5] MUST encrypt file contents and filesystem metadata using AES-256-XTS or Adiantum. AES-256-XTS 是指進階加密標準,採用 256 位元加密金鑰長度,並以 XTS 模式運作;金鑰的完整長度為 512 位元。Adiantum 是指 Adiantum-XChaCha12-AES,詳情請參閱 https://github.com/google/adiantum。檔案系統中繼資料是指檔案大小、擁有權、模式和擴充屬性 (xattrs) 等資料。
  • [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 必須繫結至驗證開機程序和裝置的硬體信任根。

  • [C-1-8] CE 金鑰必須繫結至使用者的螢幕鎖定憑證。
  • [C-1-9] 如果使用者未指定螢幕鎖定憑證,CE 金鑰必須繫結至預設密碼。
  • [C-1-10] 必須是獨一無二,也就是說,任何使用者的 CE 或 DE 金鑰不得與其他使用者的 CE 或 DE 金鑰相符。
  • [C-1-11] 必須使用強制支援的密碼、金鑰長度和模式。

  • 預先安裝的必要應用程式 (例如「鬧鐘」、「電話」、「訊息」)「應該」要支援直接啟動。

上游 Android 開放原始碼專案提供檔案型加密的偏好實作方式,以 Linux 核心的「fscrypt」加密功能為基礎;也提供中繼資料加密的偏好實作方式,以 Linux 核心的「dm-default-key」功能為基礎。

9.9.3.2. 使用者專屬的區塊層級加密

如果裝置實作項目使用使用者層級的區塊加密,則:

  • [C-1-1] 必須啟用多使用者支援功能,如第 9.5 節所述。
  • [C-1-2] 必須提供每個使用者的分區,可使用原始分區或邏輯磁碟區。
  • [C-1-3] MUST use unique and distinct encryption keys per-user for encryption of the underlying block devices.
  • [C-1-4] MUST use AES-256-XTS for block-level encryption of the user partitions.

  • 保護每個使用者區塊層級加密裝置的金鑰:

  • [C-1-5] 必須以加密編譯方式繫結至硬體支援的金鑰儲存區。這個 KeyStore 必須繫結至驗證開機程序和裝置的硬體信任根。

  • [C-1-6] 必須繫結至對應使用者的螢幕鎖定憑證。

您可以使用 Linux 核心的「dm-crypt」功能,透過使用者專屬分割區實作使用者專屬的區塊層級加密。

9.9.4. 重新啟動後繼續播放

「重新啟動後繼續」功能可在 OTA 啟動的重新啟動後,解鎖所有應用程式的 CE 儲存空間,包括尚未支援直接啟動的應用程式。這項功能可讓使用者在重新啟動後,繼續接收已安裝應用程式的通知。

實作「重新啟動後繼續」功能時,必須持續確保裝置落入攻擊者手中時,即使裝置已開機、CE 儲存空間已解鎖,且使用者在收到 OTA 後已解鎖裝置,攻擊者仍極難復原使用者的 CE 加密資料。為防範內部攻擊,我們也假設攻擊者取得廣播加密簽署金鑰。

具體來說:

  • [C-0-1] 即使攻擊者實際持有裝置,且具備下列功能和限制,也「不得」讀取 CE 儲存空間:

    • 可使用任何供應商或公司的簽署金鑰簽署任意訊息。
    • 可讓裝置接收 OTA 更新。
    • 可修改任何硬體 (AP、快閃等) 的運作方式,但下列情況除外。不過,這類修改作業至少會延遲一小時,且會進行電源重啟,導致 RAM 內容遭到破壞。
    • 無法修改防竄改硬體 (例如 Titan M) 的運作方式。
    • 無法讀取即時裝置的 RAM。
    • 無法取得使用者的憑證 (PIN 碼、解鎖圖案、密碼),或以其他方式導致憑證輸入。

舉例來說,如果裝置實作並遵守這裡的所有說明,即符合 [C-0-1] 規定。

9.10. 裝置完整性

下列規定可確保裝置完整性狀態資訊公開透明。裝置實作方式:

  • [C-0-1] 必須透過 System API 方法 PersistentDataBlockManager.getFlashLockState() 正確回報,指出系統啟動載入程式狀態是否允許刷新系統映像檔。FLASH_LOCK_UNKNOWN 狀態保留給從舊版 Android 升級的裝置實作項目,因為舊版 Android 沒有這個新的系統 API 方法。

  • [C-0-2] MUST support Verified Boot for device integrity.

如果裝置實作項目已發布,但較舊的 Android 版本不支援驗證開機,且無法透過系統軟體更新新增這項功能,則可能可免除這項需求。

驗證開機程序功能可確保裝置軟體的完整性。如果裝置實作支援這項功能,則:

  • [C-1-1] 必須宣告平台功能旗標 android.software.verified_boot
  • [C-1-2] 必須在每個啟動程序中執行驗證。
  • [C-1-3] 必須從不可變更的硬體金鑰 (信任根) 開始驗證,一路向上驗證至系統分區。
  • [C-1-4] MUST implement each stage of verification to check the integrity and authenticity of all the bytes in the next stage before executing the code in the next stage.
  • [C-1-5] 驗證演算法的強度必須達到 NIST 目前對雜湊演算法 (SHA-256) 和公開金鑰大小 (RSA-2048) 的建議。
  • [C-1-6] 系統驗證失敗時,不得允許完成開機程序,除非使用者同意嘗試開機,在這種情況下,不得使用任何未經驗證的儲存區塊資料。
  • [C-1-7] 除非使用者已明確解鎖啟動載入程式,否則不得允許修改裝置上的已驗證分割區。
  • [C-SR] 如果裝置中有多個獨立晶片 (例如無線電、專用圖像處理器),強烈建議在啟動時驗證每個晶片的啟動程序各階段。
  • [C-1-8] 必須使用防竄改儲存空間:用於儲存開機載入程式是否已解鎖。防竄改儲存空間是指開機載入程式可從 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] MUST support cryptographically verifying file content against a trusted key without reading the whole file.
  • [C-0-4] 如果讀取內容未根據信任金鑰驗證,則不得允許讀取受保護檔案的要求成功。

如果裝置實作項目已發布,但無法在較舊的 Android 版本上根據信任的金鑰驗證檔案內容,且無法透過系統軟體更新新增這項功能,則「可能」可免除這項規定。上游 Android 開放原始碼計畫會根據 Linux 核心 fs-verity 功能,提供這項功能的偏好實作方式。

裝置實作方式:

如果裝置實作項目支援 Android Protected Confirmation API,則:

  • [C-3-1] MUST report true for the ConfirmationPrompt.isSupported() API.

  • [C-3-2]「必須」確保在 Android OS (包括核心) 中執行的程式碼 (無論是否為惡意程式碼),都無法在沒有使用者互動的情況下產生正面回應。

  • [C-3-3] 即使 Android OS (包括核心) 遭到入侵,也必須確保使用者能夠查看並核准提示訊息。

9.11. 金鑰和憑證

應用程式開發人員可透過 Android Keystore 系統,將加密編譯金鑰儲存在容器中,並透過 KeyChain APIKeystore API 使用這些金鑰執行加密編譯作業。裝置實作方式:

  • [C-0-1] 必須允許匯入或產生至少 8,192 個金鑰。
  • [C-0-2] 鎖定螢幕驗證「必須」限制嘗試次數,且「必須」採用指數輪詢演算法。如果失敗次數超過 150 次,每次嘗試之間必須間隔至少 24 小時。
  • SHOULD not limit the number of keys that can be generated

如果裝置實作支援安全鎖定螢幕,則:

  • [C-1-1] MUST back up the keystore implementation with an isolated execution environment.
  • [C-1-2] 必須實作 RSA、AES、ECDSA 和 HMAC 密碼編譯演算法,以及 MD5、SHA1 和 SHA-2 系列雜湊函式,才能在與核心以上執行的程式碼安全隔離的區域中,正確支援 Android Keystore 系統支援的演算法。安全隔離機制「必須」封鎖所有可能機制,避免核心或使用者空間程式碼存取隔離環境的內部狀態,包括 DMA。上游 Android 開放原始碼計畫 (AOSP) 會使用 Trusty 實作項目來滿足這項需求,但您也可以選擇其他以 ARM TrustZone 為基礎的解決方案,或是經過第三方審查的適當管理程序型隔離安全實作項目。
  • [C-1-3] MUST perform the lock screen authentication in the isolated execution environment and only when successful, allow the authentication-bound keys to be used. 螢幕鎖定憑證的儲存方式必須確保只有隔離的執行環境可以執行螢幕鎖定驗證。上游 Android 開放原始碼計畫提供 Gatekeeper 硬體抽象層 (HAL) 和 Trusty,可用於滿足這項需求。
  • [C-1-4] 必須支援金鑰認證,其中認證簽署金鑰受到安全硬體保護,且簽署作業在安全硬體中執行。認證簽署金鑰必須在足夠數量的裝置間共用,才能防止金鑰做為裝置 ID 使用。如要符合這項規定,除非特定 SKU 的產量至少達到 10 萬部,否則請共用相同的認證金鑰。如果 SKU 的生產數量超過 10 萬個,每 10 萬個單位可能使用不同的金鑰。

請注意,如果裝置實作作業已在較早的 Android 版本上推出,則該裝置可免除必須具備由獨立執行環境支援的金鑰儲存區,以及支援金鑰認證的要求,除非裝置聲明 android.hardware.fingerprint 功能,而該功能需要由獨立執行環境支援的金鑰儲存區。

  • [C-1-5] 必須允許使用者選擇從解鎖狀態轉換為鎖定狀態的休眠逾時時間,最短可設定為 15 秒。如果車用裝置在主機關閉或使用者切換時鎖定螢幕,可能「不會」有休眠逾時設定。

9.11.1. 安全螢幕鎖定和驗證

AOSP 實作採用分層驗證模型,以知識因素為基礎的主要驗證可由次要的強效生物特徵辨識或較弱的第三層模式支援。

裝置實作方式:

  • [C-SR] 強烈建議只將下列其中一種方法設為主要驗證方式:
    • 數字 PIN 碼
    • 英數字元密碼
    • 在 3x3 點格線上滑動的模式

請注意,本文將上述驗證方法稱為建議的主要驗證方法。

如果裝置實作項目新增或修改建議的主要驗證方法,並使用新的驗證方法做為安全鎖定螢幕的方式,則新的驗證方法:

如果裝置實作項目新增或修改驗證方法,以便根據已知密碼解鎖螢幕鎖定畫面,並使用新的驗證方法做為安全鎖定螢幕的方式:

  • [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] MUST have a fall-back mechanism to use one of the recommended primary authentication methods which is based on a known secret.
  • [C-4-3] 必須停用,且當裝置政策控制器 (DPC) 應用程式呼叫 DevicePolicyManager.setKeyguardDisabledFeatures() 方法設定 keyguard 功能政策時,只能允許使用建議的主要驗證方式解鎖螢幕,並搭配任何相關聯的生物特徵辨識旗標 (即 KEYGUARD_DISABLE_BIOMETRICSKEYGUARD_DISABLE_FINGERPRINTKEYGUARD_DISABLE_FACEKEYGUARD_DISABLE_IRIS)。

如果生物特徵辨識驗證方法不符合第 3 級 (舊稱強效) 的規定 (如第 7.3.10 節所述):

  • [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 System API 的信任代理程式,則:

  • [C-7-1] 裝置鎖定延遲或可由信任代理程式解鎖時,設定選單和鎖定畫面必須清楚顯示相關資訊。舉例來說,AOSP 會在設定選單中顯示「自動鎖定設定」和「按下電源鍵立即鎖定」的文字說明,並在螢幕鎖定畫面上顯示可辨識的圖示,藉此符合這項規定。
  • [C-7-2] 必須遵守並完整實作 DevicePolicyManager 類別中的所有信任代理程式 API,例如 KEYGUARD_DISABLE_TRUST_AGENTS 常數。
  • [C-7-3] 不得在主要個人裝置 (例如手持式裝置) 上完整實作 TrustAgentService.addEscrowToken() 函式,但可在通常會共用的裝置實作 (例如 Android TV 或 Android Automotive 裝置) 上完整實作該函式。
  • [C-7-4] MUST encrypt all stored tokens added by TrustAgentService.addEscrowToken().
  • [C-7-5] 不得在金鑰使用的同一部裝置上儲存加密金鑰或託管權杖。舉例來說,儲存在手機上的金鑰可以解鎖電視上的使用者帳戶。對於 Automotive 裝置,不得將託管權杖儲存在車輛的任何部位。
  • [C-7-6] 啟用託管權杖來解密資料儲存空間前,必須告知使用者安全影響。
  • [C-7-7] MUST have a fall-back mechanism to use one of the recommended primary authentication methods.
  • [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 解鎖裝置,且只能使用 TrustAgent 將已解鎖的裝置維持在解鎖狀態,最多 4 小時。Android 開放原始碼計畫 (AOSP) 中的 TrustManagerService 預設實作方式符合這項規定。
  • [C-7-12] MUST use a cryptographically secure (e.g UKEY2) communication channel to pass the escrow token from the storage device to the target device.

如果裝置實作項目新增或修改的驗證方法,可用於解鎖上述非安全鎖定螢幕,並使用新的驗證方法解鎖 Keyguard:

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] MUST ensure that any peripherals shared with the AP cannot alter StrongBox processing in any way, or obtain any information from the 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-SR] 建議「強烈」提供內部攻擊防禦 (IAR) 功能,也就是說,即使內部人員有權存取韌體簽署金鑰,也無法產生會導致 StrongBox 洩漏機密、規避功能安全需求,或以其他方式存取敏感使用者資料的韌體。建議您實作 IAR 時,只允許透過 IAuthSecret HAL 提供主要使用者密碼時進行韌體更新。

9.11.3. 身分憑證

如要定義及達成身分憑證系統,請實作 android.security.identity.* 套件中的所有 API。應用程式開發人員可透過這些 API 儲存及擷取使用者身分文件。裝置實作方式:

  • [C-SR] 建議您「強烈」導入身分憑證系統。

如果裝置實作項目實作身分憑證系統,則:

  • [C-0-1] IdentityCredentialStore#getInstance() 方法必須傳回非空值。

  • [C-0-2] MUST implement the Identity Credential System (e.g. the android.security.identity.* APIs) with code communicating with a trusted application in an area that is securely isolated from the code running on the kernel and above. 安全隔離機制「必須」封鎖所有潛在機制,避免核心或使用者空間程式碼存取隔離環境的內部狀態,包括 DMA。

  • [C-0-3] 實作身分憑證系統所需的加密作業 (例如 android.security.identity.* API)「必須」完全在受信任的應用程式中執行,且私密金鑰資料「不得」離開獨立執行環境,除非高階 API (例如 createEphemeralKeyPair() 方法) 有特別要求。

  • [C-0-4] 實作信任的應用程式時,必須確保安全性屬性不受影響 (例如,除非符合存取控管條件,否則不會發布憑證資料;無法為任意資料產生 MAC),即使 Android 行為異常或遭入侵也一樣。

9.12. 資料刪除

所有裝置實作項目:

  • [C-0-1] 必須為使用者提供「恢復原廠設定」的機制。
  • [C-0-2] MUST delete all data on the userdata filesystem.
  • [C-0-3] 必須以符合相關產業標準 (例如 NIST SP800-88) 的方式刪除資料。
  • [C-0-4] 主要使用者的裝置政策控制器應用程式呼叫 DevicePolicyManager.wipeData() API 時,必須觸發上述「恢復原廠設定」程序。
  • MAY 提供快速資料清除選項,僅執行邏輯資料清除作業。

9.13. 安全啟動模式

Android 提供安全啟動模式,使用者可透過這個模式啟動裝置,此時裝置只會執行預先安裝的系統應用程式,並停用所有第三方應用程式。這個模式又稱為「安全啟動模式」,可讓使用者解除安裝可能有害的第三方應用程式。

裝置實作方式如下:

  • [SR] STRONGLY RECOMMENDED to implement Safe Boot Mode.

如果裝置實作安全啟動模式,則:

  • [C-1-1] 必須提供使用者進入安全啟動模式的選項,且不得受到裝置上安裝的第三方應用程式中斷,但第三方應用程式是裝置政策控制器,且已將 UserManager.DISALLOW_SAFE_BOOT 標記設為 true 時除外。

  • [C-1-2] 必須提供使用者在安全模式下解除安裝任何第三方應用程式的功能。

  • SHOULD 提供使用者從開機選單進入安全開機模式的選項,但工作流程應與正常開機不同。

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 開放原始碼計畫提供的參考和偏好實作項目進行變更。這樣做可盡量避免因導入錯誤而產生不相容問題,導致需要重新製作,甚至可能需要更新裝置。

10.1. 相容性測試套件

裝置實作方式:

  • [C-0-1] 裝置必須使用最終出貨軟體,通過 Android 開放原始碼計畫提供的 Android Compatibility Test Suite (CTS)

  • [C-0-2] 必須確保 CTS 存在模糊不清之處時的相容性,以及參考原始碼部分重新實作時的相容性。

CTS 專為在實際裝置上執行而設計。與任何軟體一樣,CTS 本身可能含有錯誤。CTS 的版本與本相容性定義無關,Android 11 可能會發布多個 CTS 修訂版本。

裝置實作方式:

  • [C-0-3] 裝置軟體完成時,必須通過最新版 CTS。

  • 應盡可能使用 Android 開放原始碼樹狀結構中的參考實作項目。

10.2. CTS 驗證器

CTS Verifier 隨附於相容性測試套件,由人員操作執行,測試自動化系統無法測試的功能,例如攝影機和感應器是否正常運作。

裝置實作方式:

  • [C-0-1] 必須在 CTS 驗證器中正確執行所有適用的測試案例。

CTS 驗證器包含多種硬體的測試,包括部分選用硬體。

裝置實作方式:

  • [C-0-2] 必須通過所有擁有的硬體測試;舉例來說,如果裝置有加速計,就必須在 CTS 驗證器中正確執行加速計測試案例。

對於本相容性定義文件標示為選用的功能,測試案例可略過或省略。

  • [C-0-2] 如上所述,每個裝置和每個建構版本都「必須」正確執行 CTS 驗證器。不過,由於許多建構版本非常相似,因此如果建構版本只有微不足道的差異,裝置實作人員就不必明確執行 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] MUST support OTA downloads with offline update via reboot.

如果裝置實作項目是搭載 Android 6.0 以上版本,更新機制「應」支援在 OTA 後驗證系統映像檔是否與預期結果完全相同。上游 Android 開放原始碼計畫中以區塊為基礎的 OTA 實作方式 (自 Android 5.1 起新增),符合這項規定。

此外,裝置實作項目「應」支援 A/B 系統更新。AOSP 會使用啟動控制 HAL 實作這項功能。

如果裝置實作項目在發布後,但在與 Android 相容性團隊諮詢後確定的合理產品生命週期內,發現會影響第三方應用程式相容性的錯誤,則:

  • [C-2-1] 裝置實作人員必須透過軟體更新修正錯誤,並按照上述機制套用更新。

Android 內建多項功能,可讓裝置擁有者應用程式 (如有) 控制系統更新的安裝作業。如果裝置的系統更新子系統回報 android.software.device_admin,則:

12. 文件變更記錄

如要查看這個版本相容性定義的變更摘要:

如要查看各個部分的異動摘要:

  1. 簡介
  2. 裝置類型
  3. 軟體
  4. 應用程式封裝
  5. 多媒體
  6. 開發人員工具和選項
  7. 硬體相容性
  8. 效能和電力
  9. 安全模式
  10. 軟體相容性測試
  11. 可更新的軟體
  12. 文件變更記錄
  13. 聯絡我們

12.1. 查看變更記錄的訣竅

變更內容的標示方式如下:

  • CDD
    相容性需求有重大異動。

  • 文件
    與外觀或建構相關的變更。

如要獲得最佳觀看體驗,請在更新記錄網址中附加 pretty=fullno-merges 網址參數。

13. 與我們聯絡

您可以加入 android-compatibility 論壇,提出任何文件未涵蓋的問題或要求說明。