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 có 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 khi màn hình bật, chẳng hạn như chơi trò chơi, nhưng tiêu thụ quá nhiều điện năng để hỗ trợ các tính năng yêu cầu xử lý thường xuyên, trong thời gian ngắn mọi lúc, ngay cả khi màn hình tắt. Các bộ xử lý nhỏ hơn có thể xử lý những khối lượng công việc này hiệu quả hơn, hoàn thành các 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ụ ít điện năng này bị hạn chế hơn và có thể khác nhau đáng kể, gây khó khăn cho việc phát triển đa nền tảng.

Môi trường thời gian chạy của Context Hub (CHRE) cung cấp một nền tảng chung để chạy các ứng dụng trên bộ xử lý có mức tiêu thụ điện năng thấp, với một API đơn giản, tiêu chuẩn và thân thiện với thiết bị nhúng. CHRE giúp các nhà sản xuất thiết bị gốc và các đối tác đáng tin cậy của họ dễ dàng chuyển quy trình xử lý từ AP, giúp tiết kiệm pin và cải thiện nhiều khía cạnh trong trải nghiệm người dùng, đồng thời cho phép 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à những tính năng liên quan đến việc áp dụng học máy để cảm biến môi trường.

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ỏ (gọi là nanoapp) thực thi trên một bộ xử lý tiêu thụ ít điện năng và tương tác với hệ thống cơ bản thông qua CHRE API chung. Để đẩy nhanh quá trình triển khai đúng cách các API CHRE, một cách triển khai tham chiếu đa nền tảng của CHRE sẽ được đưa vào AOSP. Quy trình triển khai tham chiếu bao gồm mã và các lớp 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). Nanoapp hầu như luôn được liên kết với một hoặc nhiều ứng dụng khách chạy trong Android, tương tác với CHRE và nanoapp thông qua các API hệ thống ContextHubManager có quyền truy cập hạn chế.

Ở cấp độ cao, có thể so sánh giữa cấu trúc của CHRE và Android nói chung. Tuy nhiên, có một số điểm khác biệt quan trọng:

  • CHRE chỉ hỗ trợ chạy các nano ứng dụng đượ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 được các ứng dụng Android tuỳ ý của bên thứ ba sử dụng. Chỉ những ứng dụng được hệ thống tin cậy mới có thể truy cập vào khoá này.

Bạn cũng cần phân biệt rõ ràng giữa khái niệm CHRE và một trung tâm cảm biến. Mặc dù thường 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 Context Hub HAL và đóng vai trò là một ứng dụng khách 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 liên quan đến AP.

Cấu trúc khung CHRE

Hình 1. Cấu trúc khung CHRE

HAL của Context Hub

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

Trong trường hợp có xung đột 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 bối cảnh nào trên thiết bị hay không. Đây là một lệnh gọi chặn, một lần, vì vậy, lệnh gọi này phải hoàn tất nhanh chóng để tránh làm chậm quá trình khởi động và phải trả về kết quả chính xác vì sau đó không thể giới thiệu các trung tâm bối cảnh mới.

Tải và dỡ nano ứng dụng

Một trung tâm bối cảnh có thể bao gồm một nhóm ứ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 nano ứng dụng được tải sẵn và phải có trong phản hồi đầu tiên có thể cho queryApps().

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

Nếu quá trình triển khai để tải một nano ứng dụng liên quan đến việc ghi ứng dụng đó vào bộ nhớ không biến đổi, chẳng hạn như bộ nhớ flash được gắn 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 nano ứng dụng độ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 nano ứng dụng đượ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 được 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 phép khởi động lại trong quá trình hoạt động bình thường, nhưng có thể cần thiết để khôi phục từ các điều kiện không mong muốn, chẳng hạn như nỗ lực truy cập vào một địa chỉ bộ nhớ chưa được ánh xạ. 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. HAL chỉ được gửi sự kiện này sau khi CHRE được khởi động lại đến mức 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 một cấu trúc hướng sự kiệ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 nano ứng dụng. Mặc dù khung CHRE có thể đa luồng, nhưng một nano ứng dụng nhất định sẽ không bao giờ được thực thi từ nhiều luồng song song. Khung CHRE tương tác với một nano ứng dụng nhất định thông qua một trong ba điểm truy cập nano ứng dụng (nanoappStart(), nanoappHandleEvent()nanoappEnd()) hoặc thông qua một lệnh gọi lại được cung cấp trong lệnh gọi API CHRE trước đó. Nano ứng dụng 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ộ khả năng cơ bản cũng như các phương tiện để truy cập vào tín hiệu theo bối cảnh, bao gồm cả cảm biến, GNSS, Wi-Fi, WWAN và âm thanh. API này có thể được mở rộng bằng các khả năng bổ sung dành riêng cho nhà cung cấp để các nano ứng dụng dành riêng cho nhà cung cấp sử dụng.

