Android 9 的功能與 API

Android 9 (API 級別 28) 推出了強大的新功能, 包括使用者和開發人員本文件將重點介紹開發人員適用的新功能,

如要瞭解新的 API,請參閱 API 差異比較報表,或前往 Android API 參考資料。另外也別忘了 瞭解 Android 9 行為變更 平台變更可能影響應用程式的哪些方面。

使用 Wi-Fi RTT 調整室內定位

新的 RTT API 支援應用程式中的室內定位。

Android 9 支援 IEEE 802.11-2016 Wi-Fi 的平台 通訊協定,也稱為 Wi-Fi 封包往返時間 (RTT), 室內定位

在搭載 Android 9 且硬體支援的裝置上,應用程式可使用 RTT API: 與附近支援 RTT 功能的 Wi-Fi 存取點 (AP) 之間的距離。裝置必須 已啟用定位服務,並且開啟 Wi-Fi 掃描功能 (位於下方) 設定 >位置),且應用程式必須具有 ACCESS_FINE_LOCATION敬上 權限。裝置不必連線到存取點即可使用即時文字訊息。 為維護隱私,只有手機能夠判斷距離 存取點;存取點就無法提供這項資訊。

如果裝置可測量距離 3 個以上存取點之間的距離,你可以使用 以便估算出最適合的裝置位置 測量資料測量結果通常在 1 到 2 公尺以內。

這樣您就能建構新的體驗,例如建構導航 和精細的適地性服務,例如消弭語音控制 (例如「打開這燈」) 和所在位置資訊 (例如 「這項產品有特價優惠嗎?」)。

前往 Android WifiRttScan 試用版應用程式。

若需更多資訊,請參閲 Wi-Fi 定位:範圍視即時文字訊息 (RTT)

支援螢幕凹口

顯示各種凹口大小的開發人員選項畫面

使用模擬器測試螢幕凹口

Android 9 支援最新無邊框螢幕 都含有攝影機和喇叭的螢幕凹口。 DisplayCutout敬上 類別可以幫助您找出非功能性區域的位置和形狀, 內容。為了判斷容器的存在和位置 請使用螢幕凹口區域 getDisplayCutout()敬上 方法。

新的視窗版面配置屬性 layoutInDisplayCutoutMode、 可讓你的應用程式根據裝置的凹口放置內容。您可以設定 將這個屬性轉換為下列任一值:

您可以在搭載 Android 9 的任何裝置或模擬器上模擬螢幕凹口 如下所示:

  1. 啟用開發人員選項
  2. 在「開發人員選項」畫面中,向下捲動至「繪圖」部分 然後選取「模擬有凹口的螢幕」
  3. 選取凹口大小。
,瞭解如何調查及移除這項存取權。

通知

Android 9 推出了幾項通知強化功能, 適用於目標 API 級別 28 以上的開發人員。

訊息通知

附加相片的 MessagingStyle。

訊息通知

包含回覆和對話的 MessagingStyle。

如需使用通知的程式碼範例 (包括 Android 9 功能),請參閱 人物 範例

進階通訊體驗

從 Android 7.0 (API 級別 24) 開始,您可以新增動作來回覆 或是在通知中直接輸入其他文字Android 9 強化功能 此功能具有下列強化項目:

  • 簡化對話參與者的支援功能: Person敬上 課程可用來識別對話中的使用者,包括 以及 URI其他許多 API,例如 addMessage()、 現在會使用 Person 類別,而不是 CharSequencePerson 類別 而且也支援建構工具設計模式

  • 支援圖片功能:Android 9 現在會在訊息通知中顯示圖片 應用程式。別擔心!您可以使用 setData()敬上 並顯示圖片下列程式碼片段示範 建立 Person 和包含圖片的訊息。

Kotlin

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

