माइक्रोड्रॉइड एक मिनी-एंड्रॉइड ओएस है जो पीवीएम में चलता है। आपको माइक्रोड्रॉइड का उपयोग करने की आवश्यकता नहीं है, आप किसी भी ओएस के साथ वीएम शुरू कर सकते हैं। हालांकि, पीवीएम के लिए प्राथमिक उपयोग के मामले एक स्टैंडअलोन ओएस नहीं चला रहे हैं, बल्कि एंड्रॉइड की तुलना में मजबूत गोपनीयता और अखंडता गारंटी के साथ ऐप के एक हिस्से को चलाने के लिए एक अलग निष्पादन वातावरण की पेशकश कर रहे हैं।
पारंपरिक ऑपरेटिंग सिस्टम के साथ, मजबूत गोपनीयता और अखंडता प्रदान करने के लिए उचित मात्रा में काम (अक्सर डुप्लिकेट) की आवश्यकता होती है क्योंकि पारंपरिक ऑपरेटिंग सिस्टम व्यापक एंड्रॉइड आर्किटेक्चर के साथ फिट नहीं होते हैं। उदाहरण के लिए, मानक एंड्रॉइड आर्किटेक्चर के साथ, डेवलपर्स को पीवीएम में अपने ऐप के हिस्से को सुरक्षित रूप से लोड करने और निष्पादित करने के साधन को लागू करने की आवश्यकता होती है, और पेलोड ग्लिबैक के खिलाफ बनाया जाता है। एंड्रॉइड ऐप बायोनिक का उपयोग करता है, संचार के लिए बनामॉक पर एक कस्टम प्रोटोकॉल की आवश्यकता होती है, और एडीबी का उपयोग करके डिबगिंग चुनौतीपूर्ण है।
माइक्रोड्रॉइड एक ऑफ-द-शेल्फ ओएस छवि प्रदान करके इन अंतरालों को भरता है जिसे डेवलपर्स से अपने ऐप के एक हिस्से को पीवीएम में उतारने के लिए कम से कम प्रयास की आवश्यकता होती है। बायोनिक के खिलाफ नेटिव कोड बनाया गया है, बाइंडर पर संचार होता है, और यह एंड्रॉइड से एपेक्स को आयात करने की अनुमति देता है और एंड्रॉइड एपीआई के एक सबसेट को उजागर करता है, जैसे कि हार्डवेयर-समर्थित कुंजियों के साथ क्रिप्टोग्राफिक संचालन के लिए कीस्टोर। कुल मिलाकर, डेवलपर्स को माइक्रोड्रॉइड को उन उपकरणों के साथ एक परिचित वातावरण मिलना चाहिए जो वे पूर्ण एंड्रॉइड ओएस में आदी हो गए हैं।
विशेषताएँ
माइक्रोड्रॉइड एंड्रॉइड का एक स्ट्रिप्ड डाउन संस्करण है जिसमें कुछ अतिरिक्त घटक पीवीएम के लिए विशिष्ट हैं। माइक्रोड्रॉइड समर्थन करता है:
- एनडीके एपीआई का एक सबसेट (एंड्रॉइड के libc और बायोनिक के कार्यान्वयन के लिए सभी एपीआई प्रदान किए गए हैं)
- डिबगिंग सुविधाएँ, जैसे adb, logcat, tombstone, और gdb
- सत्यापित बूट और SELinux सक्षम
- एक एपीके में एम्बेडेड साझा पुस्तकालयों के साथ बाइनरी लोड और निष्पादित करना
- Vsock पर बाइंडर RPC और अंतर्निहित अखंडता जांच के साथ फाइलों का आदान-प्रदान
- अपैक्स का लोड हो रहा है
माइक्रोड्रॉइड समर्थन नहीं करता है:
Android में Android Java API
android.\*
पैकेजसिस्टम सर्वर और ज़ीगोट
ग्राफिक्स/यूआई
एचएएलएस
माइक्रोड्रॉइड आर्किटेक्चर
माइक्रोड्रॉइड कटलफिश के समान है जिसमें दोनों में एक आर्किटेक्चर है जो मानक एंड्रॉइड के समान है। माइक्रोड्रॉइड में एक समग्र डिस्क छवि में एक साथ समूहीकृत निम्नलिखित विभाजन चित्र होते हैं:
-
bootloader
- कर्नेल को सत्यापित और प्रारंभ करता है। -
boot.img
- कर्नेल और init ramdisk समाहित करता है। -
vendor\_boot.img
- VM-विशिष्ट कर्नेल मॉड्यूल शामिल हैं, जैसे virtio. -
super.img
- सिस्टम और विक्रेता तार्किक विभाजन से मिलकर बनता है। -
vbmeta.img
- सत्यापित बूट मेटाडेटा शामिल है।
विभाजन छवियों को वर्चुअलाइजेशन एपेक्स में शिप किया जाता है और VirtualizationService
सर्विस द्वारा एक समग्र डिस्क छवि में पैक किया जाता है। मुख्य OS समग्र डिस्क छवि के अलावा, VirtualizationService
इन अन्य विभाजनों को बनाने के लिए जिम्मेदार है:
-
payload
- एंड्रॉइड के एपेक्स और एपीके द्वारा समर्थित विभाजन का एक सेट -
instance
- प्रति-आवृत्ति सत्यापित बूट डेटा को बनाए रखने के लिए एक एन्क्रिप्टेड विभाजन, जैसे प्रति-आवृत्ति नमक, विश्वसनीय एपेक्स सार्वजनिक कुंजी, और रोलबैक काउंटर
बूट अनुक्रम
डिवाइस बूट के बाद माइक्रोड्रॉइड बूट अनुक्रम होता है। आर्किटेक्चर दस्तावेज़ में डिवाइस बूट पर चर्चा की गई है। चित्र 1 माइक्रोड्रॉइड बूट अनुक्रम के दौरान होने वाले चरणों को दिखाता है:
यहां चरणों की व्याख्या दी गई है:
क्रॉसवीएम द्वारा बूटलोडर को मेमोरी में लोड किया जाता है और pvmfw निष्पादित करना शुरू कर देता है। बूटलोडर पर कूदने से पहले, pvmfw दो कार्य करता है:
- बूटलोडर को यह जांचने के लिए सत्यापित करता है कि यह किसी विश्वसनीय स्रोत (Google या OEM) से है या नहीं।
- यह सुनिश्चित करता है कि इंस्टेंस इमेज के उपयोग के माध्यम से एक ही बूटलोडर एक ही pVM के कई बूटों में लगातार उपयोग किया जाता है। विशेष रूप से, pVM को प्रारंभ में एक खाली इंस्टेंस छवि के साथ बूट किया गया है। pvmfw इंस्टेंस इमेज में बूटलोडर की पहचान को स्टोर करता है और इसे एन्क्रिप्ट करता है। इसलिए, अगली बार जब pVM को उसी इंस्टेंस छवि के साथ बूट किया जाता है, pvmfw इंस्टेंस छवि से सहेजी गई पहचान को डिक्रिप्ट करता है और सत्यापित करता है कि यह वही है जो पहले सहेजा गया था। यदि पहचान भिन्न होती है, तो pvmfw बूट करने से इंकार कर देता है।
बूटलोडर फिर माइक्रोड्रॉइड को बूट करता है।
बूटलोडर इंस्टेंस डिस्क तक पहुंचता है। Pvmfw के समान, बूटलोडर में एक इंस्टेंस डिस्क ड्राइव है जिसमें पिछले बूट के दौरान इस उदाहरण में उपयोग की गई विभाजन छवियों के बारे में जानकारी है, जिसमें सार्वजनिक कुंजी भी शामिल है।
बूटलोडर vbmeta और जंजीर विभाजन की पुष्टि करता है, जैसे कि
boot
औरsuper
, और, यदि सफल हो, तो अगले चरण के pVM रहस्य प्राप्त करता है। फिर, माइक्रोड्रॉइड कर्नेल को नियंत्रित करता है।चूँकि सुपर पार्टीशन को बूटलोडर द्वारा पहले ही सत्यापित किया जा चुका है (चरण 3), कर्नेल बिना शर्त सुपर पार्टीशन को माउंट करता है। पूर्ण Android की तरह, सुपर पार्टीशन में dm-verity पर माउंट किए गए कई तार्किक विभाजन होते हैं। फिर नियंत्रण को
init
प्रक्रिया में भेज दिया जाता है, जो विभिन्न मूल सेवाओं को शुरू करता है।init.rc
स्क्रिप्ट पूर्ण Android के समान है लेकिन माइक्रोड्रॉइड की आवश्यकताओं के अनुरूप है।init
प्रक्रिया Microdroid प्रबंधक शुरू करती है, जो इंस्टेंस छवि तक पहुँचता है। माइक्रोड्रॉइड प्रबंधक सेवा पिछले चरण से पास की गई कुंजी का उपयोग करके छवि को डिक्रिप्ट करती है और क्लाइंट एपीके और एपेक्स की सार्वजनिक कुंजी और रोलबैक काउंटर पढ़ती है जो इस पीवीएम पर भरोसा करती है। इस जानकारी का उपयोग बाद मेंzipfuse
द्वारा किया जाता है और जब वे क्लाइंटapexd
माउंट करते हैं और क्रमशः एपेक्स का अनुरोध करते हैं तो एपेक्स किया जाता है।apexd
प्रबंधक सेवा शीर्ष पर शुरू होती है।apexd
एपेक्स को/apex/<name>
निर्देशिकाओं पर आरोहित करता है। एंड्रॉइड और माइक्रोड्रॉइड माउंट एपेक्स के बीच एकमात्र अंतर यह है कि माइक्रोड्रॉइड में, एपेक्स फाइलें वर्चुअल ब्लॉक डिवाइस (/dev/vdc1
,…) से आ रही हैं, न कि नियमित फाइलों (/system/apex/*.apex
) से।zipfuse
Microdroid का FUSE फाइल सिस्टम है।zipfuse
क्लाइंट एपीके को माउंट करता है, जो अनिवार्य रूप से एक फाइल सिस्टम के रूप में एक जिप फाइल है। नीचे, एपीके फ़ाइल को डीएम-वेरिटी के साथ पीवीएम द्वारा वर्चुअल ब्लॉक डिवाइस के रूप में पास किया जाता है, जो एपेक्स के समान है। एपीके में एपेक्स की एक सूची के साथ एक कॉन्फ़िगरेशन फ़ाइल है जिसे ऐप डेवलपर ने इस पीवीएम इंस्टेंस के लिए अनुरोध किया है। एपेक्स को सक्रिय करते समय सूची का उपयोगapexd
द्वारा किया जाता है।बूट प्रवाह माइक्रोड्रॉइड प्रबंधक सेवा में वापस आ जाता है। प्रबंधक सेवा तब बाइंडर आरपीसी का उपयोग करके एंड्रॉइड की
VirtualizationService
सेवा के साथ संचार करती है ताकि यह क्रैश या शटडाउन जैसी महत्वपूर्ण घटनाओं की रिपोर्ट कर सके और पीवीएम को समाप्त करने जैसे अनुरोधों को स्वीकार कर सके। प्रबंधक सेवा एपीके की कॉन्फ़िगरेशन फ़ाइल से मुख्य बाइनरी के स्थान को पढ़ती है और इसे निष्पादित करती है।
फ़ाइल एक्सचेंज (AuthFS)
एंड्रॉइड घटकों के लिए इनपुट, आउटपुट और स्थिति के लिए फाइलों का उपयोग करना और इन्हें एंड्रॉइड कर्नेल द्वारा नियंत्रित एक्सेस के साथ फाइल डिस्क्रिप्टर ( ParcelFileDescriptor
में पार्सलफाइल डिस्क्रिप्टर टाइप) के रूप में पास करना आम बात है। AuthFS pVM सीमाओं के पार परस्पर अविश्वास वाले अंतिम बिंदुओं के बीच फ़ाइलों के आदान-प्रदान के लिए समान कार्यक्षमता की सुविधा प्रदान करता है।
मूल रूप से, AuthFS एक दूरस्थ फ़ाइल सिस्टम है, जिसमें fs-verity
verity के समान, व्यक्तिगत एक्सेस संचालन पर पारदर्शी अखंडता जाँच होती है। चेक फ्रंटएंड की अनुमति देते हैं, जैसे कि पीवीएम में चल रहे फाइल-रीडिंग प्रोग्राम, यह पता लगाने के लिए कि क्या अविश्वसनीय बैकएंड, आमतौर पर एंड्रॉइड, फ़ाइल सामग्री के साथ छेड़छाड़ करता है।
फ़ाइलों का आदान-प्रदान करने के लिए, बैकएंड ( fd\_server
) प्रति-फ़ाइल कॉन्फ़िगरेशन के साथ शुरू होता है जो निर्दिष्ट करता है कि यह इनपुट (केवल पढ़ने के लिए) या आउटपुट (रीड-राइट) के लिए है या नहीं। इनपुट के लिए, फ्रंटएंड लागू करता है कि सामग्री एक ज्ञात हैश से मेल खाती है, जो कि ऑन-एक्सेस सत्यापन के लिए एक मर्कल ट्री के ऊपर है। आउटपुट के लिए, AuthFS आंतरिक रूप से सामग्री के हैश ट्री को बनाए रखता है जैसा कि लेखन कार्यों से देखा गया है और डेटा को वापस पढ़ने पर अखंडता को लागू कर सकता है।
अंतर्निहित परिवहन वर्तमान में बाइंडर आरपीसी पर आधारित है, हालांकि यह भविष्य में प्रदर्शन को अनुकूलित करने के लिए बदल सकता है।
महतवपूर्ण प्रबंधन
pVMs को एक स्थिर सीलिंग कुंजी प्रदान की जाती है जो संरक्षित स्थायी डेटा के लिए उपयुक्त होती है, और एक सत्यापन कुंजी जो हस्ताक्षर बनाने के लिए उपयुक्त होती है जो कि pVM द्वारा सत्यापित रूप से निर्मित होती है।
बाइंडर आरपीसी
एंड्रॉइड के अधिकांश इंटरफेस एआईडीएल में व्यक्त किए जाते हैं, जो कि बाइंडर लिनक्स कर्नेल ड्राइवर के शीर्ष पर बनाया गया है। पीवीएम के बीच इंटरफेस का समर्थन करने के लिए, बाइंडर प्रोटोकॉल को सॉकेट पर काम करने के लिए फिर से लिखा गया है, पीवीएम के मामले में बनाम। सॉकेट पर काम करने से एंड्रॉइड के मौजूदा एआईडीएल इंटरफेस को इस नए वातावरण में उपयोग करने की अनुमति मिलती है।
कनेक्शन सेट करने के लिए, एक एंडपॉइंट, जैसे कि pVM पेलोड, एक RpcServer
ऑब्जेक्ट बनाता है, एक रूट ऑब्जेक्ट को पंजीकृत करता है, और नए कनेक्शन के लिए सुनना शुरू करता है। क्लाइंट RpcSession
ऑब्जेक्ट का उपयोग करके इस सर्वर से जुड़ सकते हैं, Binder
ऑब्जेक्ट प्राप्त कर सकते हैं, और इसका उपयोग ठीक उसी तरह कर सकते हैं जैसे कर्नेल बाइंडर ड्राइवर के साथ Binder
ऑब्जेक्ट का उपयोग किया जाता है।