इंक्रीमेंटल फ़ाइल सिस्टम

Android 11 में पेश किया गया इंक्रीमेंटल फ़ाइल सिस्टम (IncFS) कर्नेल मॉड्यूल, Android OS को Android Debug Bridge (ADB) के ज़रिए स्ट्रीम किए गए APK पाने की सुविधा देता है.

यह एक ऐसा कर्नेल मॉड्यूल है जिसमें सभी ज़रूरी चीज़ें मौजूद होती हैं. यह एक नया वर्चुअल फ़ाइल सिस्टम बनाता है, जो मौजूदा Android फ़ाइल सिस्टम के ऊपर काम करता है. यह बदलाव, फ़्रेमवर्क और SDK टूल में किए गए बदलावों के साथ काम करता है. इससे ऐप्लिकेशन और गेम डेवलपर, Android 11 या उसके बाद के वर्शन पर चलने वाले डिवाइस पर, ADB टूल की मदद से बड़े APK डिप्लॉय कर सकते हैं.

कर्नेल में किए गए बदलाव से, APK सिग्नेचर स्कीम v4 फ़ॉर्मैट का इस्तेमाल किया जा सकता है. साथ ही, Android Package Manager में Android फ़्रेमवर्क में किए गए बदलावों, नई सिस्टम सेवाओं, और ADB में किए गए बदलावों का इस्तेमाल किया जा सकता है.

लागू करना

IncFS को लागू करने के लिए, OEM और SoC मैन्युफ़ैक्चरर को अपने Android डिवाइस के बिल्ड में नया कर्नेल ड्राइवर जोड़ना होगा.

सिर्फ़ Android 11 के लिए, अगर कर्नेल ड्राइवर को मॉड्यूल के तौर पर बनाया गया है, तो उसे मांग पर लोड किया जाता है. अगर ADB इंक्रीमेंटल इंस्टॉलेशन की मदद से कोई ऐप्लिकेशन इंस्टॉल नहीं किया गया है, तो डिवाइस पर कर्नेल ड्राइवर लोड नहीं होता.

इसके अलावा, जब इसे कर्नेल इमेज के हिस्से के तौर पर बनाया जाता है, तो ड्राइवर हमेशा लोड होता है. यह सुविधा, Android 12 और उसके बाद के वर्शन के लिए मान्य है. साथ ही, इसका इस्तेमाल Android 11 के साथ भी किया जा सकता है. kernel driver को Android 12 पर अपग्रेड करने के बारे में जानकारी पाने के लिए, kernel driver अपग्रेड लेख पढ़ें.

कर्नेल ड्राइवर, बड़े सिस्टम का हिस्सा है. इससे स्ट्रीम किए गए APK को इंस्टॉल करने की सुविधा मिलती है. OEM और वेंडर को, सैंपल के तौर पर दिए गए IncFS कोड का इस्तेमाल करने की ज़रूरत नहीं है. हालांकि, सभी डिवाइसों पर एक जैसा अनुभव देने के लिए, आपको यह पक्का करना होगा कि एपीआई लागू करने के लिए, ऐसा फ़ाइल सिस्टम हो जिसमें फ़ाइल पढ़ने की सुविधा और डायरेक्ट्री को पढ़ने और उसमें बदलाव करने की सुविधा हो. इस बारे में इंक्रीमेंटल एफ़एस के लिए यूज़रस्पेस इंटरफ़ेस दस्तावेज़ में बताया गया है.

इसके अलावा, लागू करने के लिए, माउंट करने के विकल्प और खास फ़ाइलें होनी चाहिए, जो काम करने के तरीके के हिसाब से IncFS के सैंपल के लागू होने से मेल खाती हों.

