Wi-Fi

โมดูล Wi-Fi สามารถอัปเดตได้ ซึ่งหมายความว่าจะรับการอัปเดตความสามารถต่างๆ ได้ อยู่นอกรอบการเผยแพร่ปกติของ Android โมดูลนี้ประกอบด้วยเนื้อหาต่อไปนี้ คอมโพเนนต์

ส่วนประกอบโมดูล Wi-Fi

รูปที่ 1 ส่วนประกอบและสถาปัตยกรรมโมดูล Wi-Fi

โมดูล Wi-Fi มีประโยชน์ดังต่อไปนี้

  • ผู้ใช้ปลายทางได้รับประสบการณ์การใช้งาน Wi-Fi ที่สอดคล้องกันในอุปกรณ์ Android และการแก้ไขต่างๆ ปัญหาความสามารถในการทำงานร่วมกันผ่านการอัปเดตโมดูล

  • นักพัฒนาแอปจะได้รับการกระจาย Fragment ของแพลตฟอร์มน้อยลง

  • 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, โฆษณาซ้อนทับ ไฟล์ Manifest ของ APK จะจัดเก็บไว้ที่นี่)
      • res/ (ใหม่ใน Android 11, การกำหนดค่า Wi-Fi ดึงข้อมูลจาก 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

OEM สามารถใช้คำสั่งตัวอย่างเพื่อช่วยย้ายแพตช์ จากไดเรกทอรีโปรเจ็กต์เดิมไปยังไดเรกทอรีโปรเจ็กต์ใหม่

ย้ายแพตช์จากเฟรมเวิร์ก/ฐาน/Wi-Fi

สร้างไฟล์แพตช์ในรูท/เฟรมเวิร์ก/ฐาน/Wi-Fi

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

การใช้ไฟล์แพตช์กับรูท/แพ็กเกจ/โมดูล/Wi-Fi

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

ย้ายแพตช์จากเฟรมเวิร์ก/opt/net/wifi

ต้องมีขั้นตอนที่ซับซ้อนเพื่อย้ายแพตช์จาก frameworks/opt/net/wifi เนื่องจากลำดับชั้นของไดเรกทอรีมีการเปลี่ยนแปลงระหว่างการย้ายข้อมูล

ใน frameworks/opt/net/wifi ให้แบ่งคอมมิตออกเป็น 2 รายการ รายการหนึ่งสำหรับ service/และอีก 1 ราคา 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

การสร้างไฟล์แพตช์คอมมิต 2 ไฟล์

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

การใช้แพตช์ 2 รายการกับแพ็กเกจ/โมดูล/Wi-Fi

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

การบีบทั้ง 2 ข้อให้กลับมาเป็นสัญญาผูกมัดเดียว

git rebase -i

เปลี่ยนการดำเนินการของคอมมิตที่ 2 เป็น squash

แก้ไขข้อความคอมมิตตามความเหมาะสม

ขอบเขตโมดูลสำหรับ Android 11

บริการ Wi-Fi จะทำงานอย่างต่อเนื่องในกระบวนการของบริการระบบ Wi-Fi โมดูลมีโค้ดทั้งหมดใน packages/modules/Wifi รวมถึงโค้ดต่อไปนี้

  • SDK และคลาสบริการสำหรับ WifiService, WifiP2pService WifiAwareService WifiScannerService และ WifiRttService
  • OsuLogin
  • ServiceWifiResources

โมดูลนี้ไม่รวมส่วนประกอบต่อไปนี้ซึ่งยังคงเป็นส่วนหนึ่งของ OEM บิลด์ AOSP

  • คอมโพเนนต์ดั้งเดิม wificond รายการใน system/connectivity/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 หรือการเปลี่ยนโครงสร้างภายในโค้ดส่วนขยายที่เป็นกรรมสิทธิ์เพื่อใช้งาน API อย่างเป็นทางการของ Android หรือส่วนขยาย HAL ของผู้ให้บริการเพื่อให้แยกออกจากโค้ด AOSP

รูปแบบโมดูล

โมดูล Wi-Fi (com.android.wifi) อยู่ใน รูปแบบ APEX และพร้อมให้บริการสำหรับอุปกรณ์ ที่ใช้ Android 11 ขึ้นไป ไฟล์ APEX ประกอบด้วย คอมโพเนนต์ดังต่อไปนี้

  • ไลบรารี SDK (framework-wifi.jar)
  • ไลบรารีบริการ (service-wifi.jar)
  • APK ของ OsuLogin (OsuLoginGoogle.apk)
  • แหล่งข้อมูล APK (ServiceWifiResourcesGoogle.apk)
  • ใบรับรอง WFA

ทรัพยากร Dependency ของโมดูล

โมดูล Wi-Fi ขึ้นอยู่กับคอมโพเนนต์ต่อไปนี้

  • การเชื่อมต่อ
  • โทรศัพท์
  • ไลบรารี Proto
  • คอมโพเนนต์ระบบอื่นๆ
  • HAL ของ Wi-Fi
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

โมดูลนี้จะโต้ตอบกับเฟรมเวิร์กโดยใช้ @SystemApi ที่เสถียรเท่านั้น (ไม่ การใช้ API ของ @hide) และลงนามด้วยลายเซ็น Google แทนแพลตฟอร์ม ลายเซ็น

การปรับแต่ง

โมดูล Wi-Fi ไม่สนับสนุนการกำหนดค่าโดยตรง แต่คุณสามารถปรับแต่ง กำหนดค่าโดยใช้การวางซ้อนทรัพยากรรันไทม์ (RRO) หรือการกำหนดค่าผู้ให้บริการ

การปรับแต่ง Wi-Fi

รูปที่ 2 การกำหนดค่าโมดูล Wi-Fi

  • สำหรับการปรับแต่งเพียงเล็กน้อย ให้เปิดหรือปิดการตั้งค่าใน RRO config
  • ปรับแต่งการกำหนดค่าสำหรับคีย์การกำหนดค่าของผู้ให้บริการเพื่อให้ควบคุมได้มากขึ้น แสดงเป็น @SystemAPI

ใช้การวางซ้อนทรัพยากรรันไทม์

คุณสามารถปรับแต่งโมดูล Wi-Fi โดยการลบล้างการกำหนดค่าเริ่มต้น การใช้ RRO สำหรับรายการการกำหนดค่าที่ซ้อนทับได้ โปรดดู 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 ที่ส่งโดยโมดูล Wi-Fi มีชื่อแพ็กเกจ com.google.android.wifi.resources คุณต้องตั้งค่า APK ที่วางซ้อน targetPackage ไปยัง com.google.android.wifi.resources เพื่อวางซ้อน Wi-Fi การกำหนดค่าสำเร็จ

ย้ายข้อมูลรูปแบบพื้นที่เก็บข้อมูลการกำหนดค่า

โมดูล Wi-Fi จะแยกวิเคราะห์ได้เฉพาะรูปแบบพื้นที่เก็บข้อมูลการกำหนดค่า Wi-Fi ของ AOSP เท่านั้น ถ้า คุณได้แก้ไขรูปแบบพื้นที่เก็บข้อมูลการกำหนดค่า Wi-Fi (ซึ่ง มีรายการเครือข่ายที่บันทึกไว้ของผู้ใช้) คุณจะต้องแปลงข้อมูลดังกล่าวเป็น AOSP เมื่ออัปเกรดอุปกรณ์เป็น Android รุ่นใดก็ตามที่มี Wi-Fi ฮุกที่จำเป็นสำหรับ Conversion นี้อยู่ใน android.net.wifi.WifiMigration ชั้นเรียน

ใช้การแปลงรูปแบบตามวิธีการต่อไปนี้

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • เรียกโดยโมดูล Wi-Fi เพื่อเรียกเนื้อหาไฟล์ร้านค้าที่แชร์ Wi-Fi ที่แปลงเป็นรูปแบบ AOSP แล้ว

    • ก่อนหน้านี้ไฟล์เหล่านี้ (ใน Android 10) จัดเก็บไว้ใน /data/misc/wifi โฟลเดอร์ในอุปกรณ์

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • เรียกโดยโมดูล Wi-Fi เพื่อเรียกเนื้อหาไฟล์ร้านค้าเฉพาะผู้ใช้ Wi-Fi ที่แปลงเป็นรูปแบบ AOSP แล้ว

    • ก่อนหน้านี้ไฟล์เหล่านี้ (ใน Android 10) จัดเก็บไว้ใน /data/misc_ce/<userId>/wifi โฟลเดอร์ในอุปกรณ์

เข้าถึง Wi-Fi API ที่ซ่อนอยู่

สัญลักษณ์ (คลาส วิธีการ ฟิลด์ ฯลฯ) ที่มีคำอธิบายประกอบด้วย @hide ใน Wi-Fi โมดูลไม่ได้เป็นส่วนหนึ่งของแพลตฟอร์ม API สาธารณะและไม่สามารถเข้าถึงได้ อุปกรณ์ที่ติดตั้งโมดูลนี้ อุปกรณ์ที่ไม่มี Wi-Fi โมดูลจะยังคงใช้ API Wi-Fi ของ @hide ต่อไปได้โดยทำตามขั้นตอนต่อไปนี้

  1. นำข้อจำกัดระดับการมองเห็นออกเมื่อวันที่ framework-wifi เวลา packages/modules/Wifi/framework/Android.bp โดยการเปลี่ยน impl_library_visibility เป็นแบบสาธารณะ

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. เปลี่ยนกฎการสร้างเพื่ออนุญาตให้เข้าถึง Wi-Fi API ของไลบรารี @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. ตรวจสอบว่า framework-wifi.impl ปรากฏก่อน framework ในรายการ จาก libs ลำดับของทรัพยากร Dependency ในแอตทริบิวต์ libs มีนัยสำคัญ

เข้าถึง API เฟรมเวิร์กที่ซ่อนอยู่

เข้าถึงสัญลักษณ์ที่มีคำอธิบายประกอบด้วย @hide นอกโมดูล Wi-Fi ไม่ได้ ภายในโมดูล Wi-Fi อุปกรณ์ที่ไม่มีโมดูล Wi-Fi สามารถ ยังคงใช้ API ภายนอก @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 ให้เพิ่ม framework และ android_system_server_stubs_current ลงในแอตทริบิวต์ libs

  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 (CTS) จะตรวจสอบความเข้ากันได้ของโมดูล Wi-Fi โดยใช้ชุดการทดสอบ CTS ที่ครอบคลุมในทุกโมดูล นอกจากนี้ คุณยังสามารถทำการทดสอบตามที่อธิบายไว้ใน ทดสอบ แก้ไขข้อบกพร่อง และปรับแต่ง Wi-Fi