ART TI

在 Android 8.0 以上版本中,ART 工具介面 (ART TI) 並允許分析器和偵錯工具影響 應用程式的執行階段行為這可用來 為導入 AI 而提供的先進效能工具 原生代理程式

執行階段內部會提供給已載入執行階段程序的代理程式。 這些物件會透過直接呼叫和回呼與 ART 通訊。執行階段 可支援多個代理程式,以便針對不同的解釋問題, 分隔。代理程式可在執行階段啟動時提供 (即 叫用 dalvikvmapp_process) 或附加至 就是正在執行的程序

由於能夠檢測及修改應用程式和執行階段行為, ART TI 都整合了兩項安全措施:

  • 首先,公開代理程式介面 JVMTI 的程式碼會實作為 執行階段外掛程式,而非執行階段的核心元件。外掛程式載入作業可能是 禁止服務專員找到任何介面 點。
  • 其次,ActivityManager 類別和執行階段程序都只允許代理程式 附加至可進行偵錯的應用程式。可進行偵錯的應用程式已登出 提供給開發人員進行分析和檢測,但不會向開發人員 而非使用者Google Play 商店不允許發布可進行偵錯 應用程式。這可確保將一般應用程式 (包括核心元件) 無法 受檢測或操弄。

設計

檢測應用程式顯示一般流程和互連網路 圖 1.

檢測應用程式的流程和互連
圖 1. 流程和 檢測應用程式相互連線

ART 外掛程式 libopenjdkjvmti 會顯示 ART TI, 以因應平台的需求和限制:

  • 類別重新定義以 Dex 檔案為基礎,其中僅包含 單一類別定義,而非類別檔案。
  • 用於檢測和重新定義的 Java 語言 API 未 暴露在風險中。

ART TI 還支援 Android Studio 分析器。

載入或附加代理程式

如要在執行階段啟動代理程式,請使用這個指令,載入 JVMTI 外掛程式和指定的代理程式:

dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …

在執行階段載入代理程式時,目前沒有安全措施 請注意,手動啟動的執行階段允許 未採用安全防護措施的修改內容(允許 ART 測試)。

注意:這項規定不適用於一般應用程式 (包括系統應用程式) 伺服器)。應用程式會從已經執行的 zygote 分支 而且開發人員不得載入代理程式

如要將代理程式附加至已在執行中的應用程式,請使用 指令:

adb shell cmd activity attach-agent [process]
/path/to/agent/libagent.so[=agent-options]

如果尚未載入 JVMTI 外掛程式,附加代理程式會同時載入 外掛程式和代理程式程式庫

代理程式只能附加至下列應用程式的執行中應用程式: 可進行偵錯 (應用程式資訊清單的一部分,具有屬性) 已將應用程式的「android:debuggable」設為「true」 節點)。ActivityManager 類別和 ART 執行的工作 再允許附加代理程式。ActivityManager 類別會檢查目前的應用程式資訊 (衍生自 PackageManager 類別資料),然後執行階段會檢查其目前狀態。 是在應用程式啟動時設定的

服務專員位置

執行階段必須將代理程式載入目前的程序,這樣代理程式 可以直接繫結至資料庫及通訊ART 本身不適用 服務專員的具體位置字串會使用 接聽 dlopen 呼叫。檔案系統權限和 SELinux 政策 限制實際載入

如要提供可由偵錯應用程式執行的代理程式,請執行下列操作:

  • 將代理程式嵌入應用程式 APK 的程式庫目錄。
  • 使用 run-as 將代理程式複製到應用程式的資料 目錄。

API

下列方法已新增至 android.os.Debug

/**
     * Attach a library as a jvmti agent to the current runtime, with the given classloader
     * determining the library search path.
     * Note: agents may only be attached to debuggable apps. Otherwise, this function will
     * throw a SecurityException.
     *
     * @param library the library containing the agent.
     * @param options the options passed to the agent.
     * @param classLoader the classloader determining the library search path.
     *
     * @throws IOException if the agent could not be attached.
     * @throws a SecurityException if the app is not debuggable.
     */
    public static void attachJvmtiAgent(@NonNull String library, @Nullable String options,
            @Nullable ClassLoader classLoader) throws IOException {

其他 Android API

Attach-agent 指令會公開顯示。這個指令會附加 JVMTI 新增至執行中程序:

adb shell 'am attach-agent com.example.android.displayingbitmaps
\'/data/data/com.example.android.displayingbitmaps/code_cache/libfieldnulls.so=Ljava/lang/Class;.name:Ljava/lang/String;\''

am start -Pam start-profiler/stop-profiler 指令類似於 Attach-agent 指令。

JVMTI

這項功能會將 JVMTI API 提供給代理程式 (原生程式碼)。重點是 功能包括:

  • 重新定義類別。
  • 追蹤物件配置與垃圾收集。
  • 按照 如需儲存大量結構化物件 建議使用 Cloud Bigtable
  • 檢查 Java 呼叫堆疊。
  • 暫停 (及繼續) 所有執行緒。

可以透過 Google Cloud 代管的不同版本 Android。

相容性

這項功能需要核心執行階段支援 (僅適用於 Android 8.0 版)。 以及更高版本裝置製造商不需要進行任何變更即可導入 這項功能是 Android 開放原始碼計畫的一部分。

驗證

CTS 在 Android 8 以上版本中測試下列項目:

  • 代理程式附加至可進行偵錯的應用程式,無法附加至應用程式的測試 不可進行偵錯的應用程式。
  • 測試所有已實作的 JVMTI API
  • 測試代理程式的二進位檔介面是否穩定

已針對 Android 9 以上版本新增其他測試,並已納入測試中 。