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 ứ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.
Dưới đây là các tác vụ mà Zygote thực hiện:
Daemon init sẽ tạo quy trình Zygote khi hệ điều hành Android được khởi chạy. Trên một số hệ thống có kiến trúc kép, hai quy trình Zygote (64 bit và 32 bit) sẽ được tạo. Trang này chỉ đề cập đến các hệ thống có kiến trúc đơn.
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 đợi để tạo quy trình theo nhu cầu của ứng dụng. 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 quy trình ngay lập tức, hãy xem bài viết 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:
- Máy chủ hệ thống sử dụng một socket miền Unix để kết nối với một 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 để ứng dụng sử dụng bằng cách thay đổi mã nhận dạng (PID), cgroup và các thông tin khác của quy trình.
- Khi hoàn tất việc định cấu hình trước, USAP sẽ trả lời máy chủ hệ thống bằng PID.
- 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 nữa. Khi nhóm đạt đến một hoặc ít hơn USAP trong nhóm, Zygote sẽ bổ sung USAP mới vào nhóm.
Nếu Zygote tạo quy trình bằng cách sử dụng phương thức đánh giá trì hoãn:
- Máy chủ hệ thống nhận được một lệnh cho biết một ứng dụng cần một quy trình.
- Máy chủ hệ thống sử dụng một socket miền Unix để gửi lệnh đến Zygote thích hợp.
- Zygote phân nhánh quy trình và thay đổi PID, cgroup và các thông tin khác.
- Khi quy trình hoàn tất, quy trình đó sẽ gửi PID trở lại Zygote, sau đó Zygote sẽ 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 một trong những việc sau:
Đặt thuộc tính hệ thống
dalvik.vm.usap_pool_enabledthànhtruetrong/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 được 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ố 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 đề này.
Từ chối SELinux hoặc Lỗi đầu vào/đầu ra
Zygote đặc biệt chú trọng đến việc vệ sinh chỉ số mô tả tệp trên các ranh giới quy trình. Khi bộ mô tả tệp có mặt tại thời điểm phân nhánh nhưng không có trong danh sách cho phép, chúng tôi sẽ sử dụng lệnh gọi hệ thống dup đến /dev/null để ngăn việc vô tình sử dụng bộ mô tả tệp được 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 đang nhận được thông báo từ chối SELinux hoặc lỗi đầu vào/đầu ra:
Đối với bộ mô tả tệp không có tên, hãy đưa bộ mô tả tệp vào vectơ
fds_to_ignorekhiRestatđược gọi.Đối với bộ mô tả tệp có tên:
- Chỉnh sửa
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp. - Thêm đường dẫn vào danh sách cho phép đối với các tệp đang mở.
- Chỉnh sửa