Môi trường thời gian chạy của Trung tâm ngữ cảnh (CHRE)

Điện thoại thông minh chứa một số bộ xử lý, mỗi bộ xử lý được tối ưu hoá để thực hiện các tác vụ khác nhau. Tuy nhiên, Android chỉ chạy trên một bộ xử lý: bộ xử lý ứng dụng (AP). AP được điều chỉnh để mang lại hiệu suất cao cho các trường hợp sử dụng màn hình bật, chẳng hạn như chơi trò chơi, nhưng AP tiêu tốn quá nhiều năng lượng để hỗ trợ các tính năng đòi hỏi phải xử lý liên tục, ngắn hạn, ngay cả khi màn hình tắt. Bộ xử lý nhỏ hơn có thể xử lý các khối lượng công việc này hiệu quả hơn, hoàn thành tác vụ mà không ảnh hưởng đáng kể đến thời lượng pin. Tuy nhiên, môi trường phần mềm trong các bộ xử lý tiêu thụ điện năng thấp này bị hạn chế hơn và có thể khác nhau rất nhiều, khiến việc phát triển trên nhiều nền tảng trở nên khó khăn.

Môi trường thời gian chạy của Trung tâm ngữ cảnh (CHRE) cung cấp một nền tảng chung để chạy ứng dụng trên bộ xử lý tiêu thụ điện năng thấp, với một API đơn giản, được chuẩn hoá và thân thiện với tính năng nhúng. CHRE giúp nhà sản xuất thiết bị gốc (OEM) và các đối tác đáng tin cậy của họ dễ dàng giảm tải quá trình xử lý từ AP, tiết kiệm pin và cải thiện nhiều khía cạnh của trải nghiệm người dùng, đồng thời bật một lớp các tính năng luôn bật, nhận biết theo bối cảnh, đặc biệt là các tính năng liên quan đến việc áp dụng công nghệ học máy cho tính năng cảm biến môi trường xung quanh.

Khái niệm chính

CHRE là môi trường phần mềm nơi các ứng dụng gốc nhỏ (còn gọi là nanoapps) thực thi trên một bộ xử lý công suất thấp và tương tác với hệ thống cơ bản thông qua API CHRE chung. Để tăng tốc độ triển khai đúng cách các API CHRE, hoạt động triển khai tham chiếu trên nhiều nền tảng của CHRE được đưa vào AOSP. Quá trình triển khai tham chiếu bao gồm mã và các thành phần trừu tượng phổ biến cho phần cứng và phần mềm cơ bản thông qua một loạt các lớp trừu tượng nền tảng (PAL). Ứng dụng nano hầu như luôn liên kết với một hoặc nhiều ứng dụng khách chạy trong Android. Các ứng dụng này tương tác với CHRE và ứng dụng nano thông qua các API hệ thống ContextHubManager có quyền truy cập bị hạn chế.

Ở cấp độ cao, bạn có thể vẽ các điểm tương đồng giữa kiến trúc của CHRE và Android nói chung. Tuy nhiên, có một vài điểm khác biệt quan trọng:

  • CHRE chỉ hỗ trợ chạy các ứng dụng nano được phát triển bằng mã gốc (C hoặc C++); không hỗ trợ Java.
  • Do các hạn chế về tài nguyên và bảo mật, CHRE không mở cho các ứng dụng Android bên thứ ba tuỳ ý sử dụng. Chỉ những ứng dụng đáng tin cậy của hệ thống mới có thể truy cập vào thư mục này.

Ngoài ra, bạn cũng cần phân biệt quan trọng giữa khái niệm CHRE và trung tâm cảm biến. Mặc dù thường sử dụng cùng một phần cứng để triển khai trung tâm cảm biến và CHRE, nhưng bản thân CHRE không cung cấp các chức năng cảm biến mà HAL cảm biến Android yêu cầu. CHRE được liên kết với HAL của Trung tâm ngữ cảnh và đóng vai trò là ứng dụng của khung cảm biến dành riêng cho thiết bị để nhận dữ liệu cảm biến mà không cần đến AP.

