Zygote là một quy trình trong hệ điều hành Android, đóng vai trò là gốc của mọi 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:
Trình nền init tạo ra quy trình Zygote khi hệ điều hành Android được khởi tạo. 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ó cấu 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 chờ tạo các quy trình khi cần thiết cho các ứng dụng. Bạn phải bật lựa 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 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:
- 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 trong 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 quá trình định cấu hình trước USAP hoàn tất, 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 những USAP này, USAP đó sẽ không còn nằm trong nhóm nữa. Khi nhóm đạt đến một hoặc ít USAP hơn, Zygote sẽ bổ sung USAP mới vào nhóm.
Nếu Zygote của bạn tạo ra các quy trình bằng cách sử dụng đánh giá trì hoãn:
- Máy chủ hệ thống nhận được lệnh cho biết một ứng dụng cần có 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 cũng như các thông tin khác.
- Khi quá trình này hoàn tất, nó 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
Để cho phép 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_enabled
thànhtrue
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\&qu
ot; --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 đề.
SELinux từ chối hoặc Lỗi đầu vào/đầu ra
Zygote đặc biệt quan tâm đến tính hợp lệ của bộ mô tả tệp trên các ranh giới quy trình. Khi có các bộ mô tả tệp 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
để /dev/null
nhằm ngăn các bộ mô tả tệp được lưu vào bộ nhớ đệm vô tình được dùng để 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 cả việc cố gắng tải tài nguyên vào Zygote và bạn nhận được thông báo từ chối SELinux hoặc lỗi IO:
Đối với các bộ mô tả tệp chưa được đặt tên, hãy thêm các bộ mô tả tệp vào vectơ
fds_to_ignore
khiRestat
đượ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 mở.
- Chỉnh sửa