Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Sử dụng Binder IPC

Trang này mô tả các thay đổi đối với trình điều khiển chất kết dính trong Android 8, cung cấp thông tin chi tiết về cách sử dụng IPC chất kết dính và liệt kê chính sách SELinux bắt buộc.

Các thay đổi đối với trình điều khiển chất kết dính

Bắt đầu từ Android 8, khung Android và HAL hiện giao tiếp với nhau bằng chất kết dính. Khi giao tiếp này tăng đáng kể lưu lượng truy cập chất kết dính, Android 8 bao gồm một số cải tiến được thiết kế để giữ cho IPC kết dính nhanh chóng. SoC các nhà cung cấp và các OEM nên nhập trực tiếp từ các ngành có liên quan của android-4.4, android-4.9 và cao hơn của kernel / chung của dự án.

Nhiều miền liên kết (ngữ cảnh)

Phổ biến-4.4 trở lên, bao gồm ngược dòng

Để chia sạch lưu lượng chất kết dính giữa khuôn khổ (thiết bị độc lập) và nhà cung cấp (điện thoại cụ thể) mã, Android 8 giới thiệu các khái niệm về một bối cảnh chất kết dính. Mỗi ngữ cảnh kết dính có nút thiết bị riêng và trình quản lý ngữ cảnh (dịch vụ) riêng. Bạn chỉ có thể truy cập trình quản lý ngữ cảnh thông qua nút thiết bị mà nó thuộc về và khi chuyển một nút liên kết qua một ngữ cảnh nhất định, nó chỉ có thể truy cập từ cùng ngữ cảnh đó bằng một quy trình khác, do đó hoàn toàn cách ly các miền với nhau. Để biết chi tiết về việc sử dụng, xem vndbindervndservicemanager .

Thu thập phân tán

Phổ biến-4.4 trở lên, bao gồm ngược dòng

Trong các bản phát hành trước của Android, mọi phần dữ liệu trong lệnh gọi liên kết được sao chép ba lần:

  • Một lần để serialize nó thành một Parcel trong quá trình gọi
  • Khi trong trình điều khiển hạt nhân để sao chép các Parcel đến quá trình mục tiêu
  • Một lần để unserialize Parcel trong quá trình mục tiêu

Android 8 sử dụng phân tán tập trung tối ưu hóa để giảm số lượng các bản sao từ 3 đến 1. Thay vì serializing dữ liệu trong một Parcel đầu tiên, dữ liệu còn lại trong cấu trúc và bộ nhớ bố trí ban đầu của nó và người lái xe ngay lập tức sao chép nó vào quá trình mục tiêu. Sau khi dữ liệu ở trong tiến trình đích, cấu trúc và cách bố trí bộ nhớ giống nhau và dữ liệu có thể được đọc mà không yêu cầu bản sao khác.

Khóa hạt mịn

Phổ biến-4.4 trở lên, bao gồm ngược dòng

Trong các bản phát hành Android trước, trình điều khiển chất kết dính sử dụng khóa toàn cầu để bảo vệ chống lại việc truy cập đồng thời vào các cấu trúc dữ liệu quan trọng. Mặc dù có sự tranh cãi tối thiểu về khóa, nhưng vấn đề chính là nếu một luồng có mức độ ưu tiên thấp nhận được khóa và sau đó được ưu tiên trước, nó có thể làm trì hoãn nghiêm trọng các luồng có mức độ ưu tiên cao hơn cần có được cùng một khóa. Điều này gây ra sự cố trong nền tảng.

Những nỗ lực ban đầu để giải quyết vấn đề này liên quan đến việc vô hiệu hóa quyền ưu tiên trong khi giữ khóa toàn cầu. Tuy nhiên, đây là một vụ hack hơn là một giải pháp thực sự, và cuối cùng đã bị từ chối bởi thượng nguồn và bị loại bỏ. Những nỗ lực tiếp theo tập trung vào việc khóa chi tiết hơn, một phiên bản đã chạy trên thiết bị Pixel kể từ tháng 1 năm 2017. Mặc dù phần lớn những thay đổi đó đã được công khai, nhưng những cải tiến đáng kể đã được thực hiện trong các phiên bản tiếp theo.

Sau khi xác định các vấn đề nhỏ trong việc triển khai khóa chi tiết, chúng tôi đã nghĩ ra một giải pháp cải tiến với kiến ​​trúc khóa khác và gửi các thay đổi trong tất cả các nhánh hạt nhân chung. Chúng tôi tiếp tục thử nghiệm việc triển khai này trên một số lượng lớn các thiết bị khác nhau; vì chúng tôi không biết về bất kỳ vấn đề nào còn tồn tại, đây là cách triển khai được khuyến nghị cho các thiết bị vận chuyển bằng Android 8.