Cấu trúc khung CHRE

Hình 1. Kiến trúc khung CHRE

HAL Trung tâm bối cảnh

Lớp trừu tượng phần cứng (HAL) cho Context Hub là giao diện giữa khung Android và mô-đun triển khai CHRE của thiết bị, được xác định tại hardware/interfaces/contexthub. HAL của Trung tâm ngữ cảnh xác định các API mà qua đó khung Android phát hiện các trung tâm ngữ cảnh có sẵn và ứng dụng nano của chúng, tương tác với các ứng dụng nano đó thông qua tính năng truyền thông báo, đồng thời cho phép tải và huỷ tải ứng dụng nano. Bạn có thể tham khảo cách triển khai HAL của Trung tâm ngữ cảnh hoạt động với cách triển khai tham chiếu của CHRE tại system/chre/host.

Trong trường hợp có mâu thuẫn giữa tài liệu này và định nghĩa HAL, định nghĩa HAL sẽ được ưu tiên.

Khởi chạy

Khi Android khởi động, ContextHubService sẽ gọi hàm HAL getHubs() để xác định xem có trung tâm ngữ cảnh nào trên thiết bị hay không. Đây là lệnh gọi một lần, chặn, vì vậy, lệnh gọi này phải hoàn tất nhanh chóng để tránh trì hoãn quá trình khởi động và phải trả về kết quả chính xác, vì không thể giới thiệu các trung tâm ngữ cảnh mới sau đó.

Tải và huỷ tải ứng dụng nano

Trung tâm ngữ cảnh có thể bao gồm một tập hợp các ứng dụng nano có trong hình ảnh thiết bị và được tải khi CHRE khởi động. Đây được gọi là các ứng dụng nano được tải trước và phải được đưa vào phản hồi đầu tiên có thể có cho queryApps().

HAL của trung tâm ngữ cảnh cũng hỗ trợ việc tải và huỷ tải ứng dụng nano một cách linh hoạt trong thời gian chạy, thông qua các hàm loadNanoApp()unloadNanoApp(). Các ứng dụng nano được cung cấp cho HAL ở định dạng nhị phân dành riêng cho việc triển khai phần cứng và phần mềm CHRE của thiết bị.

Nếu quá trình triển khai để tải một ứng dụng nano liên quan đến việc ghi ứng dụng đó vào bộ nhớ không bay hơi, chẳng hạn như bộ nhớ flash được đính kèm vào bộ xử lý chạy CHRE, thì quá trình triển khai CHRE phải luôn khởi động với các ứng dụng nano động này ở trạng thái tắt. Điều này có nghĩa là không có mã nào của ứng dụng nano được thực thi cho đến khi nhận được yêu cầu enableNanoapp() thông qua HAL. Các ứng dụng nano tải trước có thể khởi động ở trạng thái đã bật.

Trung tâm bối cảnh khởi động lại

Mặc dù CHRE không được dự kiến sẽ khởi động lại trong quá trình hoạt động bình thường, nhưng có thể cần phải khôi phục từ các điều kiện không mong muốn, chẳng hạn như cố gắng truy cập vào địa chỉ bộ nhớ chưa được liên kết. Trong những trường hợp này, CHRE sẽ khởi động lại độc lập với Android. HAL thông báo cho Android về điều này thông qua sự kiện RESTARTED. Sự kiện này chỉ được gửi sau khi CHRE được khởi động lại đến thời điểm có thể chấp nhận các yêu cầu mới, chẳng hạn như queryApps().

Tổng quan về hệ thống CHRE