Hệ thống xây dựng

Mặc dù Context Hub HAL 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ó những yêu cầu khiến mã này không tương thích với hệ thống bản 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à (không bắt buộc) khung CHRE thành 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 các thiết bị mục tiêu của họ vào AOSP.

CHRE API đượ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 có tài nguyên hạn chế.

CHRE API

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 nano ứng dụng và hệ thống. CHRE được thiết kế để giúp mã nanoapp 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 của một nanoapp để hỗ trợ một loại thiết bị mới, mặc dù có thể bạn cần biên dịch lại mã nguồn đó cho tập lệnh 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. Thiết kế API và cấu trúc CHRE 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 của API CHRE. Điều này có nghĩa là ứng dụng nano không cần được biên dịch lại để chạy trên một hệ thống triển khai một phiên bản khác của API CHRE 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 một tệp nhị phân nanoapp 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 nanoapp đó vẫn tiếp tục hoạt động. Tương tự, nanoapp 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 xem có cần các chức năng của API phiên bản 1.3 để đạt được mục đích sử dụng hay không, hoặc có thể hoạt động hay không, có thể là với tính năng giảm cấp một cách linh hoạt.

Các phiên bản mới của CHRE API đượ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 việc triển khai của nhà cung cấp, nên phiên bản CHRE API được hỗ trợ trên một thiết bị không nhất thiết phải liên kết với một phiên bản Android.

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

Giống như sơ đồ phiên bản HIDL của Android, CHRE API tuân theo quy tắc đặt tên phiên bản theo 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 phụ được tăng lên khi các tính năng tương thích ngược được giới thiệu. CHRE API bao gồm chú thích 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ị một phiên bản vá lỗi dành riêng cho nền tảng thông qua chreGetVersion(), cho biết thời điểm các bản sửa lỗi hoặc bản cập nhật nhỏ được thực hiện trong quá trình triển khai.

Phiên bản 1.0 (Android 7)

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

Phiên bản 1.1 (Android 8)

Giới thiệu các chức năng vị trí thông qua vị trí GNSS và các phép đo 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 nano ứng dụng 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ô công suất thấp, phạm vi RTT Wi-Fi, thông báo đánh thức và ngủ AP, cùng các điểm cải tiến khác.

Phiên bản 1.3 (Android 10)

Nâng cao các chức năng liên quan đến dữ liệu hiệu chuẩn cảm biến, thêm tính năng hỗ trợ việc 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)

Thêm khả năng hỗ trợ cho thông tin về mạng di động 5G, kết xuất gỡ lỗi nanoapp 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 (chẳng hạn như cảm biến) được phân loại thành các vùng tính năng không bắt buộc, nhưng một số chức năng cốt lõi là bắt buộc đối với tất cả các hoạt động triển khai CHRE. Điều này bao gồm các API hệ thống cốt lõi, chẳng hạn như API để thiết lập bộ hẹn giờ, gửi và nhận thông báo cho các ứng dụng trên bộ xử lý ứng dụng, ghi 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 cốt lõi của hệ thống được mã hoá trong CHRE API, còn có các tính năng bắt buộc ở cấp hệ thống CHRE được chỉ định ở cấp Context Hub HAL. Quan trọng nhất trong số này là khả năng tải và huỷ tải nanoapp một cách linh hoạt.

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

  • Ngoại lệ C++ và thông tin kiểu thời gian chạy (RTTI)
  • Hỗ trợ đa luồng của thư viện chuẩn, bao gồm cả 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 việc phân bổ động, chẳng hạn như std::unique_ptr
  • Hỗ trợ bản địa hoá và ký tự Unicode
  • 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ụ: chreLog có thể được dùng để gỡ lỗi nhật ký nhắm đến hệ thống logcat của Android, trong đó một chương trình truyền thống hơn có thể dùng printf hoặc std::cout.

