Context Hub Runtime Environment (CHRE)

স্মার্টফোনে একাধিক প্রসেসর থাকে, প্রত্যেকটি আলাদা আলাদা টাস্ক পারফর্ম করার জন্য অপ্টিমাইজ করা হয়। তবে, Android শুধুমাত্র একটি প্রসেসরে চলে: অ্যাপ্লিকেশন প্রসেসর (AP)। স্ক্রিন-অন ব্যবহারের ক্ষেত্রে, যেমন গেমিং, AP-কে দুর্দান্ত পারফর্ম্যান্স দেওয়ার জন্য টিউন করা হয়েছে, কিন্তু এটি এমন ফিচারকে সাপোর্ট করার জন্য খুব বেশি পাওয়ার ব্যবহার করে, যার জন্য স্ক্রিন বন্ধ থাকলেও, ঘন ঘন, অল্প সময়ের জন্য প্রসেসিংয়ের প্রয়োজন হয়। ছোট প্রসেসরগুলি এই ধরনের ওয়ার্কলোড আরও দক্ষতার সাথে ম্যানেজ করতে পারে, ব্যাটারির আয়ুর উপর লক্ষণীয় প্রভাব না ফেলেই তাদের টাস্ক সম্পূর্ণ করে। তবে, এইসব লো-পাওয়ার প্রসেসরের সফ্টওয়্যার এনভায়রনমেন্ট আরও সীমিত এবং অনেক পরিবর্তন হতে পারে, যার ফলে ক্রস-প্ল্যাটফর্ম ডেভেলপমেন্ট কঠিন হয়ে যায়।

Context Hub রানটাইম এনভায়রনমেন্ট (CHRE) হল একটি সাধারণ প্ল্যাটফর্ম যা কম পাওয়ারের প্রসেসরে অ্যাপ চালানোর জন্য ব্যবহার করা হয়। এতে একটি সহজ, স্ট্যান্ডার্ডাইজড, এম্বেড-ফ্রেন্ডলি API থাকে। CHRE, ডিভাইস OEM এবং তাদের বিশ্বস্ত পার্টনারদের জন্য AP থেকে প্রসেসিং অফলোড করা সহজ করে তোলে, এর ফলে ব্যাটারি সেভ করা যায় এবং ব্যবহারকারীর অভিজ্ঞতার বিভিন্ন দিক উন্নত করা যায় এবং সবসময় চালু থাকা, প্রাসঙ্গিক ফিচার চালু করা যায়, বিশেষ করে সেইসব ফিচার যেগুলিতে অ্যাম্বিয়েন্ট সেন্সিংয়ের জন্য মেশিন লার্নিং প্রয়োগ করা হয়।

মূল ধারণা

CHRE হল সফ্টওয়্যার এনভায়রনমেন্ট যেখানে ছোট নেটিভ অ্যাপ, যাকে ন্যানোঅ্যাপ বলা হয়, কম পাওয়ারের প্রসেসরে এক্সিকিউট হয় এবং সাধারণ CHRE API-এর মাধ্যমে অন্তর্নিহিত সিস্টেমের সাথে ইন্টার‍্যাক্ট করে। CHRE API সঠিকভাবে প্রয়োগ করার প্রসেস দ্রুততর করতে, CHRE-এর ক্রস-প্ল্যাটফর্ম রেফারেন্স প্রয়োগ AOSP-তে অন্তর্ভুক্ত করা হয়েছে। রেফারেন্স ইমপ্লিমেন্টেশনে সাধারণ কোড এবং প্ল্যাটফর্ম অ্যাবস্ট্রাকশন লেয়ারের (PALs) সিরিজের মাধ্যমে অন্তর্নিহিত হার্ডওয়্যার ও সফ্টওয়্যারের অ্যাবস্ট্রাকশন অন্তর্ভুক্ত থাকে। ন্যানোঅ্যাপ প্রায় সবসময় Android-এ রান করা এক বা একাধিক ক্লায়েন্ট অ্যাপের সাথে যুক্ত থাকে, যা CHRE ও ন্যানোঅ্যাপের সাথে সীমিত অ্যাক্সেস ContextHubManager সিস্টেম API-এর মাধ্যমে ইন্টার‍্যাক্ট করে।

