ART TI

Trong Android 8.0 trở lên, Giao diện công cụ ART (ART TI) hiển thị một số nội dung nội bộ nhất định trong thời gian chạy, đồng thời cho phép trình phân tích tài nguyên và trình gỡ lỗi ảnh hưởng đến hành vi trong thời gian chạy của ứng dụng. Bạn có thể sử dụng tính năng này để triển khai các công cụ hiệu suất hiện đại được cung cấp để triển khai các tác nhân gốc trên các nền tảng khác.

Nội dung nội bộ của thời gian chạy được hiển thị cho các tác nhân đã được tải vào quy trình thời gian chạy. Các lớp này giao tiếp với ART thông qua lệnh gọi trực tiếp và lệnh gọi lại. Môi trường thời gian chạy hỗ trợ nhiều tác nhân để có thể tách biệt các vấn đề về lập hồ sơ vuông góc. Các tác nhân có thể được cung cấp khi bắt đầu thời gian chạy (khi gọi dalvikvm hoặc app_process) hoặc được đính kèm vào một quy trình đang chạy.

Vì khả năng đo lường và sửa đổi hành vi của ứng dụng và thời gian chạy rất mạnh mẽ, nên hai biện pháp an toàn đã được tích hợp vào ART TI:

  • Thứ nhất, mã hiển thị giao diện tác nhân, JVMTI, được triển khai dưới dạng trình bổ trợ thời gian chạy, chứ không phải là thành phần cốt lõi của thời gian chạy. Việc tải trình bổ trợ có thể bị hạn chế để các tác nhân có thể bị chặn tìm thấy bất kỳ điểm giao diện nào.
  • Thứ hai, cả lớp ActivityManager và quy trình thời gian chạy chỉ cho phép các tác nhân đính kèm vào các ứng dụng có thể gỡ lỗi. Ứng dụng có thể gỡ lỗi đã được nhà phát triển phê duyệt để phân tích và đo lường, đồng thời không được phân phối cho người dùng cuối. Cửa hàng Google Play không cho phép phân phối ứng dụng có thể gỡ lỗi. Điều này đảm bảo rằng các ứng dụng thông thường (bao gồm cả các thành phần cốt lõi) không thể được đo lường hoặc thao túng.

Thiết kế

Quy trình chung và mối liên kết trong một ứng dụng được đo lường được hiển thị trong Hình 1.

Quy trình và mối liên kết trong một ứng dụng được đo lường
Hình 1. Quy trình và liên kết của một ứng dụng được đo lường

Trình bổ trợ ART libopenjdkjvmti hiển thị ART TI, được thiết kế để đáp ứng nhu cầu và các quy tắc ràng buộc của nền tảng:

  • Việc xác định lại lớp dựa trên các tệp Dex, chỉ chứa một định nghĩa lớp duy nhất thay vì các tệp lớp.
  • Các API ngôn ngữ Java để đo lường và xác định lại không được hiển thị.

ART TI cũng hỗ trợ các trình phân tích tài nguyên của Android Studio.

Tải hoặc đính kèm một tác nhân

Để đính kèm một tác nhân khi khởi động thời gian chạy, hãy sử dụng lệnh này để tải cả trình bổ trợ JVMTI và tác nhân đã cho:

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

Không có biện pháp an toàn nào được áp dụng khi một tác nhân được tải khi khởi động thời gian chạy. Vì vậy, hãy lưu ý rằng thời gian chạy được khởi động theo cách thủ công cho phép sửa đổi đầy đủ mà không cần biện pháp an toàn. (Điều này cho phép kiểm thử ART.)

Lưu ý: Điều này không áp dụng cho các ứng dụng thông thường (bao gồm cả máy chủ hệ thống) trên thiết bị. Các ứng dụng được phân nhánh từ một zygote đang chạy và quy trình zygote không được phép tải các tác nhân.

Để đính kèm một tác nhân vào một ứng dụng đang chạy, hãy sử dụng lệnh sau:

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

Nếu trình bổ trợ JVMTI chưa được tải, thì việc đính kèm một tác nhân sẽ tải cả trình bổ trợ và thư viện tác nhân.

Bạn chỉ có thể đính kèm một tác nhân vào một ứng dụng đang chạy được đánh dấu là có thể gỡ lỗi (một phần của tệp kê khai của ứng dụng, với thuộc tính android:debuggable được đặt thành true trên nút ứng dụng). Cả lớp ActivityManager và ART đều thực hiện các bước kiểm tra trước khi cho phép đính kèm một tác nhân. Lớp ActivityManager kiểm tra thông tin ứng dụng hiện tại (có nguồn gốc từ dữ liệu lớp PackageManager) để biết trạng thái có thể gỡ lỗi và thời gian chạy kiểm tra trạng thái hiện tại của ứng dụng, trạng thái này được đặt khi ứng dụng khởi động.

Vị trí của nhân viên hỗ trợ

Môi trường thời gian chạy cần tải các tác nhân vào quy trình hiện tại để tác nhân có thể liên kết trực tiếp và giao tiếp với quy trình đó. Bản thân ART không phân biệt vị trí cụ thể mà tác nhân đến từ đó. Chuỗi này được dùng cho lệnh gọi dlopen. Quyền hệ thống tệp và chính sách SELinux hạn chế việc tải thực tế.

Để phân phối các tác nhân có thể chạy bằng ứng dụng có thể gỡ lỗi, hãy làm như sau:

  • Nhúng tác nhân vào thư mục thư viện của tệp APK của ứng dụng.
  • Sử dụng run-as để sao chép tác nhân vào thư mục dữ liệu của ứng dụng.

API

Phương thức sau đã được thêm vào 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 {

Các API Android khác

Lệnh đính kèm tác nhân hiển thị công khai. Lệnh này đính kèm một tác nhân JVMTI vào một quy trình đang chạy:

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;\''

Các lệnh am start -Pam start-profiler/stop-profiler tương tự như lệnh đính kèm tác nhân.

JVMTI

Tính năng này hiển thị API JVMTI cho các tác nhân (mã gốc). Các tính năng quan trọng bao gồm:

  • Xác định lại một lớp.
  • Theo dõi hoạt động phân bổ đối tượng và thu gom rác.
  • Lặp lại trên tất cả các đối tượng trong một vùng nhớ khối xếp, theo cây tham chiếu của các đối tượng.
  • Kiểm tra ngăn xếp lệnh gọi Java.
  • Tạm ngưng (và tiếp tục) tất cả luồng.

Các phiên bản Android có thể có các chức năng khác nhau.

Khả năng tương thích

Tính năng này cần có tính năng hỗ trợ thời gian chạy cốt lõi chỉ có trên Android 8.0 trở lên. Nhà sản xuất thiết bị không cần thực hiện thay đổi nào để triển khai tính năng này. Đây là một phần của AOSP.

Xác nhận kết quả

CTS kiểm thử những nội dung sau trên Android 8 trở lên:

  • Kiểm thử để đảm bảo rằng các tác nhân đính kèm vào các ứng dụng có thể gỡ lỗi và không đính kèm vào các ứng dụng không thể gỡ lỗi.
  • Kiểm thử tất cả API JVMTI đã triển khai
  • Kiểm thử để đảm bảo giao diện nhị phân cho các tác nhân ổn định

Chúng tôi đã thêm các thử nghiệm bổ sung vào Android 9 trở lên và đưa vào các thử nghiệm CTS cho các bản phát hành đó.