Kế thừa ưu tiên theo thời gian thực

Common-4.4 và common-4.9 (sắp có ngược dòng)

Trình điều khiển chất kết dính luôn hỗ trợ kế thừa ưu tiên tốt đẹp. Khi ngày càng có nhiều quy trình trong Android chạy ở mức ưu tiên thời gian thực, trong một số trường hợp, giờ đây có nghĩa là nếu một chuỗi thời gian thực thực hiện một cuộc gọi liên kết, thì chuỗi trong quá trình xử lý cuộc gọi đó cũng chạy ở mức ưu tiên thời gian thực . Để hỗ trợ các trường hợp sử dụng này, Android 8 hiện triển khai kế thừa ưu tiên thời gian thực trong trình điều khiển chất kết dính.

Ngoài thừa kế ưu tiên giao dịch cấp, ưu tiên nút thừa kế cho phép một nút (binder đối tượng dịch vụ) để xác định một ưu tiên tối thiểu mà các cuộc gọi vào nút này nên được thực hiện. Các phiên bản trước của Android đã hỗ trợ kế thừa ưu tiên nút với các giá trị tốt, nhưng Android 8 bổ sung hỗ trợ kế thừa nút chính sách lập lịch thời gian thực.

Thay đổi không gian người dùng

Android 8 bao gồm tất cả userspace thay đổi cần thiết để làm việc với các tài xế binder hiện trong kernel chung với một ngoại lệ: Việc thực hiện ban đầu để vô hiệu hóa kế thừa ưu tiên thời gian thực cho /dev/binder sử dụng một ioctl . Sự phát triển sau đó đã chuyển quyền kiểm soát quyền thừa kế ưu tiên sang một phương pháp chi tiết hơn là theo chế độ chất kết dính (chứ không phải theo ngữ cảnh). Như vậy, ioctl không nằm trong chi nhánh phổ biến Android và được thay vì nộp trong hạt nhân chung của chúng ta .

Tác động của sự thay đổi này là real-time ưu tiên kế thừa bị tắt theo mặc định cho tất cả các nút. Nhóm nghiên cứu hiệu suất Android đã tìm thấy nó có lợi cho phép thừa kế ưu tiên thời gian thực cho tất cả các nút trong hwbinder miền. Để đạt được điều đó cùng có hiệu lực, anh đào-chọn sự thay đổi này trong userspace.

SHA cho các hạt nhân chung

Để có được những thay đổi cần thiết đối với trình điều khiển chất kết dính, hãy đồng bộ hóa với SHA thích hợp:

  • Common-3,18
    cc8b90c121de ANDROID: binder: không kiểm tra quyền ban đầu khi khôi phục.
  • Chung-4,4
    76b376eac7a2 ANDROID: binder: không kiểm tra các quyền ban đầu khi khôi phục.
  • Chung-4,9
    ecd972d4f9b5 ANDROID: binder: không kiểm tra các quyền ban đầu khi khôi phục.

Sử dụng chất kết dính IPC

Trong lịch sử, các quy trình của nhà cung cấp đã sử dụng giao tiếp liên quá trình kết dính (IPC) để giao tiếp. Trong Android 8, /dev/binder nút thiết bị trở nên độc quyền cho các quy trình khuôn khổ, có nghĩa là quá trình người bán không còn được tiếp cận với nó. Quá trình bán hàng có thể truy cập vào /dev/hwbinder , nhưng phải chuyển đổi giao diện AIDL của họ để sử dụng HIDL. Đối với các nhà cung cấp muốn tiếp tục sử dụng giao diện AIDL giữa các quy trình của nhà cung cấp, Android hỗ trợ IPC liên kết như được mô tả bên dưới.

vndbinder

Android 8 hỗ trợ một miền binder mới để sử dụng bởi các dịch vụ nhà cung cấp, truy cập sử dụng /dev/vndbinder thay vì /dev/binder . Với việc bổ sung /dev/vndbinder , Android hiện nay có ba lĩnh vực IPC sau:

Tên miền IPC Sự miêu tả
/dev/binder IPC giữa các quy trình khung / ứng dụng với giao diện AIDL
/dev/hwbinder IPC giữa các quy trình khung / nhà cung cấp với giao diện HIDL
IPC giữa các quy trình của nhà cung cấp với giao diện HIDL
/dev/vndbinder IPC giữa các quy trình của nhà cung cấp / nhà cung cấp với Giao diện AIDL

Đối với /dev/vndbinder xuất hiện, đảm bảo các mục cấu hình kernel CONFIG_ANDROID_BINDER_DEVICES được thiết lập để "binder,hwbinder,vndbinder" (đây là mặc định trong cây hạt nhân phổ biến Android).

