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

Các điện thoại thông minh có một số bộ xử lý, mỗi bộ xử lý được tối ưu hoá để hoạt động nhiệm vụ khác nhau. Tuy nhiên, Android chỉ chạy trên một bộ xử lý: các ứng dụng bộ xử lý (AP). AP được điều chỉnh để mang lại hiệu suất tuyệt vời khi bật màn hình các trường hợp sử dụng như chơi trò chơi nhưng lại quá khao khát hỗ trợ các tính năng đòi hỏi phải xử lý liên tục trong thời gian ngắn, ngay cả khi màn hình đã bị 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ông việc 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ý công suất thấp này bị hạn chế nhiều hơn và có thể khác nhau đáng kể, gây khó khăn cho việc phát triển trên nhiều nền tảng.

Môi trường thời gian chạy trung tâm ngữ cảnh (CHRE) cung cấp một nền tảng chung để chạy trên một bộ xử lý công suất thấp, với một đơn giản, được chuẩn hoá, API thân thiện với nhúng. CHRE giúp các OEM thiết bị và nhà sản xuất thiết bị đáng tin cậy của họ dễ dàng các đối tác giảm tải quá trình xử lý từ AP, để tiết kiệm pin và cải thiện nhiều trong trải nghiệm người dùng và tạo điều kiện cho lớp học này luôn kết nối, các tính năng nhận biết theo ngữ cảnh, đặc biệt là các tính năng liên quan đến việc áp dụng từ công nghệ học máy đến 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 gọi là nanoapps, thực thi trên bộ xử lý công suất thấp và tương tác với thông qua API CHRE chung. Để đẩy nhanh quá trình triển khai đúng cách CHRE API, một hoạt động triển khai tham chiếu trên nhiều nền tảng của CHRE được đưa vào trong AOSP (Dự án nguồn mở Android) 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 lớp trừu tượng của nền tảng (PAL). Ứng dụng nano hầu như luôn gắn liền với một hoặc nhiều ứng dụng khách đang chạy trong Android, tương tác với CHRE và ứng dụng nano thông qua quyền truy cập bị hạn chế ContextHubManager các API hệ thống.

Ở cấp độ cao, có thể vẽ sự 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++); Java không được hỗ trợ.
  • Do những hạn chế về tài nguyên và giới hạn về bảo mật, CHRE hiện không mở để các ứng dụng Android tuỳ ý 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 tệp đó.

Cần có sự khác biệt quan trọng giữa khái niệm CHRE và một trung tâm cảm biến. Mặc dù chúng 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, bản thân CHRE không cung cấp chức năng của cảm biến theo yêu cầu của Cảm biến Android Lớp trừu tượng phần cứng (HAL). CHRE gắn liền với HAL Hub Context và hoạt động như một ứng dụng khách của cảm biến dành riêng cho thiết bị khung nhận dữ liệu cảm biến mà không cần liên quan đến AP.

Kiến trúc khung CHRE

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

Lớp trừu tượng phần cứng (HAL) cho trung tâm ngữ 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à cách triển khai CHRE của thiết bị, được xác định tại hardware/interfaces/contexthub. Lớp trừu tượng phần cứng (HAL) cho trung tâm ngữ cảnh xác định các API mà thông qua đó khung Android khám phá các trung tâm ngữ cảnh có sẵn và ứng dụng nano của các trung tâm này, tương tác với các trung tâm đó nanoapps thông qua việc truyền thông báo và cho phép tải cũng như đã huỷ tải. Hoạt động triển khai tham chiếu của HAL Trung tâm ngữ cảnh hoạt động với bạn có thể xem cách triển khai 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 được ưu tiên.

Khởi chạy

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

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

Trung tâm ngữ cảnh có thể chứa một tập hợp các ứng dụng nano có sẵn trong thiết bị hình ảnh và được tải khi CHRE bắt đầu. Chúng được gọi là ứ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ể cho queryApps().

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

