Môi trường thời gian chạy của Context Hub (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 hóa để 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 tuyệt vời cho các trường hợp sử dụng trên màn hình chẳng hạn như chơi game, nhưng nó quá ngốn điện để hỗ trợ các tính năng yêu cầu xử lý liên tục trong thời gian ngắn, thường xuyên, ngay cả khi màn hình tắt. Bộ xử lý nhỏ hơn có thể xử lý khối lượng công việc này hiệu quả hơn, hoàn thành nhiệm vụ mà không ảnh hưởng đáng kể đến tuổi thọ pin. Tuy nhiên, môi trường phần mềm trong các bộ xử lý công suất 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 đa nền tảng trở nên khó khăn.

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ý tiêu thụ điện năng thấp, với API đơn giản, được tiêu chuẩn hóa và thân thiện với thiết bị nhúng. CHRE giúp các OEM thiết bị và các đối tác đáng tin cậy của họ dễ dàng giảm tải xử lý từ AP, để tiết kiệm pin và cải thiện các lĩnh vực khác nhau của trải nghiệm người dùng, đồng thời kích hoạt một lớp tính năng luôn bật, nhận biết theo ngữ cảnh, đặc biệt là các tính năng liên quan đến ứng dụng của máy học cách cảm nhận môi trường xung quanh.

Ý chính

CHRE là môi trường phần mềm nơi các ứng dụng gốc nhỏ, được gọi là ứng dụng nano , thực thi trên bộ xử lý tiêu thụ điện năng 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 việc triển khai đúng cách các API CHRE, việc triển khai CHRE tham chiếu đa nền tảng được đưa vào AOSP. Việc triển khai tham chiếu bao gồm mã chung và các phần trừu tượng hóa 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). Các ứng dụng nano hầu như luôn được gắn 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à ứng dụng nano thông qua API hệ thống ContextHubManager có quyền truy cập hạn chế.

Ở mức độ cao hơn, có thể thấy được sự tương đồng giữa kiến ​​trúc CHRE và Android nói chung. Tuy nhiên, có một số 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++); Java không được hỗ trợ.
  • Do hạn chế về tài nguyên và hạn chế về bảo mật, CHRE không được phép sử dụng bởi các ứng dụng Android tùy ý của bên thứ ba. Chỉ những ứng dụng được hệ thống tin cậy mới có thể truy cập nó.

Ngoài ra còn có sự khác biệt quan trọng giữa khái niệm CHRE và trung tâm cảm biến. Mặc dù người ta 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 chức năng cảm biến mà Android Sensors HAL yêu cầu. CHRE được liên kết với Context Hub HAL và hoạt động như một máy 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 liên quan đến AP.

Kiến trúc khung CHRE

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

Trung tâm bối cảnh HAL

Lớp trừu tượng phần cứng Context Hub (HAL) là giao diện giữa khung Android và triển khai CHRE của thiết bị, được xác định tại hardware/interfaces/contexthub . Context Hub HAL 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à 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 tin nhắn và cho phép tải và dỡ các ứng dụng nano. Việc triển khai tham chiếu của Context Hub HAL hoạt động với việc triển khai tham chiếu của CHRE có sẵn 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 tạo

Khi Android khởi động, ContextHubService sẽ gọi hàm getHubs() HAL để xác định xem có bất kỳ trung tâm ngữ cảnh nào có sẵn trên thiết bị hay không. Đây là lệnh gọi chặn, một lần nên phải hoàn thành 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ì sau đó không thể giới thiệu các trung tâm ngữ cảnh mới.

Đang tải và dỡ bỏ các ứ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. Chúng được gọi là ứng dụng nano được tải sẵn và phải được đưa vào phản hồi đầu tiên có thể có đối với queryApps() .

Context Hub HAL cũng hỗ trợ tải và dỡ tải các ứ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 ứng dụng nano liên quan đến việc ghi ứng dụng đó vào bộ nhớ không khả biến, chẳng hạn như bộ lưu trữ 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 ứng dụng nano động này ở trạng thái bị tắt. Điều này có nghĩa là không có mã nào của nanoapp đượ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 sẵn có thể khởi chạy ở trạng thái kích hoạt.

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

