Giới thiệu về các quy trình của Zygote

Zygote là một quy trình trong hệ điều hành Android đóng vai trò là gốc của tất cả các quy trình hệ thống và ứng dụng có cùng giao diện nhị phân của ứng dụng (ABI).

Trên các thiết bị hiện đại, chẳng hạn như Pixel 7 trở lên, có một quy trình Zygote 64 bit. Ngoài ra, còn có WebView Zygote cho ABI chính, đây là một Zygote chuyên biệt chứa các thư viện và tài nguyên dành riêng cho các quy trình chạy WebView.

Sau đây là các tác vụ mà Zygote thực hiện:

  1. Trình nền init tạo ra quy trình Zygote khi hệ điều hành Android được khởi chạy. Trên một số hệ thống kiến trúc kép, hai quy trình Zygote (64 bit và 32 bit) được tạo. Trang này chỉ đề cập đến các hệ thống kiến trúc đơn.

  2. Zygote có thể tạo ngay các quy trình được gọi là quy trình ứng dụng không chuyên biệt (USAP) hoặc chờ tạo các quy trình khi ứng dụng cần. Bạn phải bật tuỳ chọn trước đó thông qua một thuộc tính hệ thống hoặc lệnh cầu gỡ lỗi Android. Để biết thêm thông tin về cách định cấu hình Zygote để tạo các quy trình ngay lập tức, hãy xem phần Bật nhóm quy trình ứng dụng không chuyên biệt .

    • Nếu nhóm USAP được bật trên thiết bị của bạn:

      1. Máy chủ hệ thống sử dụng ổ cắm miền Unix để kết nối với USAP có sẵn từ một nhóm. Máy chủ hệ thống yêu cầu USAP được định cấu hình trước để sử dụng ứng dụng bằng cách thay đổi mã nhận dạng (PID), cgroup và thông tin khác của quy trình.
      2. Khi hoàn tất quá trình định cấu hình trước, USAP sẽ phản hồi máy chủ hệ thống bằng PID.
      3. Khi một ứng dụng chiếm một trong các USAP này, USAP đó sẽ không còn thuộc nhóm. Khi nhóm đạt đến một hoặc ít USAP hơn trong nhóm, Zygote sẽ bổ sung USAP mới vào nhóm.
    • Nếu Zygote của bạn tạo các quy trình bằng cách sử dụng tính năng đánh giá lười:

      1. Máy chủ hệ thống nhận được lệnh rằng một ứng dụng cần một quy trình.
      2. Máy chủ hệ thống sử dụng ổ cắm miền Unix để gửi lệnh đến Zygote thích hợp.
      3. Zygote phân nhánh quy trình và thay đổi PID, cgroup cũng như các thông tin khác.
      4. Khi hoàn tất, quá trình này sẽ gửi PID trở lại Zygote, sau đó chuyển PID trở lại máy chủ hệ thống.

Bật nhóm USAP

Để bật tính năng sử dụng nhóm USAP, hãy làm theo một trong những cách sau:

  • Đặt thuộc tính hệ thống dalvik.vm.usap_pool_enabled thành true trong /build/make/target/product/runtime_libart.mk.

  • Chạy lệnh sau:

    adb shell am broadcast -a \"com.google.android.gms.phenotype.FLAG_OVERRIDE\" --es package \"com.google.android.platform.runtime_native\" --es user \"\*\" --esa flags \"usap_pool_enabled\" --esa values \"true\" --esa types \"string\" com.google.android.gms
    

Khi tính năng này được bật, mỗi Zygote sẽ duy trì một nhóm các quy trình phân nhánh thực hiện các phần độc lập với ứng dụng của quy trình khởi động ứng dụng.

Khắc phục sự cố với Zygote

Phần này chứa các giải pháp cho các vấn đề liên quan đến Zygote.

Zygote đang gặp sự cố

Nếu thiết bị của bạn không khởi động lại đúng cách và nhật ký hoặc báo cáo sự cố cho thấy các vấn đề với Zygote, thì có thể là do bạn đã thực hiện một thay đổi gần đây khiến initd hoặc máy chủ hệ thống gặp sự cố. Việc sửa mã sẽ khắc phục được vấn đề.

Lỗi từ chối SELinux hoặc lỗi IO

Zygote đặc biệt quan tâm đến việc vệ sinh chỉ số mô tả tệp trên các ranh giới quy trình. Khi chỉ số mô tả tệp xuất hiện tại thời điểm phát triển nhánh nhưng không nằm trong danh sách cho phép, chúng tôi sử dụng lệnh gọi hệ thống dup đến /dev/null để ngăn hành vi vô tình sử dụng nội dung mô tả tệp đã lưu vào bộ nhớ đệm để truy cập vào các tệp mới mở.

Nếu bạn đang thực hiện các thay đổi về khung bao gồm việc cố gắng tải tài nguyên vào Zygote và bạn nhận được lỗi từ chối SELinux hoặc lỗi IO:

  • Đối với chỉ số mô tả tệp chưa được đặt tên, hãy đưa chỉ số mô tả tệp vào vectơ fds_to_ignore khi gọi Restat.

  • Đối với chỉ số mô tả tệp được đặt tên:

    1. Chỉnh sửa WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp.
    2. Thêm đường dẫn vào danh sách cho phép cho các tệp đang mở.