A/B ảo là cơ chế cập nhật chính của Android. A/B ảo được xây dựng dựa trên các bản cập nhật A/B cũ (xem bài viết Bản cập nhật hệ thống A/B) và không phải A/B (đã ngừng hoạt động trong phiên bản 15) để giảm chi phí không gian của các bản cập nhật.
A/B ảo không thực sự có một vùng bổ sung cho các phân vùng động, hãy xem bài viết về phân vùng động. Thay vào đó, delta được ghi vào một ảnh chụp nhanh, sau đó được hợp nhất vào phân vùng cơ sở sau khi xác nhận khởi động thành công. A/B ảo sử dụng định dạng ảnh chụp nhanh dành riêng cho Android. Hãy xem định dạng COW cho ảnh chụp nhanh đã nén cho phép nén ảnh chụp nhanh và giảm thiểu mức sử dụng dung lượng ổ đĩa. Đối với bản cập nhật OTA đầy đủ, kích thước ảnh chụp nhanh giảm khoảng 45% khi nén và kích thước ảnh chụp nhanh OTA gia tăng giảm khoảng 55%.
Android 12 cung cấp tuỳ chọn nén A/B ảo để nén các phân vùng được chụp nhanh. A/B ảo cung cấp những nội dung sau
- Các bản cập nhật A/B ảo diễn ra liền mạch (bản cập nhật diễn ra hoàn toàn ở chế độ nền trong khi thiết bị đang hoạt động) giống như các bản cập nhật A/B. Các bản cập nhật A/B ảo giảm thiểu thời gian thiết bị ở trạng thái ngoại tuyến và không sử dụng được.
- Các bản cập nhật A/B ảo có thể được khôi phục. Nếu hệ điều hành mới không khởi động được, thiết bị sẽ tự động khôi phục về phiên bản trước.
- Các bản cập nhật A/B ảo sử dụng không gian bổ sung tối thiểu bằng cách chỉ sao chép các phân vùng mà trình tải khởi động sử dụng. Các phân vùng có thể cập nhật khác được chụp nhanh.
Thông tin khái quát và thuật ngữ
Phần này xác định thuật ngữ và mô tả công nghệ hỗ trợ A/B ảo. Trong quá trình cài đặt OTA, dữ liệu hệ điều hành mới được ghi vào vùng mới cho các phân vùng vật lý hoặc thiết bị COW dành riêng cho Android. Sau khi thiết bị khởi động lại, dữ liệu phân vùng động sẽ được hợp nhất trở lại thiết bị cơ sở thông qua việc sử dụng trình nền dm-user và snapuserd. Quá trình này diễn ra hoàn toàn trong không gian người dùng.
Trình ánh xạ thiết bị
Trình ánh xạ thiết bị là một lớp khối ảo Linux thường được dùng trong Android. Với
các phân vùng động, các phân vùng như
/system là một ngăn xếp các thiết bị theo lớp:
- Ở dưới cùng của ngăn xếp là phân vùng siêu vật lý (ví dụ:
/dev/block/by-name/super). - Ở giữa là thiết bị
dm-linear, chỉ định các khối trong phân vùng siêu tạo thành phân vùng động đã cho. Thiết bị này xuất hiện dưới dạng/dev/block/mapper/system_[a|b]trên thiết bị A/B hoặc/dev/block/mapper/systemtrên thiết bị không phải A/B. - Ở trên cùng là thiết bị
dm-verity, được tạo cho các phân vùng đã xác minh. Thiết bị này xác minh rằng các khối trên thiết bịdm-linearđược ký đúng cách. Thiết bị này xuất hiện dưới dạng/dev/block/mapper/system-verityvà là nguồn của điểm gắn kết/system.
Hình 1 cho thấy ngăn xếp bên dưới điểm gắn kết /system trông như thế nào.
Hình 1. Ngăn xếp bên dưới điểm gắn kết /system
Ảnh chụp nhanh đã nén
Trong Android 12 trở lên, vì yêu cầu về dung lượng trên phân vùng /data có thể cao, nên bạn có thể bật ảnh chụp nhanh đã nén trong bản dựng để giải quyết các yêu cầu cao hơn về dung lượng của phân vùng /data.
Ảnh chụp nhanh đã nén A/B ảo được xây dựng dựa trên các thành phần sau đây có trong Android 12 trở lên:
dm-user, một mô-đun kernel tương tự như FUSE cho phép không gian người dùng triển khai các thiết bị khối.snapuserd, một trình nền không gian người dùng để triển khai định dạng ảnh chụp nhanh mới.
Các thành phần này cho phép nén. Các thay đổi cần thiết khác được thực hiện để triển khai các tính năng ảnh chụp nhanh đã nén được cung cấp trong các phần tiếp theo: định dạng COW cho ảnh chụp nhanh đã nén, dm-user, và snapuserd.
Định dạng COW cho ảnh chụp nhanh đã nén
Trong Android 12 trở lên, ảnh chụp nhanh đã nén sử dụng định dạng COW dành riêng cho Android. Định dạng COW chứa siêu dữ liệu về OTA và có các bộ đệm riêng biệt chứa các thao tác COW và dữ liệu hệ điều hành mới. So với định dạng ảnh chụp nhanh kernel chỉ cho phép các thao tác thay thế (Thay thế khối X trong hình ảnh cơ sở bằng nội dung của khối Y trong ảnh chụp nhanh), định dạng COW của ảnh chụp nhanh đã nén Android có tính biểu cảm hơn và hỗ trợ các thao tác sau:
- Sao chép: Khối X trong thiết bị cơ sở phải được thay thế bằng khối Y trong thiết bị cơ sở.
- Thay thế: Khối X trong thiết bị cơ sở phải được thay thế bằng nội dung của khối Y trong ảnh chụp nhanh. Mỗi khối này được nén gz.
- Không: Khối X trong thiết bị cơ sở phải được thay thế bằng tất cả các số không.
- XOR: Thiết bị COW lưu trữ các byte được nén XOR giữa khối X và khối Y. (Có trong Android 13 trở lên.)
Các bản cập nhật OTA đầy đủ chỉ bao gồm các thao tác thay thế và không. Các bản cập nhật OTA gia tăng có thể có thêm các thao tác sao chép.
Bố cục ảnh chụp nhanh đầy đủ trên đĩa có dạng như sau:
Hình 2. Định dạng COW của Android trên đĩa
dm-user
Mô-đun kernel dm-user cho phép userspace triển khai các thiết bị khối trình ánh xạ thiết bị. Một mục nhập bảng dm-user sẽ tạo một thiết bị khác trong
/dev/dm-user/<control-name>. Một quy trình userspace có thể thăm dò thiết bị để nhận các yêu cầu đọc và ghi từ kernel. Mỗi yêu cầu có một bộ đệm được liên kết để không gian người dùng điền (để đọc) hoặc truyền (để ghi).
Mô-đun nhân dm-user cung cấp một giao diện mới mà người dùng có thể thấy cho nhân hệ điều hành, không thuộc toàn bộ mã nguồn kernel.org ở thượng nguồn. Cho đến khi đó, Google giữ quyền sửa đổi giao diện dm-user trong Android.
snapuserd
Thành phần không gian người dùng snapuserd cho dm-user triển khai tính năng nén A/B ảo. Snapuserd là một trình nền không gian người dùng chịu trách nhiệm ghi và đọc các thiết bị COW của Android. Tất cả hoạt động I/O đối với ảnh chụp nhanh phải thông qua dịch vụ này.
Trong quá trình cài đặt OTA, dữ liệu hệ điều hành mới được snapuserd ghi vào ảnh chụp nhanh (có nén). Quá trình phân tích siêu dữ liệu và giải nén dữ liệu khối mới cũng được xử lý tại đây.
Nén XOR
Đối với các thiết bị ra mắt bằng Android 13 trở lên, tính năng nén XOR (được bật theo mặc định) cho phép ảnh chụp nhanh không gian người dùng lưu trữ các byte được nén XOR giữa các khối cũ và khối mới. Khi chỉ một vài byte trong một khối được thay đổi trong bản cập nhật A/B ảo, lược đồ lưu trữ nén XOR sẽ sử dụng ít dung lượng hơn lược đồ lưu trữ mặc định vì ảnh chụp nhanh không lưu trữ đầy đủ 4K byte. Có thể giảm kích thước ảnh chụp nhanh này vì dữ liệu XOR chứa nhiều số không và dễ nén hơn dữ liệu khối thô. Trên các thiết bị Pixel, tính năng nén XOR giúp giảm kích thước ảnh chụp nhanh từ 25% đến 40%.
Đối với các thiết bị nâng cấp lên Android 13 trở lên, bạn phải bật tính năng nén XOR. Để biết thông tin chi tiết, hãy xem bài viết Nén XOR.
Hợp nhất ảnh chụp nhanh
Đối với các thiết bị ra mắt bằng Android 13 trở lên, các quy trình hợp nhất ảnh chụp nhanh và ảnh chụp nhanh trong tính năng nén A/B ảo được thực hiện bởi thành phần không gian người dùng snapuserd. Đối với các thiết bị nâng cấp lên Android 13 trở lên, bạn phải bật tính năng này. Để biết thông tin chi tiết, hãy xem bài viết Hợp nhất không gian người dùng.
Sau đây mô tả quy trình nén A/B ảo:
- Khung này gắn kết phân vùng
/systemkhỏi thiết bịdm-verity, được xếp chồng lên trên thiết bịdm-user. Điều này có nghĩa là mọi hoạt động I/O từ hệ thống tệp gốc đều được chuyển đếndm-user. dm-userchuyển hoạt động I/O đến trình nềnsnapuserdkhông gian người dùng, xử lý yêu cầu I/O.- Khi thao tác hợp nhất hoàn tất, khung sẽ thu gọn
dm-veritylên trêndm-linear(system_base) và xoádm-user.
Hình 3. Quy trình nén A/B ảo
Quá trình hợp nhất ảnh chụp nhanh có thể bị gián đoạn. Nếu thiết bị khởi động lại trong quá trình hợp nhất, quá trình hợp nhất sẽ tiếp tục sau khi khởi động lại.
Chuyển đổi khởi động
Khi khởi động bằng ảnh chụp nhanh đã nén, quá trình khởi động giai đoạn đầu tiên phải bắt đầu snapuserd để gắn kết các phân vùng. Điều này gây ra vấn đề: Khi sepolicy được tải và thực thi, snapuserd sẽ được đặt trong ngữ cảnh không chính xác và các yêu cầu đọc của nó sẽ không thành công, với các lỗi từ chối selinux.
Để giải quyết vấn đề này, snapuserd sẽ chuyển đổi theo từng bước với init, như sau:
initgiai đoạn đầu tiên khởi chạysnapuserdtừ ramdisk và lưu một bộ mô tả tệp đang mở vào đó trong một biến môi trường.initgiai đoạn đầu tiên chuyển hệ thống tệp gốc sang phân vùng hệ thống, sau đó thực thi bản sao hệ thống củainit.- Bản sao hệ thống của
initđọc sepolicy kết hợp thành một chuỗi. Initgọimlock()trên tất cả các trang được sao lưu ext4. Sau đó, nó sẽ huỷ kích hoạt tất cả các bảng trình ánh xạ thiết bị cho các thiết bị ảnh chụp nhanh và dừngsnapuserd. Sau đó, bạn không được phép đọc từ các phân vùng, vì việc này sẽ gây ra tình trạng bế tắc.- Sử dụng bộ mô tả mở cho bản sao ramdisk của
snapuserd,initsẽ khởi chạy lại trình nền với ngữ cảnh selinux chính xác. Các bảng trình ánh xạ thiết bị cho thiết bị ảnh chụp nhanh được kích hoạt lại. - Init gọi
munlockall()– bạn có thể thực hiện lại IO một cách an toàn.
Mức sử dụng dung lượng
Bảng sau đây so sánh mức sử dụng dung lượng cho các cơ chế OTA khác nhau bằng cách sử dụng kích thước hệ điều hành và OTA của Pixel.
| Tác động về kích thước | không phải A/B | A/B | A/B ảo | A/B ảo (đã nén) |
|---|---|---|---|---|
| Hình ảnh gốc của nhà máy | Siêu dữ liệu 4,5 GB (hình ảnh 3,8 GB + 700 MB dành riêng)1 | Siêu dữ liệu 9 GB (3,8 GB + 700 MB dành riêng, cho 2 vùng) | Siêu dữ liệu 4,5 GB (hình ảnh 3,8 GB + 700 MB dành riêng) | Siêu dữ liệu 4,5 GB (hình ảnh 3,8 GB + 700 MB dành riêng) |
| Các phân vùng tĩnh khác | /cache | Không có | Không có | Không có |
| Bộ nhớ bổ sung trong quá trình OTA (dung lượng được trả lại sau khi áp dụng OTA) | 1,4 GB trên /data | 0 | 3,8 GB2 trên /data | 2,1 GB2 trên /data |
| Tổng bộ nhớ cần thiết để áp dụng OTA | 5,9 GB3 (siêu dữ liệu và dữ liệu) | 9 GB (siêu dữ liệu) | 8,3 GB3 (siêu dữ liệu và dữ liệu) | 6,6 GB3 (siêu dữ liệu và dữ liệu) |
1Cho biết bố cục giả định dựa trên việc ánh xạ Pixel.
2Giả định hình ảnh hệ thống mới có cùng kích thước với hình ảnh gốc.
3Yêu cầu về dung lượng chỉ là tạm thời cho đến khi khởi động lại.
A/B ảo trên Android 11
Android 11 của A/B ảo đã ghi vào phân vùng động bằng định dạng COW của Kernel. Cuối cùng, định dạng này đã bị ngừng hoạt động vì định dạng COW của Kernel không hỗ trợ nén.
A/B ảo trên Android 12
Trong Android 12, tính năng nén được hỗ trợ ở dạng định dạng COW dành riêng cho Android. Phiên bản A/B ảo này yêu cầu dịch COW dành riêng cho Android sang định dạng COW của Kernel. Cuối cùng, định dạng này đã được thay thế trong Android 13, xoá bỏ sự phụ thuộc vào định dạng COW của Kernel và cả dm-snapshot.
Để triển khai A/B ảo hoặc sử dụng các tính năng ảnh chụp nhanh đã nén, hãy xem bài viết Triển khai A/B ảo