Nếu quá trình triển khai để tải ứng dụng nano bao gồm việc ghi ứng dụng vào định dạng không biến đổi bộ nhớ flash, chẳng hạn như bộ nhớ flash gắn với bộ xử lý chạy CHRE, thì Quá trình triển khai CHRE phải luôn khởi động bằng các ứng dụng nano động này trong trạng thái bị vô hiệu hoá. Đ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 Yêu cầu enableNanoapp() được nhận thông qua HAL. Ứng dụng nano tải trước có thể khởi chạy ở trạng thái đã bật.

Trung tâm ngữ 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 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 một cách độ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 mà sự kiện này chỉ được gửi sau khi khởi động lại CHRE điểm 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ế xung quanh một kiến trúc hướng sự kiện, trong đó đơn vị chính là tính toán 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. Trong khi khung CHRE có thể đa luồng, một ứng dụng nano nhất định 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 ứ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 một lệnh gọi lại 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 tập hợp các chức năng cũng như phương tiện để truy cập vào các tín hiệu bối cảnh, bao gồm cảm biến GNSS, Wi-Fi, WWAN và âm thanh. Bạn có thể mở rộng bộ xử lý này bằng cách bổ sung các chức năng dành riêng cho nhà cung cấp để các ứng dụng nano của nhà cung cấp sử dụng.

Hệ thống xây dựng

Trong khi lớp trừu tượng phần cứng (HAL) cho trung tâm ngữ cảnh và các thành phần cần thiết khác phía AP đã được xây dựng cùng với Android, 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 của Android, chẳng hạn như khi cần có phiên bản chuỗi công cụ. Do đó, dự án CHRE trong AOSP cung cấp bản dựng được đơn giản hoá một hệ thống dựa trên GNU Make để biên dịch các ứng dụng nano và CHRE (không bắt buộc) khung vào các thư viện có thể tích hợp được với hệ thống. Thiết bị các nhà sản xuất thêm dịch vụ hỗ trợ cho CHRE nên tích hợp dịch vụ hỗ trợ hệ thống xây dựng cho thiết bị mục tiêu của họ vào AOSP (Dự án nguồn mở Android).

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

API CHRE

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

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 dưới dạng CHRE là một phần của triển khai từ nhà cung cấp, 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 về phiên bản

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 lớn cho biết khả năng tương thích nhị phân, trong khi phiên bản nhỏ là tăng lên khi giới thiệu các tính năng tương thích ngược. API CHRE bao gồm chú giải 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ị một phiên bản vá 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ỏ việc triển khai.

Phiên bản 1.0 (Android 7)

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

Phiên bản 1.1 (Android 8)

Ra mắt tính năng định vị thông qua vị trí GNSS và các phép đo thô, Quét tìm Wi-Fi và thông tin mạng di động, cùng với các sàng lọc chung để cho phép giao tiếp giữa ứng dụng nano với nanoapp và các 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 qua micrô công suất thấp, phạm vi RTT của Wi-Fi, AP thông báo đánh thức và giấc ngủ cùng nhiều cải tiến khác.

Phiên bản 1.3 (Android 10)

Tăng cường các chức năng liên quan đến dữ liệu hiệu chỉnh cảm biến, hỗ trợ thêm xoá dữ liệu cảm biến được phân 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 sự kiện vị trí GNSS với các trường độ chính xác bổ sung.

Phiên bản 1.4 (Android 11)

Thêm 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 chế độ cài đặt khác các điểm cải tiến khác.

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

