वाई-फ़ाई

Wi-Fi मॉड्यूल को अपडेट किया जा सकता है. इसका मतलब है कि इसे Android की रिलीज़ साइकल के अलावा, अन्य सुविधाओं के अपडेट भी मिल सकते हैं. इस मॉड्यूल में ये कॉम्पोनेंट शामिल हैं.

वाई-फ़ाई मॉड्यूल के कॉम्पोनेंट

पहली इमेज. वाई-फ़ाई मॉड्यूल के कॉम्पोनेंट और आर्किटेक्चर

वाई-फ़ाई मॉड्यूल से ये फ़ायदे मिलते हैं.

  • असली उपयोगकर्ताओं को Android डिवाइसों पर, एक जैसा वाई-फ़ाई अनुभव मिलता है. साथ ही, मॉड्यूल अपडेट के ज़रिए, इंटरऑपरेबिलिटी से जुड़ी समस्याओं को ठीक किया जाता है.

  • ऐप्लिकेशन डेवलपर को प्लैटफ़ॉर्म फ़्रैगमेंटेशन कम मिलता है.

  • OEM, कैरियर की ज़रूरी शर्तों को पूरा कर सकते हैं. साथ ही, अलग-अलग डिवाइसों को पसंद के मुताबिक बनाने की लागत को भी कम कर सकते हैं. ऐसा इसलिए, क्योंकि उन्हें अलग-अलग डिवाइसों में एक ही ज़रूरी शर्त को अलग-अलग तरीके से लागू करने की ज़रूरत नहीं होती.

Android 12 और Android 13 के लिए मॉड्यूल बाउंड्री

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi (frameworks/base/wifi/java से मिली फ़ाइलें)
      • tests/
        • android/net/wifi (frameworks/base/wifi/tests से मिली फ़ाइलें)
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi (frameworks/opt/net/wifi/service/java से मिली फ़ाइलें)
      • tests/
        • com/android/server/wifi (frameworks/opt/net/wifi/tests से मिली फ़ाइलें)
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/ (frameworks/base/packages/OsuLogin से मिली फ़ाइलें)
    • ServiceResources/ (Android 12 में नया, ओवरले APK मेनिफ़ेस्ट यहां सेव किया जाता है)
      • res/ (Android 11 में नया, frameworks/base/core/res/res से निकाले गए वाई-फ़ाई कॉन्फ़िगरेशन)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (Android 13 में नया: सेवा के अनुरोध पर उपयोगकर्ता के डायलॉग लॉन्च करने वाले ऐप्लिकेशन की जानकारी यहां सेव की जाती है.)
      • src/
        • com/android/wifi/dialog (इसमें वह गतिविधि शामिल होती है जिससे डायलॉग बॉक्स लॉन्च किए जाते हैं)
      • AndroidManifest.xml
      • Android.bp

ऊपर दी गई डायरेक्ट्री में ऐसा कोड भी होता है जो मॉड्यूलर सिस्टम कॉम्पोनेंट के बाहर और उसकी मौजूदा जगह पर रहता है. उदाहरण के लिए:

  • wificond interface (पैकेज android.net.wifi.nl80211 में मौजूद क्लास, जैसे कि WifiNl80211Manager)
  • सैंपल रिसॉर्स ओवरले ऐप्लिकेशन
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

ओईएम, सैंपल कमांड का इस्तेमाल करके, अपने पैच को ओरिजनल प्रोजेक्ट डायरेक्ट्री से नई प्रोजेक्ट डायरेक्ट्री में ले जा सकते हैं.

frameworks/base/wifi से किसी पैच को दूसरी जगह ले जाना

root/frameworks/base/wifi में पैच फ़ाइल जनरेट करना

git format-patch -1 commit --stdout > patch-file.txt

पैच फ़ाइल को root/packages/modules/Wifi पर लागू करना

git am -p2 --directory=framework/ patch-file.txt

फ़्रेमवर्क/opt/net/wifi से किसी पैच को ट्रांसफ़र करना

पैच को frameworks/opt/net/wifi से दूसरी जगह ले जाने के लिए, जटिल चरणों को पूरा करना होगा. ऐसा इसलिए, क्योंकि माइग्रेशन के दौरान डायरेक्ट्री के पदानुक्रम में बदलाव किया गया था.

