在 Android 8.0 以上版本中,ART 工具介面 (ART TI) 並允許分析器和偵錯工具影響 應用程式的執行階段行為這可用來 為導入 AI 而提供的先進效能工具 原生代理程式
執行階段內部會提供給已載入執行階段程序的代理程式。
這些物件會透過直接呼叫和回呼與 ART 通訊。執行階段
可支援多個代理程式,以便針對不同的解釋問題,
分隔。代理程式可在執行階段啟動時提供 (即
叫用 dalvikvm
或 app_process
) 或附加至
就是正在執行的程序
由於能夠檢測及修改應用程式和執行階段行為, ART TI 都整合了兩項安全措施:
- 首先,公開代理程式介面 JVMTI 的程式碼會實作為 執行階段外掛程式,而非執行階段的核心元件。外掛程式載入作業可能是 禁止服務專員找到任何介面 點。
- 其次,
ActivityManager
類別和執行階段程序都只允許代理程式 附加至可進行偵錯的應用程式。可進行偵錯的應用程式已登出 提供給開發人員進行分析和檢測,但不會向開發人員 而非使用者Google Play 商店不允許發布可進行偵錯 應用程式。這可確保將一般應用程式 (包括核心元件) 無法 受檢測或操弄。
設計
檢測應用程式顯示一般流程和互連網路 圖 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 -P
和 am
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 以上版本新增其他測試,並已納入測試中 。