यहां उन ज़रूरी बदलावों की सूची दी गई है जिन्हें लागू करना होगा:

  1. कर्नेल बनाने के लिए, डेवलपमेंट मशीन को सेट अप करें.
  2. common-android-mainline शाखा से सामान्य कर्नेल को टारगेट करें.
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. पुष्टि करें कि IncFS के लिए ज़रूरी ये बदलाव, ब्रैंच चेकआउट में मौजूद हैं:
  4. defconfig फ़ाइल के सबसे नीचे, सिर्फ़ Android 11 के लिए CONFIG_INCREMENTAL_FS=y या CONFIG_INCREMENTAL_FS=m जोड़ें. उदाहरण देखने के लिए, यहां दिए गए किसी एक लिंक पर क्लिक करें:
  5. कर्नल बनाना
  6. Android डिवाइस की इमेज बिल्ड में कर्नेल को जोड़ें.
  7. टारगेट किए गए Android डिवाइस के लिए, अपनी device.mk फ़ाइल में, वेंडर के हिसाब से बनी इनमें से किसी एक सिस्टम-प्रॉपर्टी लाइन को जोड़ें (Android 12 और उसके बाद के वर्शन वाले डिवाइसों में ऐसा करना ज़रूरी नहीं है):
  8. CONFIG_INCREMENTAL_FS=y का इस्तेमाल करते समय, फ़ाइल में इनमें से किसी एक को जोड़ें:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    CONFIG_INCREMENTAL_FS=m का इस्तेमाल करते समय (सिर्फ़ Android 11 के लिए), फ़ाइल में इनमें से किसी एक को जोड़ें:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Android एमुलेटर और Pixel 4 के लिए, device.mk फ़ाइलों के उदाहरण देखें.
  10. सिर्फ़ Android 11 के लिए: अगर CONFIG_INCREMENTAL_FS=m का इस्तेमाल किया जा रहा है, तो SE Linux के नियम जोड़ें.
  11. अपने डिवाइस पर vold.te फ़ाइल बनाएं और उसे /system/sepolicy/vendor फ़ोल्डर में जोड़ें. इसमें यह कॉन्टेंट शामिल करें:

    • vold.te

    इंक्रीमेंटल फ़ाइल सिस्टम ड्राइवर को लोड करने की अनुमति दें:

    • allow vold self:capability sys_module;
    • allow vold vendor_incremental_module:file r_file_perms;
    • allow vold vendor_incremental_module:system module_load;

    अपने /system/sepolicy/vendor फ़ोल्डर में मौजूद मौजूदा file.te फ़ाइल में, SE Linux के ये नियम जोड़ें:

    • file.te फ़ाइल - उदाहरण के लिए, यह file.te फ़ाइल देखें.)
    • इंक्रीमेंटल फ़ाइल सिस्टम ड्राइवर
    • type vendor_incremental_module, vendor_file_type, file_type;

    अपने /system/sepolicy/vendor फ़ोल्डर में मौजूद मौजूदा file_contents फ़ाइल में, SE Linux के ये नियम जोड़ें:

    • file_contents फ़ाइल - उदाहरण के लिए, यह file_contents फ़ाइल देखें.
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

Kernel ड्राइवर अपग्रेड करना

Android 12 पर अपग्रेड करने वाले डिवाइसों में, IncFS ड्राइवर का पुराना वर्शन हो सकता है. उन डिवाइसों के लिए, AOSP का सुझाव है कि आप IncFS ड्राइवर को मौजूदा वर्शन (इस मामले में v2) पर अपडेट करें. ऐसा इन वजहों से करना चाहिए:

  • Android 11 के साथ रिलीज़ किया गया वर्शन, IncFS का पहला वर्शन है. इसे सिर्फ़ ADB इंस्टॉलेशन के लिए उपलब्ध कराया गया है.
  • Android 12, Play Games के इंस्टॉलेशन को स्ट्रीम करने के लिए IncFS ड्राइवर का इस्तेमाल करता है. इसके लिए, बेहतर उपयोगकर्ता अनुभव के लिए IncFS v2 की नई सुविधाओं और ऑप्टिमाइज़ेशन की ज़रूरत होती है.
  • V1, गेम स्ट्रीमिंग की सुविधा देता है. हालांकि, इससे परफ़ॉर्मेंस पर असर पड़ता है. साथ ही, V2 की तुलना में बैटरी, सीपीयू, और रैम का ज़्यादा इस्तेमाल होता है.
  • V2 वर्शन में, स्ट्रीमिंग के लिए बेहतर यूज़र एक्सपीरियंस (यूएक्स) मिलता है. इसमें, प्रोग्रेस ऐनिमेशन, डिस्क के स्टोरेज के इस्तेमाल की सटीक रिपोर्टिंग, और तीसरे पक्ष के ऐप्लिकेशन से स्ट्रीमिंग में होने वाले रुकावट को रोकने की सुविधा मिलती है.