উচ্চ স্তরে, CHRE এবং Android-এর আর্কিটেকচারের মধ্যে সামঞ্জস্য দেখা যায়। তবে, কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে:

  • CHRE শুধুমাত্র নেটিভ কোডে (C বা C++) ডেভেলপ করা ন্যানোঅ্যাপ চালানোর জন্য কাজ করে; জাভা কাজ করে না।
  • রিসোর্স সংক্রান্ত সীমাবদ্ধতা ও নিরাপত্তা সংক্রান্ত সীমাবদ্ধতার কারণে, CHRE যেকোনও থার্ড-পার্টি Android অ্যাপের ব্যবহারের জন্য উন্মুক্ত নয়। শুধুমাত্র সিস্টেম-বিশ্বস্ত অ্যাপই এটি অ্যাক্সেস করতে পারবে।

এছাড়াও, CHRE-এর ধারণা এবং সেন্সর হাবের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। সেন্সর হাব ও CHRE প্রয়োগ করার জন্য একই হার্ডওয়্যার ব্যবহার করা সাধারণ ব্যাপার হলেও, CHRE নিজে Android Sensors HAL-এর জন্য প্রয়োজনীয় সেন্সর ক্ষমতা প্রদান করে না। CHRE, Context Hub HAL-এর সাথে যুক্ত থাকে এবং এটি AP-কে অন্তর্ভুক্ত না করেই সেন্সর ডেটা পাওয়ার জন্য ডিভাইস-নির্দিষ্ট সেন্সর ফ্রেমওয়ার্কের ক্লায়েন্ট হিসেবে কাজ করে।

CHRE ফ্রেমওয়ার্ক আর্কিটেকচার

ছবি ১. CHRE ফ্রেমওয়ার্ক আর্কিটেকচার

Context Hub HAL

Context Hub হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) হল Android ফ্রেমওয়ার্ক এবং ডিভাইসের CHRE ইমপ্লিমেন্টেশনের মধ্যে ইন্টারফেস, যা hardware/interfaces/contexthub-এ সংজ্ঞায়িত করা হয়েছে। Context Hub HAL সেই API-কে সংজ্ঞায়িত করে যার মাধ্যমে Android ফ্রেমওয়ার্ক উপলভ্য কন্টেক্সট হাব ও তার ন্যানোঅ্যাপ খুঁজে পায়, মেসেজ পাস করার মাধ্যমে সেইসব ন্যানোঅ্যাপের সাথে ইন্টার‍্যাক্ট করে এবং ন্যানোঅ্যাপ লোড ও আনলোড করার অনুমতি দেয়। Context Hub HAL-এর একটি রেফারেন্স ইমপ্লিমেন্টেশন যা CHRE-এর রেফারেন্স ইমপ্লিমেন্টেশনের সাথে কাজ করে তা system/chre/host-এ উপলভ্য।

এই ডকুমেন্টেশন এবং HAL ডেফিনিশনের মধ্যে কোনও বিরোধ দেখা দিলে, HAL ডেফিনিশনকে অগ্রাধিকার দেওয়া হবে।

ইনিশিয়ালাইজেশন

Android বুট আপ হলে, ContextHubService getHubs() HAL ফাংশন কল করে নির্ধারণ করে যে ডিভাইসে কোনও কন্টেক্সট হাব উপলভ্য আছে কিনা। এটি একটি ব্লকিং, ওয়ান-টাইম কল, তাই বুট ডিলে এড়াতে এটি দ্রুত সম্পূর্ণ হতে হবে এবং এটি অবশ্যই সঠিক ফলাফল রিটার্ন করবে, কারণ পরে নতুন কনটেক্সট হাব আর যোগ করা যাবে না।

ন্যানোঅ্যাপ লোড ও আনলোড করা

কন্টেক্সট হাবে ন্যানোঅ্যাপের একটি সেট অন্তর্ভুক্ত থাকতে পারে যা ডিভাইসের ছবিতে অন্তর্ভুক্ত থাকে এবং CHRE শুরু হলে লোড হয়। এগুলিকে প্রি-লোডেড ন্যানোঅ্যাপ বলা হয়, এবং queryApps()-এর প্রথম সম্ভাব্য উত্তরে এগুলি অন্তর্ভুক্ত করতে হবে।