CHRE được thiết kế dựa trên cấu trúc do sự kiện điều khiển, trong đó đơn vị tính toán chính là một sự kiện được truyền đến điểm truy cập xử lý sự kiện của ứng dụng nano. Mặc dù khung CHRE có thể đa luồng, nhưng một ứng dụng nano nhất định không bao giờ được thực thi song song từ nhiều luồng. Khung CHRE tương tác với một ứng dụng nano nhất định thông qua một trong ba điểm truy cập ứng dụng nano (nanoappStart(), nanoappHandleEvent()nanoappEnd()) hoặc thông qua lệnh gọi lại được cung cấp trong lệnh gọi API CHRE trước đó, và các ứng dụng nano tương tác với khung CHRE và hệ thống cơ bản thông qua API CHRE. CHRE API cung cấp một bộ tính năng cơ bản cũng như các tiện nghi để truy cập các tín hiệu bối cảnh, bao gồm cảm biến, GNSS, Wi-Fi, WWAN và âm thanh. API này có thể được mở rộng với các tính năng bổ sung dành riêng cho nhà cung cấp để các ứng dụng nano dành riêng cho nhà cung cấp sử dụng.

Hệ thống xây dựng

Mặc dù HAL của Trung tâm ngữ cảnh và các thành phần cần thiết khác ở phía AP được tạo cùng với Android, nhưng mã chạy trong CHRE có thể có các yêu cầu khiến mã không tương thích với hệ thống xây dựng Android, chẳng hạn như cần có một chuỗi công cụ chuyên biệt. Do đó, dự án CHRE trong AOSP cung cấp một hệ thống xây dựng đơn giản dựa trên GNU Make để biên dịch các ứng dụng nano và tuỳ ý đưa khung CHRE vào các thư viện có thể tích hợp với hệ thống. Các nhà sản xuất thiết bị thêm tính năng hỗ trợ CHRE nên tích hợp tính năng hỗ trợ hệ thống xây dựng cho thiết bị mục tiêu của họ vào AOSP.

API CHRE được viết theo tiêu chuẩn ngôn ngữ C99 và quá trình triển khai tham chiếu sử dụng một tập hợp con bị hạn chế của C++11 phù hợp với các ứng dụng bị hạn chế tài nguyên.

API CHRE

CHRE API là một tập hợp các tệp tiêu đề C xác định giao diện phần mềm giữa một ứng dụng nano và hệ thống. Công cụ này được thiết kế để giúp mã ứng dụng nano tương thích trên tất cả các thiết bị hỗ trợ CHRE. Điều này có nghĩa là bạn không cần sửa đổi mã nguồn cho ứng dụng nano để hỗ trợ loại thiết bị mới, mặc dù có thể cần biên dịch lại mã nguồn dành riêng cho tập lệnh bộ xử lý hoặc giao diện nhị phân của ứng dụng (ABI) của thiết bị mục tiêu. Cấu trúc CHRE và thiết kế API cũng đảm bảo rằng các ứng dụng nano tương thích nhị phân trên nhiều phiên bản API CHRE, nghĩa là không cần biên dịch lại ứng dụng nano để chạy trên một hệ thống triển khai phiên bản API CHRE khác so với API mục tiêu mà ứng dụng nano được biên dịch. Nói cách khác, nếu tệp nhị phân của ứng dụng nano chạy trên một thiết bị hỗ trợ CHRE API phiên bản 1.3 và thiết bị đó được nâng cấp để hỗ trợ CHRE API phiên bản 1.4, thì tệp nhị phân của ứng dụng nano đó sẽ tiếp tục hoạt động. Tương tự, ứng dụng nano có thể chạy trên CHRE API phiên bản 1.2 và có thể xác định trong thời gian chạy liệu ứng dụng có yêu cầu các chức năng từ API phiên bản 1.3 để đạt được mức sử dụng hay không, hoặc liệu ứng dụng có thể hoạt động hay không, có thể với mức giảm tính năng một cách mượt mà.

Các phiên bản mới của API CHRE được phát hành cùng với Android, tuy nhiên, vì việc triển khai CHRE là một phần của quy trình triển khai của nhà cung cấp, nên phiên bản API CHRE được hỗ trợ trên thiết bị không nhất thiết phải liên kết với phiên bản Android.