अपने कर्नेल में IncFS ड्राइवर को अपग्रेड करने के लिए, कर्नेल 4.14 या कर्नेल 4.19 के लिए ये पैच लागू करें:

कस्टम कर्नेल के अन्य सभी वर्शन के लिए, कृपया पैचसेट में से किसी एक को पोर्ट करें. इनसे सिर्फ़ fs/incfs डायरेक्ट्री पर असर पड़ता है और ये मौजूदा v1 कोड पर आसानी से लागू होते हैं.

IncFS ड्राइवर का इस्तेमाल उसी तरह से जारी रखें जिस तरह से ओरिजनल Android 11 के लिए किया जाता था. अब इसे, कर्नेल इमेज के पहले से मौजूद हिस्से के तौर पर या अलग मॉड्यूल के तौर पर इस्तेमाल किया जा सकता है. सिस्टम बोर्ड या सिस्टम प्रॉपर्टी के कॉन्फ़िगरेशन में बदलाव न करें.

GKI कर्नेल इमेज का इस्तेमाल करने वाले नए डिवाइसों में, कर्नेल इमेज के हिस्से के तौर पर कॉन्फ़िगर किया गया, IncFS का नया (v2) ड्राइवर अपने-आप मिल जाता है. इसके लिए, आपको कुछ और करने की ज़रूरत नहीं है.

Android 12 में, लोड किए जा सकने वाले मॉड्यूल कॉन्फ़िगरेशन को बंद कर दिया गया था. साथ ही, यह नए डिवाइसों के लिए काम नहीं करता. इसे सिर्फ़ अपग्रेड के लिए या किसी वेंडर की इमेज को फ़्रीज़ करने के लिए अनुमति दी जाती है. ऐसा तब किया जाता है, जब ओरिजनल कर्नेल में इसे पहले से ही मॉड्यूल के तौर पर बनाया गया हो.

लागू करने के तरीके

इसे, कर्नेल इमेज के हिस्से के तौर पर या सिर्फ़ Android 11 के लिए लोड किए जा सकने वाले मॉड्यूल के तौर पर देखा जा सकता है.

लोड किया जा सकने वाला मॉड्यूल (Pixel 4 डिवाइस) Android Emulator (कर्नल इमेज के हिस्से के तौर पर)

पुष्टि करना और जांच करना

सुविधा की यूनिट टेस्ट, सीटीएस, और जीटीएस का इस्तेमाल करके, लागू करने की पुष्टि करें.

सीटीएस

CtsIncrementalInstallHostTestCases का उपयोग करें.

GTS

atest GtsIncrementalInstallTestCases:

/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java

IncFS की जांच करना

  1. डेवलपमेंट एनवायरमेंट सेट अप करें.
  2. लागू करने के सेक्शन में बताए गए टास्क पूरे करें.
  3. मैन्युअल तरीके से ये टेस्ट चलाएं:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

Android SDK टूल (ADB और apksigner) की मदद से IncFS की जांच करना

  • डेवलपमेंट एनवायरमेंट सेट अप करें.
  • लागू करने के सेक्शन में बताए गए टास्क पूरे करें.
  • टारगेट किए गए फ़िज़िकल डिवाइस या एमुलेटर पर बिल्ड को फ़्लैश करें.
  • कोई मौजूदा APK जनरेट करें या पाएं.
  • डीबग साइनिंग पासकोड बनाएं.
  • build-tools फ़ोल्डर में मौजूद v4 सिग्नेचर फ़ॉर्मैट का इस्तेमाल करके, APK को साइन करें.
    ./apksigner sign --ks debug.keystore game.apk
  • platform-tools फ़ोल्डर से, डिवाइस पर APK इंस्टॉल करें.
    ./adb install game.apk
इंस्टॉल करने का उदाहरण
पहली इमेज: इंस्टॉल करने का उदाहरण

इन टेस्ट को ढूंढना