ART TI

Trong Android 8.0 trở lên, Giao diện công cụ ART (ART TI) cho thấy một số nội bộ 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 tác động đến hành vi trong thời gian chạy của ứng dụng. Có thể dùng công cụ này để triển khai các công cụ hiệu suất tiên tiến được cung cấp để triển khai tác nhân gốc trên các nền tảng khác.

Nội bộ trong thời gian chạy tiếp xúc với các tác nhân đã được tải vào quy trình thời gian chạy. Các đối tượng này giao tiếp với ART thông qua các lệnh gọi và lệnh gọi lại trực tiếp. Môi trường thời gian chạy hỗ trợ nhiều tác nhân để những mối lo ngại khác nhau trong việc lập hồ sơ trực giao được tách riêng. Nhân viên hỗ trợ có thể được cung cấp khi bắt đầu thời gian chạy (khi dalvikvm hoặc app_process sẽ được gọi) hoặc được đính kèm với một quy trình đang chạy.

Bởi 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 là rất mạnh mẽ, hai biện pháp an toàn đã được tích hợp vào ART TI:

  • Đầu tiên, mã hiển thị giao diện tác nhân, JVMTI, được triển khai dưới dạng một trình bổ trợ thời gian chạy, không phải là thành phần chính của thời gian chạy. Trình bổ trợ có thể đang tải để các tác nhân có thể bị chặn tìm thấy bất kỳ giao diện nào .
  • Thứ hai, cả lớp ActivityManager và quy trình thời gian chạy đều 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. Các ứng dụng có thể gỡ lỗi đã được đăng xuất để nhà phát triển 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 của chúng tô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 được được đo lường hoặc thao túng.

Thiết kế

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

Luồng và sự kết nối trong một ứng dụng được đo lường
Hình 1. Quy trình và khả năng kết nối 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 các nhu cầu và hạn chế của nền tảng:

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

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

Tải hoặc đính kèm một nhân viên hỗ trợ

Để đính kèm một tác nhân khi khởi động trong 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 …

Chưa có biện pháp an toàn nào được áp dụng khi một tác nhân được tải trong thời gian chạy khởi động, do đó, hãy lưu ý rằng môi trường thời gian chạy được khởi động theo cách thủ công sẽ cho phép sửa đổi mà không có biện pháp an toàn. (Điều này cho phép thử nghiệm 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ả hệ thống) máy chủ) trên một thiết bị. Ứng dụng được phát triển từ một zygote đã chạy, và quy trình zygote không được phép tải tác nhân.

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

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, việc đính kèm một tác nhân sẽ tải cả hai trình bổ trợ và thư viện tác nhân.

Chỉ có thể đính kèm tác nhân người dùng 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, có thuộc tính) Đã đặt android:debuggable thành true trên ứng dụng nút). Cả lớp ActivityManager và ART đều hoạt động trước khi cho phép đính kèm nhân viên hỗ trợ. ActivityManager lớp kiểm tra thông tin ứng dụng hiện tại (lấy từ PackageManager dữ liệu lớp) để biết trạng thái có thể gỡ lỗi và thời gian chạy sẽ kiểm tra trạng thái hiện tại, giá trị này được đặt khi khởi động ứng dụ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 và giao tiếp trực tiếp với công cụ đó. ART có tính độc lập về địa điểm cụ thể nơi nhân viên hỗ trợ đến. Chuỗi này được sử dụng cho cuộc gọi dlopen. Quyền hệ thống tệp và chính sách SELinux hạn chế tải thực tế.

Để phân phối các tác nhân có thể chạy bằng một ứ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 trong tệp APK của ứng dụng.
  • Sử dụng run-as để sao chép tác nhân vào dữ liệu của ứng dụng thư mục.

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 khác của Android

Lệnh đính kèm được hiển thị công khai. Lệnh này đính kèm một JVMTI tác nhân cho 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 Attach-agent.

Máy ảo JVMTI

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

  • Đang 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 tất cả đối tượng trong một vùng nhớ khối xếp, theo cây tham chiếu của .
  • Kiểm tra ngăn xếp lệnh gọi Java.
  • Đang tạm ngưng (và tiếp tục) tất cả các chuỗi trò chuyện.

Các khả năng khác nhau có thể có sẵn trên các phiên bản khác nhau của Android.

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

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

Xác nhận kết quả

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

  • Các chương trình kiểm thử mà tác nhân đính kèm vào ứng dụng có thể gỡ lỗi nhưng không đính kèm được vào ứ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 rằng giao diện nhị phân dành cho tác nhân là ổn định

Các thử nghiệm bổ sung đã được thêm vào Android 9 trở lên, đi kèm trong các thử nghiệm CTS cho những bản phát hành đó.