এছাড়াও, Context Hub HAL, loadNanoApp() ও unloadNanoApp() ফাংশনের মাধ্যমে রানটাইমে ডায়নামিক ন্যানোঅ্যাপ লোড ও আনলোড করতে পারে। CHRE হার্ডওয়্যার ও ডিভাইসের সফ্টওয়্যার ইমপ্লিমেন্টেশনের জন্য নির্দিষ্ট বাইনারি ফর্ম্যাটে HAL-কে ন্যানোঅ্যাপ প্রদান করা হয়।

কোনও ন্যানোঅ্যাপ লোড করার জন্য ইমপ্লিমেন্টেশনে যদি CHRE রান করে এমন প্রসেসরের সাথে অ্যাটাচ করা ফ্ল্যাশ স্টোরেজের মতো নন-ভোলাটাইল মেমরিতে সেটি লেখার প্রয়োজন হয়, তাহলে CHRE ইমপ্লিমেন্টেশনকে অবশ্যই এই ডাইনামিক ন্যানোঅ্যাপগুলি ডিজেবল অবস্থায় বুট-আপ করতে হবে। এর অর্থ হল, HAL-এর মাধ্যমে কোনও enableNanoapp() অনুরোধ না পাওয়া পর্যন্ত ন্যানোঅ্যাপের কোনও কোড এক্সিকিউট করা হয় না। প্রিলোড করা ন্যানোঅ্যাপ চালু করা অবস্থায় শুরু হতে পারে।

কনটেক্সট হাব রিস্টার্ট হয়

সাধারণ অপারেশন চলাকালীন CHRE রিস্টার্ট হওয়ার কথা নয়, তবে ম্যাপ করা নেই এমন মেমরি অ্যাড্রেস অ্যাক্সেস করার চেষ্টা করার মতো অপ্রত্যাশিত পরিস্থিতি থেকে রিকভার করার জন্য এটি প্রয়োজন হতে পারে। এইসব পরিস্থিতিতে, CHRE Android থেকে আলাদাভাবে রিস্টার্ট হয়। HAL, Android-কে এই বিষয়ে RESTARTED ইভেন্টের মাধ্যমে জানায়। CHRE আবার চালু করার পরে নতুন অনুরোধ গ্রহণ করতে পারলেই এটি পাঠাতে হবে, যেমন queryApps()।

CHRE সিস্টেম ওভারভিউ

CHRE ইভেন্ট-ভিত্তিক আর্কিটেকচারের উপর ভিত্তি করে ডিজাইন করা হয়েছে, যেখানে কম্পিউটেশনের প্রাথমিক ইউনিট হল কোনও ন্যানোঅ্যাপের ইভেন্ট হ্যান্ডেলিং এন্ট্রি পয়েন্টে পাস করা ইভেন্ট। CHRE ফ্রেমওয়ার্ক মাল্টিথ্রেডেড হলেও, কোনও ন্যানোঅ্যাপকে একসাথে একাধিক থ্রেড থেকে কখনওই এক্সিকিউট করা হয় না। CHRE ফ্রেমওয়ার্ক, তিনটি ন্যানোঅ্যাপ এন্ট্রি পয়েন্টের (nanoappStart(), nanoappHandleEvent() এবং nanoappEnd()) মধ্যে একটির মাধ্যমে অথবা আগের CHRE API কলে দেওয়া কলব্যাকের মাধ্যমে প্রদত্ত ন্যানোঅ্যাপের সাথে ইন্টার‍্যাক্ট করে এবং CHRE API-এর মাধ্যমে CHRE ফ্রেমওয়ার্ক ও আন্ডারলাইং সিস্টেমের সাথে ন্যানোঅ্যাপ ইন্টার‍্যাক্ট করে। CHRE API, কনটেক্সচুয়াল সিগন্যাল অ্যাক্সেস করার জন্য সুবিধা সহ বেশ কিছু প্রাথমিক ক্ষমতা প্রদান করে, যার মধ্যে সেন্সর, GNSS, ওয়াই-ফাই, WWAN ও অডিও অন্তর্ভুক্ত এবং এটি অতিরিক্ত ভেন্ডর-নির্দিষ্ট ক্ষমতার সাথেও বাড়ানো যেতে পারে যা ভেন্ডর-নির্দিষ্ট ন্যানোঅ্যাপ ব্যবহার করতে পারে।