Tóm tắt phiên bản

Giống như lược đồ tạo phiên bản Android HIDL, API CHRE tuân theo phiên bản ngữ nghĩa. Phiên bản chính cho biết khả năng tương thích nhị phân, trong khi phiên bản nhỏ được tăng lên khi các tính năng tương thích ngược được giới thiệu. API CHRE bao gồm các chú giải mã nguồn để xác định phiên bản đã giới thiệu một hàm hoặc tham số, ví dụ: @since v1.1.

Quá trình triển khai CHRE cũng hiển thị phiên bản bản vá dành riêng cho nền tảng thông qua chreGetVersion(), cho biết thời điểm thực hiện các bản sửa lỗi hoặc bản cập nhật nhỏ trong quá trình triển khai.

Phiên bản 1.0 (Android 7)

Bao gồm tính năng hỗ trợ cảm biến và các tính năng của ứng dụng nano chính, chẳng hạn như sự kiện và bộ tính giờ.

Phiên bản 1.1 (Android 8)

Giới thiệu các tính năng vị trí thông qua thông tin vị trí GNSS và thông tin đo lường thô, tính năng quét Wi-Fi và thông tin mạng di động, cùng với các điểm tinh chỉnh chung để cho phép giao tiếp giữa các ứng dụng nano với nhau và các điểm cải tiến khác.

Phiên bản 1.2 (Android 9)

Bổ sung tính năng hỗ trợ dữ liệu từ micrô tiêu thụ điện năng thấp, phạm vi RTT Wi-Fi, thông báo đánh thức và ngủ của AP cũng như các điểm cải tiến khác.

Phiên bản 1.3 (Android 10)

Cải thiện các tính năng liên quan đến dữ liệu hiệu chuẩn cảm biến, hỗ trợ thêm tính năng xoá dữ liệu cảm biến theo lô theo yêu cầu, xác định loại cảm biến phát hiện bước và mở rộng các sự kiện vị trí GNSS bằng các trường độ chính xác bổ sung.

Phiên bản 1.4 (Android 11)

Bổ sung tính năng hỗ trợ cho thông tin di động 5G, tệp kết xuất gỡ lỗi ứng dụng nano và các điểm cải tiến khác.

Các tính năng bắt buộc của hệ thống

Mặc dù các nguồn tín hiệu theo bối cảnh (như cảm biến) được phân loại thành các khu vực tính năng không bắt buộc, nhưng một số hàm cốt lõi là bắt buộc trong tất cả các hoạt động triển khai CHRE. Trong đó có các API hệ thống cốt lõi, chẳng hạn như các API để đặt bộ tính giờ, gửi và nhận thông báo đến ứng dụng khách trên bộ xử lý ứng dụng, nhật ký và các API khác. Để biết thông tin đầy đủ, hãy xem Tiêu đề API.

Ngoài các tính năng hệ thống cốt lõi được mã hoá trong API CHRE, còn có các tính năng cấp hệ thống CHRE bắt buộc được chỉ định ở cấp HAL của Trung tâm ngữ cảnh. Quan trọng nhất trong số này là khả năng tải và giải phóng ứng dụng nano một cách linh động.

Thư viện chuẩn C/C++