frameworks/opt/net/wifi में, कमिट को दो कमिट में बांटें. एक कमिट service/ के लिए और दूसरा tests/ के लिए.

HEAD कमिट को माइग्रेट करना

git reset HEAD^
git add service/
git commit # Enter your commit message. Call this commit service-commit
git add tests/
git commit # Enter your commit message. Call this commit test-commit

दो कमिट पैच फ़ाइलें जनरेट की जा रही हैं

git format-patch -1 service-commit --stdout > service-patch.txt
git format-patch -1 test-commit --stdout > test-patch.txt

packages/modules/Wifi पर दो पैच लागू किए जा रहे हैं

git am service-patch.txt
git am -p1 --directory=service/ test-patch.txt

दो कमिट को वापस एक कमिट में स्क्वैश करना

git rebase -i

दूसरे कमिट के ऑपरेशन को squash में बदलें.

कमिट मैसेज में ज़रूरत के मुताबिक बदलाव करें.

Android 11 के लिए मॉड्यूल बाउंड्री

वाई-फ़ाई सेवा, सिस्टम सर्विस प्रोसेस में चलती रहती है. वाई-फ़ाई मॉड्यूल में, packages/modules/Wifi में मौजूद सभी कोड शामिल होते हैं. इनमें ये शामिल हैं.

  • WifiService, WifiP2pService, WifiAwareService, WifiScannerService, और WifiRttService के लिए एसडीके और सेवा क्लास
  • OsuLogin
  • ServiceWifiResources

इस मॉड्यूल में ये कॉम्पोनेंट शामिल नहीं हैं. ये कॉम्पोनेंट, ओईएम के एओएसपी बिल्ड का हिस्सा बने रहते हैं.

  • system/connectivity/wificond में wificond नेटिव कॉम्पोनेंट
  • wificond इंटरफ़ेस (पैकेज android.net.wifi.nl80211 में मौजूद क्लास, उदाहरण के लिए, WifiNl80211Manager)
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Android 11 में फ़ाइलें ट्रांसफ़र नहीं होती हैं. हालांकि, आने वाले समय में रिलीज़ होने वाले वर्शन में यह सुविधा उपलब्ध हो सकती है. फ़ाइल की जगह में हुए बदलावों को पोर्ट करने में लगने वाले समय को कम करने के लिए, हम सुझाव देते हैं कि ज़्यादा से ज़्यादा बदलावों को AOSP में अपस्ट्रीम करें. इसके लिए, उन्हें Android 11 में पोर्ट करें या मालिकाना हक वाले एक्सटेंशन को फिर से फ़ैक्टर करें, ताकि वे फ़ॉर्मल Android API या वेंडर HAL एक्सटेंशन का इस्तेमाल कर सकें. इससे उन्हें AOSP कोड से अलग किया जा सकेगा.

मॉड्यूल का फ़ॉर्मैट

Wi-Fi मॉड्यूल (com.android.wifi) APEX फ़ॉर्मैट में है. यह Android 11 या इसके बाद के वर्शन पर काम करने वाले डिवाइसों के लिए उपलब्ध है. APEX फ़ाइल में ये कॉम्पोनेंट शामिल होते हैं.

  • SDK लाइब्रेरी (framework-wifi.jar)
  • सेवा लाइब्रेरी (service-wifi.jar)
  • OsuLogin APK (OsuLoginGoogle.apk)
  • संसाधन APK (ServiceWifiResourcesGoogle.apk)
  • WFA सर्टिफ़िकेट

मॉड्यूल डिपेंडेंसी

वाई-फ़ाई मॉड्यूल इन कॉम्पोनेंट पर निर्भर करता है.

  • कनेक्टिविटी
  • टेलीफ़ोनी
  • प्रोटो लाइब्रेरी
  • सिस्टम के अन्य कॉम्पोनेंट
  • वाई-फ़ाई एचएएल
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

