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

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

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

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

लागू करना

IncFS को लागू करने के लिए, ओईएम और एसओसी बनाने वाली कंपनियों को अपने Android डिवाइसों के बिल्ड में नया कर्नल ड्राइवर जोड़ना होगा.

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

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

यह कर्नल ड्राइवर, स्ट्रीम किए गए APK इंस्टॉल करने की सुविधा देने वाले बड़े सिस्टम का हिस्सा है. ओईएम और वेंडर को, सैंपल के तौर पर दिए गए 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 फ़ाइल में सबसे नीचे, CONFIG_INCREMENTAL_FS=y या सिर्फ़ Android 11 के लिए, 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. अपने डिवाइस के /system/sepolicy/vendor फ़ोल्डर में, नीचे दिए गए कॉन्टेंट के साथ vold.te फ़ाइल बनाएं और जोड़ें:

    • 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

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

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

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

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

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

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

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

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

रेफ़रंस के तौर पर लागू करने के तरीके

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

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

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

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

CTS

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

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