Mặc dù CHRE dự kiến ​​sẽ không 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 sau các điều kiện không mong muốn, chẳng hạn như cố gắng truy cập địa chỉ bộ nhớ chưa được ánh xạ. Trong những trường hợp này, CHRE 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ỉ phải gửi sau khi CHRE được khởi tạo 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 kiến ​​trúc hướng sự kiện, trong đó đơn vị tính toán chính là sự kiện được chuyển đến điểm đầu vào 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 đầu vào ứ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. API CHRE cung cấp một tập hợp các chức năng cơ bản cũng như các phương tiện để truy cập tín hiệu theo ngữ cảnh, bao gồm cảm biến, GNSS, Wi-Fi, WWAN và âm thanh, đồng thời có thể mở rộng với các khả 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 .

Xây dựng hệ thống

Mặc dù Context Hub HAL và các thành phần cần thiết khác bên AP được xây dựng cùng với Android, nhưng mã chạy trong CHRE có thể có các yêu cầu khiến mã này không tương thích với hệ thống xây dựng Android, chẳng hạn như nhu cầu về chuỗi công cụ chuyên dụng. Do đó, dự án CHRE trong AOSP cung cấp một hệ thống xây dựng đơn giản hóa dựa trên GNU Make để biên dịch các ứng dụng nano và, tùy chọn, khung CHRE thành các thư viện có thể được tích hợp với hệ thống. Các nhà sản xuất thiết bị bổ sung hỗ trợ cho CHRE nên tích hợp 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.

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

API CHRE

API CHRE là tập hợp các tệp tiêu đề C xác định giao diện phần mềm giữa ứng dụng nano và hệ thống. Nó được thiết kế để làm cho mã ứng dụng nano tương thích trên tất cả các thiết bị hỗ trợ CHRE, điều đó có nghĩa là mã nguồn của ứng dụng nano không cần phải sửa đổi để hỗ trợ loại thiết bị mới, mặc dù mã nguồn này có thể cần phải được biên dịch lại riêng cho bộ xử lý của thiết bị mục tiêu tập lệnh hoặc giao diện nhị phân ứng dụng (ABI). Kiến 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 các phiên bản khác nhau của API CHRE, có nghĩa là không cần phải biên dịch lại ứng dụng nano để chạy trên 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 dựa trên đó. Nói cách khác, nếu tệp nhị phân nanoapp chạy trên thiết bị hỗ trợ CHRE API v1.3 và thiết bị đó được nâng cấp để hỗ trợ CHRE API v1.4 thì tệp nhị phân nanoapp tương tự sẽ tiếp tục hoạt động. Tương tự, ứng dụng nano có thể chạy trên CHRE API v1.2 và có thể xác định trong thời gian chạy xem nó có yêu cầu chức năng từ API v1.3 để đạt được chức năng hay không hoặc liệu nó có thể hoạt động hay không, có khả năng bị suy giảm tính năng một cách nhẹ nhàng.

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 trong quá 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 được liên kết với phiên bản Android.

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

Giống như sơ đồ tạo phiên bản HIDL của Android , API CHRE tuân theo sơ đồ tạo phiên bản ngữ nghĩa . Phiên bản chính biểu thị 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. API CHRE bao gồm các chú thích mã nguồn để xác định phiên bản nào đã giới thiệu hàm hoặc tham số, ví dụ @since v1.1 .

Việc triển khai CHRE cũng hiển thị 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 sửa lỗi hoặc 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 ứng dụng nano cốt lõi, 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 khả năng định vị thông qua vị trí GNSS và các phép đo thô, quét Wi-Fi và thông tin mạng di động, cùng với các cải tiến chung để cho phép giao tiếp giữa ứng dụng nano với ứng dụng nano và các cải tiến khác.

Phiên bản 1.2 (Android 9)

Thêm hỗ trợ cho dữ liệu từ micrô công suất thấp, phạm vi Wi-Fi RTT, thông báo đánh thức/ngủ AP và các cải tiến khác.

Phiên bản 1.3 (Android 10)