यह मॉड्यूल, सिर्फ़ स्टेबल @SystemApi का इस्तेमाल करके फ़्रेमवर्क के साथ इंटरैक्ट करता है. इसमें @hide एपीआई का इस्तेमाल नहीं किया जाता. साथ ही, इसे प्लैटफ़ॉर्म के सिग्नेचर के बजाय Google के सिग्नेचर से साइन किया जाता है.

पसंद के मुताबिक बनाएं

वाई-फ़ाई मॉड्यूल में सीधे तौर पर बदलाव नहीं किया जा सकता. हालांकि, रनटाइम रिसॉर्स ओवरले (आरआरओ) या कैरियर कॉन्फ़िगरेशन का इस्तेमाल करके, कॉन्फ़िगरेशन में बदलाव किया जा सकता है.

वाई-फ़ाई को पसंद के मुताबिक बनाना

दूसरी इमेज. वाई-फ़ाई मॉड्यूल को पसंद के मुताबिक बनाना

  • छोटे-मोटे बदलावों के लिए, RRO config में सेटिंग चालू या बंद करें.
  • ज़्यादा कंट्रोल के लिए, कैरियर कॉन्फ़िगरेशन की किसी भी ऐसी कुंजी के लिए कॉन्फ़िगरेशन वैल्यू को पसंद के मुताबिक बनाएं जिसे @SystemAPI के तौर पर दिखाया गया है.

रनटाइम रिसॉर्स ओवरले का इस्तेमाल करना

आरआरओ का इस्तेमाल करके, डिफ़ॉल्ट कॉन्फ़िगरेशन को बदलकर, वाई-फ़ाई मॉड्यूल को अपनी पसंद के मुताबिक बनाया जा सकता है. जिन कॉन्फ़िगरेशन पर ओवरले किया जा सकता है उनकी सूची के लिए, packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml पर जाएं. कॉन्फ़िगरेशन के व्यवहार के बारे में ज़्यादा जानने के लिए, packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml पर जाएं. सैंपल ओवरले ऐप्लिकेशन के लिए, device/google/coral/rro_overlays/WifiOverlay/ देखें.

ऐसा इसलिए है, क्योंकि device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml फ़ाइल, targetPackage एट्रिब्यूट को com.android.wifi.resources पर सेट करती है. साथ ही, वाई-फ़ाई मॉड्यूल से डिलीवर किए गए संसाधन APK का पैकेज नाम com.google.android.wifi.resources है. इसलिए, आपको ओवरले APKS targetPackage को com.google.android.wifi.resources पर सेट करना होगा, ताकि वाई-फ़ाई कॉन्फ़िगरेशन को सही तरीके से ओवरले किया जा सके.

कॉन्फ़िगरेशन स्टोरेज फ़ॉर्मैट माइग्रेट करना

वाई-फ़ाई मॉड्यूल, सिर्फ़ AOSP के वाई-फ़ाई कॉन्फ़िगरेशन स्टोरेज फ़ॉर्मैट को पार्स कर सकता है. अगर आपने पहले कभी वाई-फ़ाई कॉन्फ़िगरेशन के स्टोरेज फ़ॉर्मैट में बदलाव किया है (इसमें उपयोगकर्ता के सेव किए गए नेटवर्क की सूची शामिल है), तो आपको उस डेटा को एओएसपी फ़ॉर्मैट में बदलना होगा. ऐसा तब करना होगा, जब किसी डिवाइस को Android के ऐसे वर्शन पर अपग्रेड किया जा रहा हो जिसमें वाई-फ़ाई मॉड्यूल शामिल हो. इस कन्वर्ज़न के लिए ज़रूरी हुक, android.net.wifi.WifiMigration क्लास में हैं.