Thông thường, quy trình bán hàng không mở tài xế chất kết dính trực tiếp và thay vào đó liên kết chống lại libbinder thư viện userspace, mà mở tài xế chất kết dính. Thêm một phương pháp để ::android::ProcessState() chọn trình điều khiển chất kết dính cho libbinder . Quá trình bán hàng nên gọi phương pháp này trước khi gọi vào ProcessState, IPCThreadState , hoặc trước khi thực hiện bất kỳ cuộc gọi chất kết dính nói chung. Để sử dụng, đặt cuộc gọi sau đây sau khi main() của một quá trình bán hàng (client và server):

ProcessState::initWithDriver("/dev/vndbinder");

vndservicemanager

Trước đây, các dịch vụ chất kết dính đã được đăng ký với servicemanager , nơi họ có thể được lấy ra bởi quá trình khác. Trong Android 8, servicemanager hiện đang sử dụng độc quyền bởi các quá trình khung và ứng dụng và quá trình bán hàng có thể truy cập không còn nó.

Tuy nhiên, các dịch vụ nhà cung cấp có thể sử dụng vndservicemanager , một trường hợp mới của servicemanager rằng sử dụng /dev/vndbinder thay vì /dev/binder và được xây dựng từ các nguồn như khung servicemanager . Quá trình bán hàng không cần phải thực hiện thay đổi để nói chuyện với vndservicemanager ; khi một quá trình bán hàng mở / dev/vndbinder , tra cứu dịch vụ tự động đi đến vndservicemanager .

Các vndservicemanager nhị phân được bao gồm trong makefiles thiết bị mặc định của Android.

Chính sách SELinux

Các quy trình của nhà cung cấp muốn sử dụng chức năng chất kết dính để giao tiếp với nhau cần những điều sau đây:

  1. Truy cập vào /dev/vndbinder .
  2. Binder {transfer, call} móc vào vndservicemanager .
  3. binder_call(A, B) đối với bất kỳ nhà cung cấp miền Một mà muốn gọi vào miền nhà cung cấp B so với giao diện nhà cung cấp chất kết dính.
  4. Phép {add, find} dịch vụ trong vndservicemanager .

Để đáp ứng yêu cầu 1 và 2, sử dụng vndbinder_use() vĩ mô:

vndbinder_use(some_vendor_process_domain);

Để đáp ứng yêu cầu 3, binder_call(A, B) cho nhà cung cấp quy trình A và B mà cần to talk over chất kết dính có thể ở lại tại chỗ, và không cần phải đổi tên.

Để đáp ứng yêu cầu 4, bạn phải thực hiện các thay đổi trong cách xử lý tên dịch vụ, nhãn dịch vụ và quy tắc.

Để biết chi tiết về SELinux, xem Security-Enhanced Linux trong Android . Để biết chi tiết về SELinux trong Android 8.0, xem SELinux dành cho Android 8.0 .

Tên dịch vụ

Trước đây, quy trình cung cấp đăng ký tên dịch vụ trong một service_contexts tập tin và thêm quy tắc cho việc truy cập tập tin đó tương ứng. Ví dụ service_contexts tập tin từ device/google/marlin/sepolicy :

AtCmdFwd                              u:object_r:atfwd_service:s0
cneservice                            u:object_r:cne_service:s0
qti.ims.connectionmanagerservice      u:object_r:imscm_service:s0
rcs                                   u:object_r:radio_service:s0
uce                                   u:object_r:uce_service:s0
vendor.qcom.PeripheralManager         u:object_r:per_mgr_service:s0

Trong Android 8, vndservicemanager tải các vndservice_contexts nộp thay thế. Dịch vụ nhà cung cấp chuyển sang vndservicemanager (và đó là đã có trong tuổi service_contexts tập tin) nên được thêm vào mới vndservice_contexts tập tin.

Nhãn dịch vụ

Trước đây, dịch vụ nhãn như u:object_r:atfwd_service:s0 được định nghĩa trong một service.te tập tin. Thí dụ:

type atfwd_service,      service_manager_type;

Trong Android 8, bạn phải thay đổi kiểu để vndservice_manager_type và di chuyển các quy tắc để các vndservice.te tập tin. Thí dụ:

type atfwd_service,      vndservice_manager_type;

Quy tắc của người quản lý dịch vụ

Trước đây, quy tắc cấp lĩnh vực truy cập để thêm hoặc tìm các dịch vụ từ servicemanager . Thí dụ:

allow atfwd atfwd_service:service_manager find;
allow some_vendor_app atfwd_service:service_manager add;

Trong Android 8, các quy tắc như vậy có thể được giữ nguyên và sử dụng cùng một lớp. Thí dụ:

allow atfwd atfwd_service:service_manager find;
allow some_vendor_app atfwd_service:service_manager add;