বিল্ড সিস্টেম

Android-এর পাশাপাশি Context Hub HAL ও অন্যান্য প্রয়োজনীয় AP-সাইড কম্পোনেন্ট তৈরি করা হলেও, CHRE-এর মধ্যে রান করা কোডের এমন কিছু প্রয়োজনীয়তা থাকতে পারে যা এটিকে Android বিল্ড সিস্টেমের সাথে ইনকম্প্যাটিবল করে তোলে, যেমন বিশেষ টুলচেনের প্রয়োজন। তাই, AOSP-তে CHRE প্রোজেক্ট ন্যানোঅ্যাপ কম্পাইল করার জন্য GNU Make-এর উপর ভিত্তি করে একটি সরলীকৃত বিল্ড সিস্টেম প্রদান করে এবং ঐচ্ছিকভাবে, CHRE ফ্রেমওয়ার্ককে লাইব্রেরিতে পরিণত করে যা সিস্টেমের সাথে ইন্টিগ্রেট করা যেতে পারে। CHRE-এর জন্য সহায়তা যোগ করা ডিভাইস প্রস্তুতকারকদের AOSP-তে তাদের টার্গেট ডিভাইসের জন্য বিল্ড সিস্টেম সহায়তা ইন্টিগ্রেট করতে হবে।

CHRE API C99 ল্যাঙ্গুয়েজ স্ট্যান্ডার্ডে লেখা হয় এবং রেফারেন্স ইমপ্লিমেন্টেশন রিসোর্স-লিমিটেড অ্যাপের জন্য উপযুক্ত C++11-এর সীমিত সাবসেট ব্যবহার করে।

CHRE API

CHRE API হল C হেডার ফাইলের একটি সংগ্রহ যা একটি ন্যানোঅ্যাপ এবং সিস্টেমের মধ্যে সফ্টওয়্যার ইন্টারফেসকে সংজ্ঞায়িত করে। এটি CHRE কাজ করে এমন সব ডিভাইস জুড়ে ন্যানোঅ্যাপ কোডকে মানানসই করে তোলার জন্য ডিজাইন করা হয়েছে, যার অর্থ হল, নতুন ডিভাইস টাইপের সাথে কাজ করার জন্য ন্যানোঅ্যাপের সোর্স কোড পরিবর্তন করার প্রয়োজন নেই, যদিও টার্গেট ডিভাইসের প্রসেসর নির্দেশাবলী সেট বা অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI)-এর জন্য এটি বিশেষভাবে আবার কম্পাইল করার প্রয়োজন হতে পারে। এছাড়াও, CHRE আর্কিটেকচার ও API ডিজাইন এটিও নিশ্চিত করে যে CHRE API-এর বিভিন্ন ভার্সন জুড়ে ন্যানোঅ্যাপ বাইনারি কম্প্যাটিবল, যার অর্থ হল, যে টার্গেট API-এর সাথে তুলনা করে কোনও ন্যানোঅ্যাপ কম্পাইল করা হয়, CHRE API-এর অন্য কোনও ভার্সন প্রয়োগ করা সিস্টেমে সেটি চালানোর জন্য ন্যানোঅ্যাপকে আবার কম্পাইল করতে হয় না। অন্যভাবে বলতে গেলে, CHRE API v1.3 কাজ করে এমন ডিভাইসে ন্যানোঅ্যাপ বাইনারি রান করলে এবং সেই ডিভাইস CHRE API v1.4-এ আপগ্রেড করা হলে, একই ন্যানোঅ্যাপ বাইনারি কাজ করা চালিয়ে যায়। একইভাবে, ন্যানোঅ্যাপ CHRE API v1.2-এ রান করতে পারে, এবং রানটাইমে নির্ধারণ করতে পারে যে এটির ব্যবহার অর্জনের জন্য API v1.3 থেকে ক্ষমতার প্রয়োজন আছে কিনা, অথবা এটি কাজ করতে পারে কিনা, সম্ভাব্যভাবে সুন্দর ফিচার ডিগ্রেডেশনের সাথে।