Nâng cao các khả năng liên quan đến dữ liệu hiệu chuẩn cảm biến, bổ sung hỗ trợ xóa 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 định vị GNSS với các trường chính xác bổ sung.

Phiên bản 1.4 (Android 11)

Thêm hỗ trợ cho thông tin di động 5G, kết xuất gỡ lỗi ứng dụng nano và các cải tiến khác.

Tính năng hệ thống bắt buộc

Mặc dù các nguồn tín hiệu theo ngữ cảnh, như cảm biến, được phân loại thành các vùng tính năng tùy chọn, nhưng cần có một số chức năng cốt lõi trong tất cả quá trình 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ư các API để đặt bộ hẹn giờ, gửi và nhận tin nhắn cho khách hàng trên bộ xử lý ứng dụng, ghi nhật ký và các API khác. Để biết chi tiết đầ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ã hóa 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 Context Hub. Điều quan trọng nhất trong số này là khả năng tải và dỡ tải các ứng dụng nano 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, việc triển khai CHRE chỉ được yêu cầu hỗ trợ một tập hợp con của thư viện C và C++ tiêu chuẩn cũng như các tính năng ngôn ngữ yêu cầu hỗ trợ thời gian chạy. Tuân 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à/hoặc sự phụ thuộc rộng rãi ở cấp độ hệ điều hành, đồng thời các tính năng khác do 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 khả năng sau đây không nhằm mục đích cung cấp cho ứng dụng nano:

  • Ngoại lệ C++ và thông tin loại thời gian chạy (RTTI)
  • Hỗ trợ đa luồng thư viện tiêu chuẩn, bao gồm các tiêu đề C++11 <thread> , <mutex> , <atomic> , <future>
  • Thư viện đầu vào/đầu ra tiêu chuẩn C và C++
  • Thư viện mẫu chuẩn C++ (STL)
  • 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 phân bổ động, chẳng hạn như std::unique_ptr
  • Hỗ trợ bản địa hóa 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 máy chủ, 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, chức năng tương đương có sẵn từ các hàm API CHRE và/hoặc thư viện tiện ích. Ví dụ: chreLog có thể được sử dụng để ghi nhật ký gỡ lỗi nhắm mục tiêu đến 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. Việc triển khai nền tảng có tùy thuộc vào việc hiển thị những thông tin này thông qua các 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/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 được sử dụng:

    • Các phép toán cơ bản: ceilf , fabsf , floorf , fmaxf , fminf , fmodf , roundf , lroundf , remainderf
    • Hàm mũ/lũy thừa: expf , log2f , powf , sqrtf
    • Các hàm lượng giác/hyperbol: sinf , cosf , tanf , asinf , acosf , atan2f , tanhf

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

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 vùng tính năng, được coi là tùy chọn từ góc độ API. Mặc dù các tính năng này có thể không cần thiết để hỗ trợ triển khai CHRE tương thích nhưng chúng có thể được yêu cầu để hỗ trợ một ứng dụng nano cụ thể. Ngay cả khi nền tảng không hỗ trợ một bộ API nhất định, các ứng dụng nano tham chiếu các chức năng đó vẫn phải có khả năng xây dựng và tải.

Cảm biến

API CHRE 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 mục đích cung cấp một bộ tính năng tương tự như API cảm biến của Android, bao gồm hỗ trợ tạo các mẫu cảm biến theo lô để giảm mức tiêu thụ điện năng. Việc xử lý dữ liệu cảm biến trong CHRE cho phép xử lý tín hiệu chuyển động với công suất thấp hơn và độ trễ thấp hơn nhiều so với chạy trên AP.

GNSS

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

Wifi

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

Hỗ trợ Wi-Fi đã được thêm vào CHRE API v1.1, bao gồm khả năng giám sát kết quả quét và kích hoạt quét theo yêu cầu. Những khả 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 các điểm truy cập hỗ trợ tính năng này, cho phép xác định vị trí tương đối chính xác.

WWAN

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

Âm thanh

CHRE có thể xử lý hàng loạt dữ liệu âm thanh từ micrô công suất thấp, thường tận dụng phần cứng được sử 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.

Thực hiện tham khảo

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

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