Java

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • 將回覆儲存為草稿:應用程式可擷取 EXTRA_REMOTE_INPUT_DRAFT敬上 會在使用者不小心關閉訊息通知時傳送。 您可以使用這個額外項目,在應用程式中預先填入文字欄位,方便使用者 完成回覆。

  • 辨識對話是否為群組對話:您可以使用 setGroupConversation()敬上 區分對話為群組或非群組對話。

  • 為意圖設定語意動作: setSemanticAction()敬上 方法可讓你為動作提供語意含義 「標示為已讀」「刪除」、「回覆」依此類推

  • SmartReply:Android 9 支援在您的 訊息應用程式使用 RemoteInput.setChoices()敬上 向使用者提供一組標準回應。

頻道設定、廣播和零打擾模式

Android 8.0 推出了「通知管道」。 可讓你建立 使用者自訂的管道。 Android 9 簡化了通知管道設定,包含以下變更:

多鏡頭支援和相機更新

在搭載 Android 9 的裝置上,你可以存取串流內容 同時從兩個以上的實體 相機。 在配備雙前置或雙後置鏡頭的裝置上,你可以建立 單台相機無法提供的創新功能,例如無縫整合的單機。 包括縮放、散景和立體視覺這個 API 也能讓您呼叫邏輯或融合 自動切換鏡頭串流功能。

相機功能的其他改善項目還包括額外的工作階段 參數 有助於減少初次拍攝時的延遲,而且表面分享功能 相機用戶端可處理各種使用情境,無需停止和啟動 攝影機串流影像另外,我們也新增適用於多媒體Flash 廣告的 API 支援團隊OIS 存取權 時間戳記 ,提升應用程式層級的圖片穩定度和特效。

在 Android 9 中,多鏡頭 API 支援單色相機 FULLLIMITED 功能。 單色輸出內容是透過 YUV_420_888 格式為 Y 的灰階,U (Cb) 為 128,V (Cr) 為 128。

Android 9 還支援外部 USB/UVC 開啟攝影機 支援的裝置。

適用於可繪項目和點陣圖的 ImageDecoder

Android 9 導入了 ImageDecoder敬上 類別,用於提供現代化的圖片解碼方法。使用此課程 而非 BitmapFactoryBitmapFactory.Options 相互整合

ImageDecoder 可讓你建立 Drawable 或 從位元組緩衝區、檔案擷取 Bitmap 或是 URI如要將圖片解碼,請先呼叫 createSource()敬上 改為已編碼圖片的來源。接著,呼叫 decodeDrawable()敬上 或 decodeBitmap() 方法是傳遞 ImageDecoder.Source 建立 Drawable 的物件 或 Bitmap。如要變更 預設設定,將 OnHeaderDecodedListener 傳遞給 decodeDrawable()decodeBitmap()ImageDecoder 次通話 onHeaderDecoded() 圖片的預設寬度和高度 (如果已知)。 如果編碼的圖片是 GIF 或 WebP,decodeDrawable() 會傳回 DrawableAnimatedImageDrawable敬上 類別

有多種方法可用來設定圖片屬性:

  • 如要將已解碼的圖片調整為特定大小,請將目標尺寸傳遞至 setTargetSize()。 您也可以使用樣本大小縮放圖片。將樣本大小直接傳遞至 setTargetSampleSize()
  • 如要在調整後的圖片範圍內裁剪圖片,請呼叫 setCrop()
  • 如要建立可變動的點陣圖,請將 true 傳遞至 setMutableRequired()

ImageDecoder 也能讓你為圖片加上自訂的複雜效果 例如圓角或 圓形遮罩。使用 setPostProcessor()敬上 以及 PostProcessor 類別來執行任何繪圖指令。

動畫

Android 9 導入了 AnimatedImageDrawable敬上 類別,用於繪圖及顯示 GIF 和 WebP 動畫圖片。 AnimatedImageDrawable 的運作方式類似於: AnimatedVectorDrawable 其中,轉譯執行緒會驅動 AnimatedImageDrawable 的動畫。 轉譯執行緒也會使用背景工作執行緒解碼,因此不會執行解碼。 幹擾轉譯執行緒的其他作業這種實作方式 應用程式會顯示動畫圖片,無需管理其更新,或 幹擾應用程式 UI 執行緒上的其他事件。