Android-এর সাথে CHRE API-এর নতুন ভার্সন রিলিজ করা হয়, তবে CHRE ইমপ্লিমেন্টেশন ভেন্ডর ইমপ্লিমেন্টেশনের অংশ হওয়ায়, কোনও ডিভাইসে কাজ করে এমন CHRE API ভার্সন Android ভার্সনের সাথে লিঙ্ক করা নাও থাকতে পারে।

ভার্সনের সারসংক্ষেপ

Android HIDL ভার্সনিং স্কিম-এর মতো, CHRE API সিম্যান্টিক ভার্সনিং অনুসরণ করে। মেজর ভার্সন বাইনারি কম্প্যাটিবিলিটি নির্দেশ করে, অন্যদিকে ব্যাকওয়ার্ড-কম্প্যাটিবল ফিচার যোগ করা হলে মাইনর ভার্সন ইনক্রিমেন্ট করা হয়। CHRE API-তে কোন ভার্সন কোনও ফাংশন বা প্যারামিটার চালু করেছে তা শনাক্ত করার জন্য সোর্স কোড অ্যানোটেশন অন্তর্ভুক্ত থাকে, যেমন @since v1.1।

এছাড়াও, CHRE প্রয়োগের মাধ্যমে প্ল্যাটফর্ম-নির্দিষ্ট প্যাচ ভার্সন প্রকাশ করা হয় chreGetVersion(), যা প্রয়োগে কখন বাগ ফিক্স বা মাইনর আপডেট করা হয়েছে তা নির্দেশ করে।

প্রতিটি ভার্সনের সারসংক্ষেপের জন্য, version.h দেখুন।

বাধ্যতামূলক সিস্টেম ফিচার

সেন্সরের মতো প্রাসঙ্গিক সিগন্যালের সোর্সকে ঐচ্ছিক ফিচার বিভাগে শ্রেণীবদ্ধ করা হলেও, সব CHRE ইমপ্লিমেন্টেশন জুড়ে কিছু মূল ফাংশন প্রয়োজন। এর মধ্যে কোর সিস্টেম API অন্তর্ভুক্ত, যেমন টাইমার সেট করা, অ্যাপ্লিকেশন প্রসেসরে ক্লায়েন্টদের মেসেজ পাঠানো ও গ্রহণ করা, লগিং এবং অন্যান্য। সম্পূর্ণ বিবরণের জন্য, API হেডার দেখুন।

CHRE API-তে কোড করা মূল সিস্টেম ফিচারের পাশাপাশি, Context Hub HAL লেভেলে নির্দিষ্ট করা বাধ্যতামূলক CHRE সিস্টেম-লেভেল ফিচারও রয়েছে। এগুলির মধ্যে সবচেয়ে গুরুত্বপূর্ণ হল ন্যানোঅ্যাপ ডায়নামিক্যালি লোড ও আনলোড করার ক্ষমতা।

C/C++ স্ট্যান্ডার্ড লাইব্রেরি

মেমরির ব্যবহার ও সিস্টেমের জটিলতা কমাতে, CHRE ইমপ্লিমেন্টেশনের জন্য স্ট্যান্ডার্ড C ও C++ লাইব্রেরির শুধুমাত্র একটি সাবসেট এবং রানটাইম সাপোর্ট প্রয়োজন হয় এমন ল্যাঙ্গুয়েজ ফিচার প্রয়োজন। এইসব নীতি মেনে, কিছু ফিচারকে স্পষ্টভাবে বাদ দেওয়া হয়েছে কারণ সেগুলি মেমরি ও OS-লেভেলে অনেক বেশি নির্ভর করে এবং অন্যান্য ফিচারকে বাদ দেওয়া হয়েছে কারণ সেগুলির পরিবর্তে আরও উপযুক্ত CHRE-নির্দিষ্ট API ব্যবহার করা হয়। যদিও এটি সম্পূর্ণ তালিকা নয়, নিম্নলিখিত ক্ষমতাগুলি ন্যানোঅ্যাপের জন্য উপলভ্য করার উদ্দেশ্যে তৈরি করা হয়নি:

  • C++ ব্যতিক্রম এবং রানটাইম টাইপ তথ্য (RTTI)
  • C++11 হেডার সহ স্ট্যান্ডার্ড লাইব্রেরি মাল্টিথ্রেডিং সাপোর্ট <thread>, <mutex>, <atomic>, <future>
  • C এবং C++ স্ট্যান্ডার্ড ইনপুট/আউটপুট লাইব্রেরি
  • C++ স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরি (STL)
  • C++ স্ট্যান্ডার্ড রেগুলার এক্সপ্রেশন লাইব্রেরি
  • স্ট্যান্ডার্ড ফাংশনের মাধ্যমে ডায়নামিক মেমরি অ্যালোকেশন (যেমন, malloc, calloc, realloc, free, operator new) এবং অন্যান্য স্ট্যান্ডার্ড লাইব্রেরি ফাংশন যা স্বভাবতই ডায়নামিক অ্যালোকেশন ব্যবহার করে, যেমন std::unique_ptr
  • লোকালাইজেশন ও ইউনিকোড অক্ষর সংক্রান্ত সহায়তা
  • তারিখ ও সময় লাইব্রেরি
  • সাধারণ প্রোগ্রাম ফ্লো পরিবর্তন করে এমন ফাংশন, যার মধ্যে <setjmp.h>, <signal.h>, abort, std::terminate অন্তর্ভুক্ত
  • system, getenv সহ হোস্ট এনভায়রনমেন্ট অ্যাক্সেস করা
  • C99 বা C++11 ল্যাঙ্গুয়েজ স্ট্যান্ডার্ডে অন্তর্ভুক্ত নয় এমন POSIX ও অন্যান্য লাইব্রেরি