Để giảm thiểu mức sử dụng bộ nhớ và độ phức tạp của hệ thống, việc triển khai CHRE chỉ được yêu cầu hỗ trợ một tập hợp con các thư viện C và C++ chuẩn cũng như các tính năng ngôn ngữ cần hỗ trợ thời gian chạy. Theo các nguyên tắc này, một số tính năng sẽ bị loại trừ rõ ràng do bộ nhớ và các phần phụ thuộc cấp hệ điều hành rộng rãi, cũng như các tính năng khác vì chúng được thay thế bằng các API dành riêng cho CHRE phù hợp hơn. Mặc dù không phải là danh sách đầy đủ, nhưng các tính năng sau đây không được cung cấp cho ứng dụng nano:

  • Các ngoại lệ trong C++ và thông tin về loại thời gian chạy (RTTI)
  • Hỗ trợ nhiều luồng thư viện chuẩn, bao gồm các tiêu đề C++11 <thread>, <mutex>, <atomic>, <future>
  • Thư viện đầu vào/đầu ra chuẩn C và C++
  • Thư viện mẫu chuẩn (STL) C++
  • Thư viện Biểu thức chính quy chuẩn C++
  • Phân bổ bộ nhớ động thông qua các hàm tiêu chuẩn (ví dụ: malloc, calloc, realloc, free, operator new) và các hàm thư viện tiêu chuẩn khác vốn sử dụng tính năng phân bổ động, chẳng hạn như std::unique_ptr
  • Hỗ trợ ký tự Unicode và bản địa hoá
  • Thư viện ngày và giờ
  • Các hàm sửa đổi luồng chương trình thông thường, bao gồm <setjmp.h>, <signal.h>, abort, std::terminate
  • Truy cập vào môi trường lưu trữ, bao gồm system, getenv
  • POSIX và các thư viện khác không có trong tiêu chuẩn ngôn ngữ C99 hoặc C++11

Trong nhiều trường hợp, các chức năng tương đương có sẵn trong các hàm API CHRE và thư viện tiện ích. Ví dụ: bạn có thể sử dụng chreLog để ghi nhật ký gỡ lỗi nhằm mục tiêu hệ thống logcat của Android, trong đó một chương trình truyền thống hơn có thể sử dụng printf hoặc std::cout.

Ngược lại, một số chức năng thư viện tiêu chuẩn là bắt buộc. Bạn có thể chọn cách triển khai nền tảng để hiển thị các đối tượng này thông qua thư viện tĩnh để đưa vào tệp nhị phân ứng dụng nano, hoặc bằng cách liên kết động giữa ứng dụng nano và hệ thống. Điều này bao gồm nhưng không giới hạn ở:

  • Tiện ích chuỗi và mảng: memcmp, memcpy, memmove, memset, strlen
  • Thư viện toán học: Các hàm dấu phẩy động có độ chính xác đơn thường dùng:

    • Thao tác cơ bản: ceilf, fabsf, floorf, fmaxf, fminf, fmodf, roundf, lroundf, remainderf
    • Hàm mũ và hàm luỹ thừa: expf, log2f, powf, sqrtf
    • Hàm lượng giác và hàm hyperbol: sinf, cosf, tanf, asinf, acosf, atan2f, tanhf

Mặc dù một số nền tảng cơ bản hỗ trợ các chức năng bổ sung, nhưng ứng dụng nano không được coi là có thể di chuyển trên các phương thức triển khai CHRE, trừ phi ứng dụng đó ràng buộc các phần phụ thuộc bên ngoài của nó với các hàm API CHRE và các hàm thư viện tiêu chuẩn đã phê duyệt.

Các tính năng tùy chọn

Để quảng bá phần cứng và phần mềm, API CHRE được chia thành các khu vực tính năng, được coi là không bắt buộc từ quan điểm API. Mặc dù các tính năng này có thể không bắt buộc để hỗ trợ việc triển khai CHRE tương thích, nhưng có thể cần thiết để hỗ trợ một ứng dụng nano cụ thể. Ngay cả khi một nền tảng không hỗ trợ một nhóm API nhất định, các ứng dụng nano tham chiếu đến các hàm đó phải có thể tạo và tải.

Cảm biến

CHRE API cung cấp khả năng yêu cầu dữ liệu từ các cảm biến, bao gồm gia tốc kế, con quay hồi chuyển, từ kế, cảm biến ánh sáng xung quanh và độ gần. Các API này nhằm cung cấp một bộ tính năng tương tự như các API Cảm biến của Android, bao gồm cả tính năng hỗ trợ phân lô các mẫu cảm biến để giảm mức tiêu thụ điện năng. Việc xử lý dữ liệu cảm biến trong CHRE giúp giảm mức tiêu thụ năng lượng và độ trễ xử lý tín hiệu chuyển động so với khi chạy trên AP.