Mặc dù các nguồn tín hiệu bối cảnh, chẳng hạn như cảm biến, được phân loại thành các nguồn không bắt buộc khía cạnh tính năng, cần có một số chức năng cốt lõi trong toàn bộ CHRE thực tế. Đ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 để cài đặt hẹn giờ, gửi và nhận thông báo tới ứng dụng khách trên bộ xử lý ứng dụng, ghi nhật ký và các tính năng khác. Để biết toàn bộ thông tin chi tiết, 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 bắt buộc ở cấp hệ thống CHRE được chỉ định ở cấp HAL của Trung tâm ngữ cảnh. Chiến lược phát hành đĩa đơn quan trọng nhất trong số này là khả năng tải và gỡ tải một cách linh động ứng dụng nano.

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ỉ hỗ trợ một tập hợp con các thư viện C và C++ chuẩn và 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ố các tính năng bị loại trừ một cách rõ ràng do bộ nhớ và cấp hệ điều hành rộng lớn các thành phần phụ thuộc khác vì chúng được thay thế bằng các thành phần phù hợp hơn Các API dành riêng cho CHRE. Mặc dù chưa phải là một danh sách đầy đủ, nhưng sau đây không nhằm cung cấp các chức năng 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ợ đa luồng 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ủa 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à tiêu chuẩn khác các hàm thư viện 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 cả system, getenv
  • POSIX và các thư viện khác không được bao gồm trong ngôn ngữ C99 hoặc C++11 tiêu chuẩn

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 đến hệ thống logcat Android, trong đó chương trình truyền thống hơn có thể hãy sử dụng printf hoặc std::cout.

Ngược lại, một số chức năng của thư viện chuẩn là bắt buộc. Điều này phụ thuộc vào việc triển khai nền tảng để hiển thị những thông tin này thông qua thư viện tĩnh nhằm đưa vào trong 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. Chiến dịch 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: Hàm dấu phẩy động có độ chính xác đơn thường dùng:

    • Toán tử cơ bản: ceilf, fabsf, floorf, fmaxf, fminf, fmodf, roundf, lroundf, remainderf
    • Hàm số mũ và 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 tính năng bổ sung, nhưng ứng dụng nano không được xem là di động trên các phương thức triển khai CHRE trừ phi có quy tắc ràng buộc phần phụ thuộc bên ngoài vào các hàm API CHRE và thư viện 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, API CHRE được chia thành các lĩnh vực tính năng, được coi là không bắt buộc 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, chúng có thể cần có để 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, ứng dụng nano tham chiếu đến các hàm đó phải có khả năng tạo 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 cung cấp một bộ tính năng tương tự như các Cảm biến Android Các API, bao gồm cả tính năng hỗ trợ phân lô 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 tiết kiệm pin hơn nhiều và độ trễ thấp hơn xử lý tín hiệu chuyển động so với việc chạy trên AP.

GNSS (Hệ thống vệ tinh định vị toàn cầu)

CHRE cung cấp các API để yêu cầu dữ liệu vị trí qua hệ thống điều hướng chung hệ thống vệ tinh (GNSS), bao gồm GPS và các chòm sao vệ tinh khác. Chiến dịch 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ó đường liên kết trực tiếp đến GNSS hệ thống con, nguồn điện bị giảm so với các yêu cầu GNSS dựa trên AP, vì AP có thể duy trì 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 chip Wi-Fi, chủ yếu cho mục đích vị trí. Mặc dù GNSS hoạt động tốt đối với các địa điểm ngoài trời, nhưng kết quả của Tính năng quét tìm Wi-Fi có thể cung cấp thông tin vị trí chính xác trong nhà và ở chế độ phát triển ngoại tuyến. Ngoài việc tránh chi phí đánh thức AP để quét, CHRE có thể nghe kết quả quét tìm Wi-Fi do Wi-Fi thực hiện chương trình cơ sở cho mục đích kết nối, thường không được gửi đến AP vì lý do điện. Việc sử dụng tính năng quét khả năng kết nối để phục vụ mục đích theo bối cảnh để giảm tổng số lần quét tìm Wi-Fi đã thực hiện, giúp tiết kiệm điện năng.

Hỗ trợ cho Wi-Fi đã được thêm vào trong 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. Các khả năng này đã được mở rộng trong phiên bản 1.2 có khả năng thực hiện Thời gian khứ hồi (RTT) các phép đo lường đố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.

Thế chiến thứ hai

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 được sử dụng cho mục đích truy cập thông tin vị trí tương đối.

Âm thanh

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

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

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