NGHỆ THUẬT 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 thời gian chạy nhất định và cho phép trình phân tích hồ sơ và trình gỡ lỗi tác động đến hành vi thời gian chạy của ứng dụng. Điều này có thể được sử dụng để triển khai các công cụ hiệu suất tiên tiến đượ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 bộ thời gian chạy được hiển thị với các tác nhân đã được tải vào quy trình thời gian chạy. Chúng giao tiếp với ART thông qua các cuộc gọi và gọi lại trực tiếp. Thời gian chạy hỗ trợ nhiều tác nhân để có thể tách biệt các mối quan tâm về hồ sơ trực giao khác nhau. Các tác nhân có thể được cung cấp khi bắt đầu thời gian chạy (khi dalvikvm hoặc app_process được gọi) hoặc được gắn vào một quy trình đang chạy.

Vì khả năng thiết lập và sửa đổi hành vi của ứng dụng cũng như 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:

  • Đầu tiên, mã hiển thị giao diện tác nhân, JVMTI, được triển khai dưới dạng plugin thời gian chạy chứ không phải thành phần cốt lõi của thời gian chạy. Việc tải plugin có thể bị hạn chế, do đó 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 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 các nhà phát triển của họ đăng nhập để phân tích và cung cấp công cụ, đồ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 các ứng dụng có thể gỡ lỗi. Điều này đảm bảo 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ể bị điều khiển hoặc điều khiển.

Thiết kế

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

Flow and interconnection in an instrumented app
Hình 1. Luồng và kết nối của một ứng dụng được trang bị thiết bị

Plugin ART libopenjdkjvmti hiển thị ART TI, được thiết kế để đáp ứng nhu cầu và hạn chế 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.
  • API ngôn ngữ Java dành cho thiết bị đo đạc và xác định lại không được hiển thị.

ART TI cũng hỗ trợ trình biên dịch 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ả plugin 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 nhớ rằng thời gian chạy được khởi động theo cách thủ công cho phép sửa đổi hoàn toàn mà không cần cá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 được 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 hợp tử đã chạy và quy trình hợp tử 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 đang chạy, hãy sử dụng lệnh này:

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

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

Một tác nhân chỉ có thể được gắ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 kiểm tra trước khi cho phép đính kèm một tác nhân. Lớp Trình quản lý hoạt động kiểm tra thông tin ứng dụng hiện tại (được lấy từ dữ liệu của lớp Trình quản lý gói ) để 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 của ứng dụng đó, trạng thái này được đặt khi ứng dụng được khởi động.

Địa điểm đại lý

Thời gian chạy cần tải 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 nó. Bản thân ART là bất khả tri về vị trí cụ thể mà tác nhân đến. Chuỗi được sử dụng cho cuộc gọi dlopen . Quyền của 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ể được chạy bởi một ứng dụng có thể sửa lỗi, hãy làm như sau:

  • Nhúng tác nhân vào thư mục thư viện của 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 {

API Android khác

Lệnh đính kèm tác nhân được hiển thị công khai. Lệnh này gắn một tác nhân JVMTI vào một tiến 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.

JVMTI

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

  • Định nghĩa lại một lớp
  • Theo dõi phân bổ đối tượng và thu gom rác.
  • Lặp lại tất cả các đối tượng trong một đống, theo cây tham chiếu của các đối tượng.
  • Kiểm tra ngăn xếp cuộc gọi Java.
  • Đình chỉ (và tiếp tục) tất cả các chủ đề.

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

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ỉ khả dụng trên Android 8.0 trở lên. Nhà sản xuất thiết bị không cần thực hiện bất kỳ thay đổi nào để triển khai tính năng này. Đó là một phần của AOSP.

Thẩm định

CTS kiểm tra những điều sau trên Android 8 trở lên:

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

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