GNSS

CHRE cung cấp các API để yêu cầu dữ liệu vị trí từ hệ thống vệ tinh điều hướng toàn cầu (GNSS), bao gồm cả GPS và các cụm vệ tinh khác. Điều này bao gồm các yêu cầu sửa lỗi vị trí định kỳ cũng như dữ liệu đo lường thô, mặc dù cả hai đều là các chức năng độc lập. Vì CHRE có liên kết trực tiếp với hệ thống con GNSS, nên điện năng sẽ giảm so với các yêu cầu GNSS dựa trên AP, vì AP có thể ở trạng thái ngủ trong toàn bộ vòng đời của một phiên vị trí.

Wi-Fi

CHRE cung cấp khả năng tương tác với khối Wi-Fi, chủ yếu là cho mục đích vị trí. Mặc dù GNSS hoạt động tốt ở các vị trí ngoài trời, nhưng kết quả quét Wi-Fi có thể cung cấp thông tin vị trí chính xác ở trong nhà và ở các khu vực phát triển. Ngoài việc tránh chi phí đánh thức AP để quét, CHRE có thể nghe kết quả quét Wi-Fi do phần mềm Wi-Fi thực hiện cho mục đích kết nối, thường không được phân phối đến AP vì lý do nguồn. Việc tận dụng tính năng quét khả năng kết nối cho các mục đích theo ngữ cảnh giúp giảm tổng số lần quét Wi-Fi, tiết kiệm pin.

Tính năng hỗ trợ Wi-Fi đã được thêm vào CHRE API phiên bản 1.1, bao gồm cả khả năng theo dõi kết quả quét và kích hoạt quét theo yêu cầu. Các chức năng này được mở rộng trong phiên bản 1.2 với khả năng thực hiện các phép đo Thời gian truyền và nhận (RTT) so với các điểm truy cập hỗ trợ tính năng này, cho phép xác định chính xác vị trí tương đối.

WWAN

API CHRE cung cấp khả năng truy xuất thông tin nhận dạng ô cho ô phân phát và các ô lân cận. Thông tin này thường dùng cho mục đích truy cập thông tin vị trí chi tiết.

Âm thanh

CHRE có thể xử lý hàng loạt dữ liệu âm thanh từ micrô tiêu thụ điện năng thấp, thường tận dụng phần cứng dùng để triển khai HAL SoundTrigger. Việc xử lý dữ liệu âm thanh trong CHRE có thể cho phép dữ liệu đó được hợp nhất với dữ liệu khác, chẳng hạn như cảm biến chuyển động.

Cách triển khai tệp đối chiếu

Mã tham chiếu cho khung CHRE có trong AOSP trong dự án system/chre, được triển khai trong C++11. Mặc dù không bắt buộc, nhưng tất cả quá trình triển khai CHRE đều nên dựa trên cơ sở mã này để đảm bảo tính nhất quán và đẩy nhanh việc sử dụng các tính năng mới. Bạn có thể xem mã này là tương tự như khung Android cốt lõi ở chỗ đây là một phương thức triển khai nguồn mở của các API mà ứng dụng sử dụng, đóng vai trò là đường cơ sở và tiêu chuẩn để tương thích. Mặc dù bạn có thể tuỳ chỉnh và mở rộng mã này bằng các tính năng dành riêng cho nhà cung cấp, nhưng bạn nên duy trì mã chung gần với mã tham chiếu nhất có thể. Tương tự như HAL của Android, việc triển khai tham chiếu CHRE sử dụng nhiều mô-đun trừu tượng của nền tảng để cho phép điều chỉnh cho phù hợp với mọi thiết bị đáp ứng yêu cầu tối thiểu.

Để biết thông tin kỹ thuật và hướng dẫn chuyển đổi, hãy xem README có trong dự án system/chre.