অনেক ক্ষেত্রে, CHRE API ফাংশন এবং ইউটিলিটি লাইব্রেরি থেকে সমতুল্য ক্ষমতা উপলভ্য। যেমন, Android logcat সিস্টেমের জন্য টার্গেট করা ডিবাগ লগিংয়ের ক্ষেত্রে chreLog ব্যবহার করা যেতে পারে, যেখানে আরও বেশি ঐতিহ্যবাহী প্রোগ্রাম printf বা std::cout ব্যবহার করতে পারে।

অন্যদিকে, কিছু স্ট্যান্ডার্ড লাইব্রেরি ক্ষমতা প্রয়োজন। ন্যানোঅ্যাপ বাইনারিতে অন্তর্ভুক্ত করার জন্য স্ট্যাটিক লাইব্রেরির মাধ্যমে এগুলি এক্সপোজ করা অথবা ন্যানোঅ্যাপ ও সিস্টেমের মধ্যে ডায়নামিক লিঙ্কিংয়ের মাধ্যমে এগুলি এক্সপোজ করা প্ল্যাটফর্মের উপর নির্ভর করে। এর মধ্যে এগুলি সহ আরও অনেক কিছু পড়ে:

  • স্ট্রিং ও অ্যারে ইউটিলিটি: memcmp, memcpy, memmove, memset, strlen
  • গণিত লাইব্রেরি: সাধারণত ব্যবহৃত সিঙ্গেল-প্রিসিশন ফ্লোটিং-পয়েন্ট ফাংশন:

    • প্রাথমিক অপারেশন: ceilf, fabsf, floorf, fmaxf, fminf, fmodf, roundf, lroundf, remainderf
    • এক্সপোনেনশিয়াল ও পাওয়ার ফাংশন: expf, log2f, powf, sqrtf
    • ত্রিকোণমিতিক এবং হাইপারবোলিক ফাংশন: sinf, cosf, tanf, asinf, acosf, atan2f, tanhf

কিছু অন্তর্নিহিত প্ল্যাটফর্ম অতিরিক্ত কার্যকারিতা সমর্থন করলেও, কোনও ন্যানোঅ্যাপকে CHRE ইমপ্লিমেন্টেশন জুড়ে পোর্টেবল হিসেবে বিবেচনা করা হয় না, যদি না এটি CHRE API ফাংশন এবং অনুমোদিত স্ট্যান্ডার্ড লাইব্রেরি ফাংশনে তার এক্সটার্নাল ডিপেন্ডেন্সি সীমাবদ্ধ করে।

ঐচ্ছিক ফিচার