फ़ॉर्मैट कन्वर्ज़न को इन तरीकों से लागू करें.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • इस कुकी को वाई-फ़ाई मॉड्यूल चालू करता है. इसका इस्तेमाल, वाई-फ़ाई शेयर किए गए स्टोर फ़ाइल के कॉन्टेंट को वापस पाने के लिए किया जाता है. इस कॉन्टेंट को AOSP फ़ॉर्मैट में बदल दिया गया है.

    • इन फ़ाइलों को पहले (Android 10 में) डिवाइस पर मौजूद /data/misc/wifi फ़ोल्डर में सेव किया जाता था.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • इस कुकी को वाई-फ़ाई मॉड्यूल चालू करता है. इसका इस्तेमाल, वाई-फ़ाई का इस्तेमाल करने वाले व्यक्ति की स्टोर फ़ाइल के कॉन्टेंट को वापस पाने के लिए किया जाता है. इस कॉन्टेंट को AOSP फ़ॉर्मैट में बदल दिया गया है.

    • इन फ़ाइलों को पहले (Android 10 में) डिवाइस पर मौजूद /data/misc_ce/<userId>/wifi फ़ोल्डर में सेव किया जाता था.

छिपे हुए वाई-फ़ाई एपीआई ऐक्सेस करना

Wi-Fi मॉड्यूल में @hide के साथ एनोटेट किए गए सिंबल (क्लास, तरीके, फ़ील्ड वगैरह) इसके सार्वजनिक एपीआई का हिस्सा नहीं हैं. साथ ही, मॉड्यूल इंस्टॉल किए गए डिवाइसों पर इन्हें ऐक्सेस नहीं किया जा सकता. जिन डिवाइसों में वाई-फ़ाई मॉड्यूल नहीं है वे @hide वाई-फ़ाई एपीआई का इस्तेमाल जारी रख सकते हैं. इसके लिए, उन्हें यह तरीका अपनाना होगा.

  1. impl_library_visibility एट्रिब्यूट की वैल्यू को सार्वजनिक पर सेट करके, framework-wifi पर packages/modules/Wifi/framework/Android.bp के लिए लगाई गई पाबंदियां हटाएं.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. लाइब्रेरी को @hide वाई-फ़ाई एपीआई ऐक्सेस करने की अनुमति देने के लिए, बिल्ड के नियम में बदलाव करें. उदाहरण के लिए, यहां java_library के लिए बिल्ड नियम दिया गया है.

    java_library {
        name: "foo-lib",
    
        // no sdk_version attribute defined
    
        libs: [
            "dependency1",
            "dependency2",
        ],
    }
    

    foo-lib को लाइब्रेरी ऐक्सेस करने की अनुमति देने के लिए, बिल्ड के नियम में इस तरह बदलाव करें:

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. पक्का करें कि libs की सूची में, framework से पहले framework-wifi.impl दिखता हो. libs एट्रिब्यूट में, निर्भरता का क्रम अहम होता है.

छिपे हुए फ़्रेमवर्क एपीआई ऐक्सेस करना

वाई-फ़ाई मॉड्यूल के बाहर @hide से एनोटेट किए गए सिंबल को, वाई-फ़ाई मॉड्यूल के अंदर मौजूद कोड ऐक्सेस नहीं कर सकता. जिन डिवाइसों में वाई-फ़ाई मॉड्यूल शामिल नहीं है वे @hide बाहरी एपीआई (उदाहरण के लिए, framework.jar से) का इस्तेमाल service-wifi में जारी रख सकते हैं. इसके लिए, उन्हें frameworks/opt/net/wifi/service/Android.bp में ये बदलाव करने होंगे.

  1. दोनों wifi-service-pre-jarjar और service-wifi में, sdk_version एट्रिब्यूट की वैल्यू को core_platform पर सेट करें.

  2. wifi-service-pre-jarjar और service-wifi, दोनों में libs एट्रिब्यूट के लिए framework और android_system_server_stubs_current जोड़ें.

  3. पुष्टि करें कि नतीजा, यहां दिए गए कोड के सैंपल से मिलता-जुलता हो.

    java_library {
        name: "wifi-service-pre-jarjar",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    ...
    java_library {
        name: "service-wifi",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    

टेस्ट करना

Android Compatibility Test Suite (CTS), वाई-फ़ाई मॉड्यूल की क्षमताओं की पुष्टि करता है. इसके लिए, वह हर मॉड्यूल रिलीज़ पर CTS टेस्ट का पूरा सेट चलाता है. वाई-फ़ाई की जांच करना, डीबग करना, और उसे बेहतर बनाना में बताए गए टेस्ट भी किए जा सकते हैं.