AnimatedImageDrawable 可使用 ImageDecoder。下列 程式碼片段說明如何使用 ImageDecoder 解碼 AnimatedImageDrawable

Kotlin

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

Java

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

ImageDecoder 提供多種方法,可讓您進一步修改圖片。 舉例來說,您可以使用 setPostProcessor()敬上 方法:修改圖片外觀,例如套用圓形遮罩或 圓角。

HDR VP9 影片、HEIF 圖片壓縮和 Media API

Android 9 內建支援高動態範圍 (HDR) VP9 Profile 2。 可讓您在 YouTube、Play 電影、 和其他來源。

Android 9 還支援使用「高效率圖片」編碼圖片 檔案格式 (HEIF 也就是 HEIC,可提高壓縮率並減少儲存空間和網路數據 。 MediaMuxer敬上 和 MediaExtractor 類別Android 9 裝置的平台支援 - 您可以輕鬆傳送與 才能從後端伺服器使用 HEIF 映像檔確認 應用程式支援這種資料分享和顯示格式,請試試 HEIF 做為應用程式中的圖片儲存格式執行 jpeg-to-heic 轉換 使用 ImageDecoderBitmapFactory (取得 從 JPEG 檔案擷取點陣圖)。接著您就能 輸入 HeifWriter 即可寫入 HEIF YUV 位元組緩衝區的靜態映像檔 SurfaceBitmap

你也可以從 AudioTrackAudioRecord、 和 MediaDrm 類別。

Android 9 推出了 MediaDRM 類別,用於取得指標、HDCP 等級、安全等級和工作階段數量,以及加強控管 安全等級及防止安全機制請參閱 API 差異 報告

在 Android 9 中,AAudio API 新增 支援多種其他 AAudioStream 屬性,包括用途、內容 「資料類型」和「輸入預設項目」使用這些屬性即可建立 特別適用於 VoIP 或攝錄影機應用程式。您也可以將工作階段 ID 設為 將 AAudio 串流與可能包含效果的子混音建立關聯。使用 AudioEffect API 來控制 效果。

Android 9 導入了 AudioEffect API: 動態處理。 利用這個課程,你可以建立以頻道為主的音效,包括 包括橫跨多個階段的等化、多頻壓縮及限制器。 您可以設定的頻帶數和活動階段數,而 即時控制

JobScheduler 中的資料費用機密程度

從 Android 9 開始,JobScheduler 可以使用貨運公司提供的網路狀態信號來改善處理流程 網路相關工作

工作可以宣告預估資料大小、發出預先擷取信號,以及指定 詳細的網路需求JobScheduler後,按照 以及網路狀態舉例來說,如果網路訊號目前壅塞, JobScheduler 可能會延遲大型網路要求。使用 非計量付費網路,JobScheduler 可對以下位置執行預先擷取工作: 透過預先擷取標題等方式改善使用者體驗。

新增工作時,請務必使用 setEstimatedNetworkBytes()setPrefetch()、 和setRequiredNetwork() 適時協助 JobScheduler 可正常運作。工作執行時 請務必使用 Network 物件 傳回者: JobParameters.getNetwork()。 否則將直接使用裝置的預設網路 可能不符合您的需求,因而導致意外使用資料。

Neural Networks API 1.1

Neural Networks API 導入 Android 8.1 (API 級別 27) 中,可加快裝置端機器學習的速度 Android。Android 9 擴充及改善 API,新增 支援九種全新作業:

已知問題:通過 ANEURALNETWORKS_TENSOR_QUANT8_ASYMM 提供給 ANEURALNETWORKS_PAD 以及 Android 9.0 以上版本支援此功能 NNAPI 的輸出內容可能會與高階機器的輸出內容不一致 學習架構 TensorFlow Lite。個人中心 應該只將 ANEURALNETWORKS_TENSOR_FLOAT32 直到問題解決為止

此外,這個 API 也會引進一個新函式 ANeuralNetworksModel_relaxComputationFloat32toFloat16()、 讓您指定是否要 ANEURALNETWORKS_TENSOR_FLOAT32 其範圍和精確度相當於 IEEE 754 16 位元浮點的範圍 格式。

自動填入架構

Android 9 推出了多項自動填入功能 以便在填寫時導入 表單。如要進一步瞭解如何在應用程式中使用自動填入功能,請參閱 自動填入架構指南。

安全性增強項目

Android 9 導入了多項安全防護功能, 以下各節摘要:

Android 保護確認

搭載 Android 9 以上版本的支援裝置可取得 可使用 Android 保護確認機制使用這項工作流程時 應用程式顯示提示,請使用者核准簡短的聲明。 此陳述式可讓應用程式再次確認使用者想完成 例如付款等機密交易

如果使用者接受聲明,Android KeyStore 就會收到並儲存 受金鑰雜湊訊息驗證保護的加密編譯簽章 驗證碼 (HMAC)。Android KeyStore 確認訊息有效後,您的應用程式 可以在信任節點中使用從 trustedConfirmationRequired 產生的金鑰 執行環境 (TEE) 簽署使用者已接受的訊息。 而且可信度非常高 且同意該聲明。

注意:Android 保護確認機制不會為使用者提供安全資訊管道。應用程式不得假設 除 Android 平台提供的保證外。於 請特別注意,請不要透過此工作流程 通常不會顯示在使用者的裝置上

如要瞭解如何新增 Android 保護確認機制的支援功能,請參閱 Android 保護 確認 指南。

統合生物特徵辨識驗證對話方塊

在 Android 9 中,系統會代表 這項功能可打造標準化的外觀、風格和位置 ,讓使用者更安心地驗證 信任的生物特徵辨識憑證檢查工具

如果應用程式使用 FingerprintManager敬上 如要向使用者顯示指紋驗證對話方塊,請切換為 BiometricPromptBiometricPrompt 依賴系統來顯示驗證資料 對話方塊並根據生物特徵辨識的類型改變自身的行為 驗證供使用者選擇的驗證方式

硬體安全性模組

搭載 Android 9 以上版本的支援裝置 具有 StrongBox Keymaster,這是 Keymaster HAL 的實作內容, 皆位於硬體安全性模組中模組包含以下內容:

  • 專屬 CPU。
  • 安全的儲存空間
  • 真正的隨機號碼產生器。
  • 防止套件遭到竄改和未經授權側載的其他機制 應用程式

檢查儲存在 StrongBox Keymaster 中的金鑰時,系統會確認 金鑰與受信任的執行環境 (TEE) 的完整性。

如要進一步瞭解如何使用 Strongbox Keymaster,請參閱硬體安全性 Module

將安全金鑰匯入 KeyStore

Android 9 新增了額外的金鑰解密安全性, 能夠使用 ASN.1 編碼金鑰格式。接著,Keymaster 會解密該資料集內的金鑰 由於 KeyStore,因此金鑰內容一律不會在裝置主機記憶體中顯示為明文。

進一步瞭解如何匯入加密金鑰

金鑰輪替的 APK 簽署配置

Android 9 現已支援 APK 簽名配置 v3。這項配置提供 在每個簽署區塊的簽署區塊中,加入輪替證明 憑證這項功能可讓您的應用程式以新的簽署方式簽署 將 APK 檔案過去的簽署憑證與 現在已簽署

進一步瞭解如何透過 apksigner

僅允許在解鎖的裝置上進行金鑰解密的選項

Android 9 推出了 unlockedDeviceRequired 標記。這個選項會決定 是否需要解鎖螢幕才能允許 KeyStore 使用指定的金鑰解密任何傳輸中或儲存的資料。這些類型 的金鑰最適合加密要儲存在磁碟上的機密資料,例如 健康或企業資料這個標記可讓使用者較保證 手機處於鎖定狀態時,無法解密資料 遭竊或遭竊

如要在裝置鎖定時保護金鑰免於解密,請啟用旗標 方法是將 true 傳遞至 setUnlockedDeviceRequired() 方法。完成這個步驟後,使用者的螢幕鎖定時, 嘗試使用這組金鑰解密或簽署資料失敗。鎖定的裝置需要 PIN 碼、密碼、指紋或其他信任的因素, 允許或拒絕要求

舊版加密支援

搭載 Keymaster 4 的 Android 9 裝置皆支援 Triple Data 「加密演算法」或「3DES」如果您的應用程式與舊版服務相容 如果是需要 3DES 的系統,請使用這類型的加密機制 私密憑證

如要進一步瞭解如何加強應用程式的安全性,請參閱 Android 的安全性 開發人員

淘汰 WPS

基於安全考量,Wi-Fi 保護設定 (WPS) 已淘汰。

Android 備份

Android 9 新增了相關功能和開發人員選項 就能備份及還原資料異動詳情如下: 專區。

用戶端加密備份

Android 9 現在支援使用 用戶端密鑰。在下列情況下,這項支援功能會自動啟用 條件相符:

啟用這項隱私保護措施後,系統就會停用裝置的 PIN 碼、解鎖圖案或密碼 才能從使用者裝置建立的備份還原資料。學習 如要進一步瞭解這項功能採用的技術,請參閱 Google Cloud Key Vault 服務白皮書。

定義備份所需的裝置條件

如果您的應用程式資料包含機密資訊或偏好設定,Android 9 可讓您定義 條件 應用程式資料會包含在使用者的備份中,例如用戶端位於 已啟用加密功能,或正在進行裝置之間的資料轉移。

想進一步瞭解如何備份 Android 裝置上的資料,請參閱這篇文章 備份總覽

無障礙設定

Android 9 導入了無障礙功能的強化項目 以便更輕鬆地為

導覽語意

在 Android 9 中新增的屬性可讓您更輕鬆定義 無障礙服務 (尤其是螢幕閱讀器) 可以在 畫面。這些屬性可協助視障使用者 快速切換應用程式 UI 中的文字 並讓使用者做出選擇

舉例來說,在購物應用程式中,螢幕閱讀器可協助使用者進行操作 直接跳到下一個交易類別, 不必使用螢幕閱讀器 必須先閱讀特定類別中的所有項目 才能繼續進行下一步

無障礙窗格標題

在 Android 8.1 (API 級別 27) 以下版本中,無障礙服務不一定每次 決定畫面特定窗格的更新時間,例如活動將某個片段取代為另一個片段的時間。窗格包含 邏輯群組,視覺相關的 UI 元素,通常構成 片段。

在 Android 9 中,您可以提供無障礙窗格標題,或個別提供 方便識別這些窗格的標題如果窗格有無障礙窗格標題, 窗格變更時,無障礙服務會收到更詳細的資訊。 這項功能可讓服務為使用者提供更精細的資訊 使用者介面的變更項目

如要指定窗格的標題,請使用 android:accessibilityPaneTitle敬上 屬性。您也可以更新 UI 窗格的標題,會取代為 setAccessibilityPaneTitle()。 舉例來說,您可以為 Fragment 物件。

以標題為基礎的導覽

如果應用程式顯示的文字內容包含邏輯標題,請設定 android:accessibilityHeading敬上 屬性設為 true View 代表這些標題。變更者: 新增這些標題,即可允許無障礙服務協助使用者瀏覽內容 直接從一個標題指向下一個標題所有無障礙服務都能使用這項功能 有能力提升使用者介面瀏覽體驗。

群組導覽和輸出

螢幕閱讀器通常採用 android:focusable 屬性 判斷何時應該 ViewGroup,或一組集合 View 物件,做為單一單位。如此一來 能讓使用者知道,觀看次數在邏輯上彼此相關。

在 Android 8.1 以下版本中,您需要標記View ViewGroup 為不可聚焦,而 ViewGroup 本身為可聚焦。這個 排列方式造成部分 View 例項遭標示為可聚焦 讓鍵盤導覽變得更加麻煩。

從 Android 9 開始,您可以使用 android:screenReaderFocusable敬上 屬性,而非 android:focusable 屬性 將 View 物件設為可聚焦物件會產生不良結果螢幕閱讀器 聚焦在已設定 android:screenReaderFocusable 的所有元素上 或 android:focusabletrue

便利動作

Android 9 新增支援功能,可代表使用者執行以下便利動作:

與工具提示的互動
在無障礙架構中新增功能,讓您可以存取 工具提示。使用 getTooltipText()敬上 讀取工具提示的文字,並使用 ACTION_SHOW_TOOLTIPACTION_HIDE_TOOLTIP 指示 View 例項顯示或 隱藏相關工具提示。
新增全域動作
Android 9 支援在 AccessibilityService 類別您的服務可協助使用者鎖定裝置及擷取螢幕畫面 方法是使用 GLOBAL_ACTION_LOCK_SCREEN敬上 和 GLOBAL_ACTION_TAKE_SCREENSHOT 動作。

視窗變更詳細資料

Android 9 可讓您在應用程式執行時輕鬆追蹤應用程式視窗的更新 同時重新繪製多個視窗如果 TYPE_WINDOWS_CHANGED敬上 事件發生時,請使用 getWindowChanges() 用來判斷視窗如何變化的 API。在多視窗模式更新期間,每個 視窗會產生一組專屬的事件。 getSource() 方法會傳回與每個事件關聯的視窗根層級檢視。

如果某個應用程式已為其定義無障礙窗格標題 View 物件,您的服務可以辨識 當應用程式的 UI 更新時。如果 TYPE_WINDOW_STATE_CHANGED敬上 因此請使用 getContentChangeTypes() 判斷視窗的變化方式舉例來說 會偵測窗格何時有新標題,或窗格何時消失。

旋轉

為避免無意間旋轉,我們新增了一個模式, 即使裝置位置改變也一樣。使用者可以觸發旋轉功能 手動操作。

在大多數情況下,應用程式的相容性影響程度最低。不過, 應用程式具有任何自訂旋轉行為,或使用任何不尋常的螢幕方向 設定時,可能會遇到先前未註意到的問題 使用者旋轉偏好設定一律設為直向。建議您多加利用 查看應用程式所有主要活動的旋轉行為,然後 確定所有螢幕方向設定都仍在提供 以獲得最佳體驗

如需詳細資訊,請參閱相關聯的行為說明 變更

旋轉行動裝置顯示新的旋轉模式,讓使用者手動觸發旋轉作業

新的旋轉模式可讓使用者視需要使用系統列中的按鈕,手動觸發旋轉動作。

文字

Android 9 為 平台:

  • 預先計算的文字: PrecomputedText 類別的成效增加 文字轉譯效能,可讓您運算及快取 資訊這也能讓應用程式執行文字版面配置 主執行緒。

  • 放大鏡:Magnifier 類別是 提供放大鏡 API 的平台小工具,讓 所有應用程式的放大鏡功能使用體驗。

  • Smart Linkify:Android 9 強化了 TextClassifier 類別, 這個模型利用機器學習技術識別所選文字中的部分實體 或建議動作舉例來說,TextClassifier 可讓應用程式偵測 使用者已選取電話號碼這樣一來,您的應用程式就會建議 使用者使用該號碼撥打電話。「TextClassifier」的功能 取代 Linkify 類別的功能。

  • 文字版面配置: 提供多種方便的方法和屬性, 實作使用者介面設計詳情請參閱 TextView

DEX 檔案的 ART 預先轉換

在搭載 Android 9 以上版本的裝置上,Android 執行階段 (ART) 預先編譯器,進一步對壓縮的 Dalvik 執行檔進行最佳化 ,方法是將應用程式套件中的 DEX 檔案轉換為 精簡呈現這項變更可讓應用程式更快啟動及使用 磁碟空間和 RAM 較少

這項改善措施特別適用於磁碟 I/O 速度較慢的低階裝置 速度。

裝置端系統追蹤

Android 9 可讓你在裝置上錄製系統追蹤記錄 並與開發團隊分享這些錄音檔的報表。這份報表 支援多種格式,包括 HTML。

收集這些追蹤記錄,即可擷取與您的應用程式相關的時間資料 程序和執行緒,以及查看其他類型的全球通用裝置 州。

如要進一步瞭解這項工具,請參閱「在裝置端執行系統」一文 追蹤記錄