হার্ডওয়্যার ও সফ্টওয়্যারকে প্রোমোট করতে, CHRE API-কে ফিচার এরিয়াতে ভাগ করা হয়েছে, যেগুলি API-এর দৃষ্টিকোণ থেকে ঐচ্ছিক হিসেবে বিবেচনা করা হয়। মানানসই CHRE ইমপ্লিমেন্টেশনের ক্ষেত্রে এইসব ফিচার প্রয়োজন না হলেও, কোনও নির্দিষ্ট ন্যানোঅ্যাপের ক্ষেত্রে এগুলি প্রয়োজন হতে পারে। এমনকি কোনও প্ল্যাটফর্ম যদি প্রদত্ত API-এর সেটকে সমর্থন না করে, তাহলে সেই ফাংশনগুলিকে রেফারেন্স করে এমন ন্যানোঅ্যাপগুলি অবশ্যই তৈরি এবং লোড করতে সক্ষম হতে হবে।

সেন্সর

CHRE API, অ্যাক্সিলরোমিটার, জাইরোস্কোপ, ম্যাগনেটোমিটার, অ্যাম্বিয়েন্ট লাইট সেন্সর ও প্রক্সিমিটি সহ বিভিন্ন সেন্সর থেকে ডেটা অনুরোধ করার সুবিধা প্রদান করে। এইসব API-এর উদ্দেশ্য হল, ব্যাচিং সেন্সর স্যাম্পেল সহ Android Sensors API-এর মতো ফিচার সেট প্রদান করা, যাতে বিদ্যুৎ খরচ কমানো যায়। CHRE-এর মধ্যে সেন্সর ডেটা প্রসেস করা হলে, AP-তে রান করার তুলনায় অনেক কম পাওয়ার ও কম লেটেন্সি সহ মোশন সিগন্যাল প্রসেস করা যায়।

GNSS

CHRE, GPS ও অন্যান্য স্যাটেলাইট কনস্টেলেশন সহ গ্লোবাল নেভিগেশন স্যাটেলাইট সিস্টেম (GNSS) থেকে লোকেশন ডেটা অনুরোধ করার জন্য API প্রদান করে। এর মধ্যে পিরিয়ডিক পজিশন ফিক্সের অনুরোধের পাশাপাশি র মেজারমেন্ট ডেটাও অন্তর্ভুক্ত, যদিও দুটিই স্বতন্ত্র ক্ষমতা। CHRE-এর সাথে GNSS সাবসিস্টেমের সরাসরি লিঙ্ক থাকার কারণে, AP-ভিত্তিক GNSS অনুরোধের তুলনায় কম ব্যাটারি খরচ হয়, কারণ লোকেশন সেশনের সম্পূর্ণ লাইফসাইকেল চলাকালীন AP স্লিপ মোডে থাকতে পারে।

ওয়াই-ফাই

CHRE, ওয়াই-ফাই চিপের সাথে ইন্টার‍্যাক্ট করার ক্ষমতা প্রদান করে, মূলত লোকেশন সংক্রান্ত উদ্দেশ্যে। আউটডোর লোকেশনের জন্য GNSS ভালো কাজ করলেও, ইনডোর ও উন্নত এলাকায় ওয়াই-ফাই স্ক্যানের ফলাফল সঠিক লোকেশন সংক্রান্ত তথ্য প্রদান করতে পারে। স্ক্যান করার জন্য AP চালু করার খরচ এড়ানোর পাশাপাশি, CHRE কানেক্টিভিটির উদ্দেশ্যে ওয়াই-ফাই ফার্মওয়্যার দ্বারা সম্পাদিত ওয়াই-ফাই স্ক্যানের ফলাফল শুনতে পারে, যা সাধারণত পাওয়ারের কারণে AP-তে ডেলিভার করা হয় না। প্রাসঙ্গিক উদ্দেশ্যে কানেক্টিভিটি স্ক্যান ব্যবহার করলে, সম্পূর্ণ করা ওয়াই-ফাই স্ক্যানের মোট সংখ্যা কমাতে সাহায্য করে, যার ফলে পাওয়ার সাশ্রয় হয়।

CHRE API v1.1-এ ওয়াই-ফাইয়ের জন্য সহায়তা যোগ করা হয়েছে, যার মধ্যে স্ক্যান ফলাফল মনিটর করা এবং চাহিদা অনুযায়ী স্ক্যান ট্রিগার করার ক্ষমতা অন্তর্ভুক্ত। এইসব ক্ষমতাকে v1.2-এ আরও বাড়ানো হয়েছে, এর ফলে ফিচার কাজ করে এমন অ্যাক্সেস পয়েন্টের বিরুদ্ধে রাউন্ড-ট্রিপ টাইম (RTT) পরিমাপ করা যায়, যা সঠিক আপেক্ষিক পজিশন নির্ধারণ করতে সাহায্য করে।