Ngược lại, bạn cần có một số chức năng của thư viện tiêu chuẩn. Việc triển khai nền tảng sẽ quyết định cách hiển thị các thư viện này thông qua thư viện tĩnh để đưa vào tệp nhị phân nanoapp hoặc bằng cách liên kết động giữa nanoapp 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:

    • Các thao tác cơ bản: ceilf, fabsf, floorf, fmaxf, fminf, fmodf, roundf, lroundf, remainderf
    • Hàm số mũ và hàm luỹ thừa: expf, log2f, powf, sqrtf
    • Hàm lượng giác và hàm hyperbolic: 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 nanoapp không được coi là có thể chuyển đổi giữa các cách triển khai CHRE, trừ phi nanoapp đó giới hạn các phần phụ thuộc bên ngoài của mình đối với các hàm CHRE API và các hàm thư viện tiêu chuẩn đã được 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, CHRE API được chia thành các khu vực tính năng. Đây là những khu vực không bắt buộc theo góc độ API. Mặc dù không bắt buộc phải có các tính năng này để hỗ trợ một chế độ triển khai CHRE tương thích, nhưng có thể bạn phải có các tính năng này để hỗ trợ một nano ứng dụng cụ thể. Ngay cả khi một nền tảng không hỗ trợ một nhóm API nhất định, thì các ứng dụng nano tham chiếu đến những hàm đó vẫn phải có khả năng 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à cảm biến tiệm cận. Các API này được thiết kế để cung cấp một bộ tính năng tương tự như Android Sensors API, bao gồm cả việc hỗ trợ việc xử lý hàng loạt các mẫu cảm biến để giảm mức tiêu thụ điện. Việc xử lý dữ liệu cảm biến trong CHRE giúp giảm đáng kể mức tiêu thụ điện năng và độ trễ khi 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 định vị toàn cầu (GNSS), bao gồm cả GPS và các chòm sao vệ tinh khác. Điều này bao gồm các yêu cầu về bản 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ó mối liên kết trực tiếp với hệ thống con GNSS, nên mức tiêu thụ đ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 không hoạt động trong toàn bộ vòng đời của một phiên vị trí.

Wi-Fi

CHRE cho phép tương tác với chip Wi-Fi, chủ yếu là cho mục đích xác định vị trí. Mặc dù GNSS hoạt động hiệu quả ở 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 được chi phí đánh thức AP để quét, CHRE có thể nghe kết quả quét Wi-Fi do chương trình cơ sở Wi-Fi thực hiện cho mục đích kết nối, thường không được gửi đến AP vì lý do nguồn điện. Việc tận dụng các hoạt động quét kết nối cho mục đích theo ngữ cảnh giúp giảm tổng số hoạt động quét Wi-Fi được thực hiện, từ đó tiết kiệm năng lượng.

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 các hoạt động 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 khứ hồi (RTT) đối với những điểm truy cập hỗ trợ tính năng này, cho phép xác định vị trí tương đối một cách chính xác.

WWAN

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

Âm thanh

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

Triển khai tham 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 bạn nên triển khai CHRE dựa trên cơ sở mã này để đảm bảo tính nhất quán và đẩy nhanh việc áp dụng các chức năng mới. Bạn có thể xem mã này như một bản tương tự của khung Android cốt lõi vì đây là một cách 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ù có thể tuỳ chỉnh và mở rộng bằng các chức năng dành riêng cho nhà cung cấp, nhưng bạn nên duy trì mã chung càng gần với mã tham chiếu càng tốt. Tương tự như HAL của Android, chế độ triển khai tham chiếu CHRE sử dụng nhiều lớp trừu tượng nền tảng để cho phép chế độ này được điều chỉnh cho phù hợp với mọi thiết bị đáp ứng các yêu cầu tối thiểu.

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