WWAN

CHRE API, পরিষেবা প্রদানকারী সেল ও তার প্রতিবেশী সেলের জন্য সেল শনাক্তকরণ সংক্রান্ত তথ্য রিট্রিভ করার ক্ষমতা প্রদান করে, যা সাধারণত মোটামুটি লোকেশন সংক্রান্ত উদ্দেশ্যে ব্যবহার করা হয়।

অডিও

CHRE কম পাওয়ারের মাইক্রোফোন থেকে অডিও ডেটার ব্যাচ প্রসেস করতে পারে, যা সাধারণত SoundTrigger HAL প্রয়োগ করার জন্য ব্যবহৃত হার্ডওয়্যারকে কাজে লাগায়। CHRE-এ অডিও ডেটা প্রসেস করা হলে, মোশন সেন্সরের মতো অন্যান্য ডেটার সাথে তা ফিউজ করা যেতে পারে।

ব্লুটুথ

CHRE এমন API প্রদান করে যা ব্লুটুথ ফাংশনালিটির একটি সাবসেটকে সমর্থন করে যা কম-পাওয়ার অফলোডিং থেকে উপকৃত হয়। CHRE, AP-কে না জাগিয়েই ন্যানোঅ্যাপকে BLE স্ক্যান করতে, RSSI মনিটর করতে এবং BLE বিজ্ঞাপন ডেটা প্রসেস করতে দেয়। এছাড়াও, একটি প্রতিষ্ঠিত ব্লুটুথ সকেট কানেকশনের মালিকানা অফলোড ডোমেনে সরানো যেতে পারে, যার রক্ষণাবেক্ষণের জন্য কম শক্তির প্রয়োজন হয় এবং ন্যানোঅ্যাপগুলিকে অফলোড করা BLE সকেট কানেকশনের মাধ্যমে যোগাযোগ করার অনুমতি দেয়।

রেফারেন্স প্রয়োগ করা

CHRE ফ্রেমওয়ার্কের রেফারেন্স কোড AOSP-তে system/chre প্রোজেক্টে অন্তর্ভুক্ত করা হয়েছে, এটি C++11-এ প্রয়োগ করা হয়েছে। এটি কঠোরভাবে প্রয়োজনীয় না হলেও, সমস্ত CHRE ইমপ্লিমেন্টেশনকে এই কোডবেসের উপর ভিত্তি করে তৈরি করার জন্য সাজেস্ট করা হয়, যাতে সামঞ্জস্য নিশ্চিত করা যায় এবং নতুন ক্ষমতার গ্রহণকে ত্বরান্বিত করা যায়। এই কোডটিকে কোর Android ফ্রেমওয়ার্কের অ্যানালগ হিসেবে দেখা যেতে পারে, কারণ এটি হল API-এর ওপেন-সোর্স ইমপ্লিমেন্টেশন যা অ্যাপ ব্যবহার করে এবং এটি মানানসই হওয়ার জন্য বেসলাইন ও স্ট্যান্ডার্ড হিসেবে কাজ করে। যদিও এটি কাস্টমাইজ করা যেতে পারে এবং বিক্রেতা-নির্দিষ্ট ক্ষমতার সাথে প্রসারিত করা যেতে পারে, তবে সাধারণ কোডটি রেফারেন্সের যতটা সম্ভব কাছাকাছি রাখার পরামর্শ দেওয়া হয়। Android-এর HAL-এর মতো, CHRE রেফারেন্স ইমপ্লিমেন্টেশন বিভিন্ন প্ল্যাটফর্ম অ্যাবস্ট্রাকশন ব্যবহার করে যাতে এটি ন্যূনতম প্রয়োজনীয়তা পূরণকারী যেকোনও ডিভাইসে অ্যাডাপ্ট করা যায়।

টেকনিক্যাল বিবরণ ও পোর্টিং গাইড পেতে, system/chre প্রোজেক্টে অন্তর্ভুক্ত README দেখুন।