Wi-Fi

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

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

รูปที่ 1 คอมโพเนนต์และสถาปัตยกรรมของโมดูล Wi-Fi

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

  • ผู้ใช้ปลายทางจะได้รับประสบการณ์การใช้งาน Wi-Fi ที่สอดคล้องกันในอุปกรณ์ 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, Overlay APK manifest is stored here)
      • 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 สามารถใช้คำสั่งตัวอย่างเพื่อช่วยย้ายแพตช์จากไดเรกทอรีโปรเจ็กต์เดิมไปยังไดเรกทอรีโปรเจ็กต์ใหม่ได้

ย้ายแพตช์จาก 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

ย้ายแพตช์จาก frameworks/opt/net/wifi

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

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

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

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

ใช้แพตช์ 2 รายการกับ packages/modules/Wifi

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

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

  • 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 หรือรีแฟกเตอร์ส่วนขยายที่เป็นกรรมสิทธิ์เพื่อใช้ Android API อย่างเป็นทางการหรือส่วนขยาย 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 ไม่รองรับการปรับแต่งโดยตรง แต่คุณสามารถปรับแต่ง config ได้โดยใช้การวางซ้อนทรัพยากรขณะรันไทม์ (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 คุณจึงต้องตั้งค่า APKS การวางซ้อน targetPackage เป็น com.google.android.wifi.resources เพื่อวางซ้อนการกำหนดค่า Wi-Fi ให้สำเร็จ

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

โมดูล Wi-Fi จะแยกวิเคราะห์ได้เฉพาะรูปแบบที่จัดเก็บการกำหนดค่า Wi-Fi ของ AOSP เท่านั้น หากก่อนหน้านี้คุณได้แก้ไขรูปแบบการจัดเก็บการกำหนดค่า Wi-Fi (ซึ่งรวมถึงรายการเครือข่ายที่ผู้ใช้บันทึกไว้) คุณต้องแปลงข้อมูลดังกล่าวเป็นรูปแบบ AOSP เมื่ออัปเกรดอุปกรณ์เป็น Android เวอร์ชันใดก็ตามที่มีโมดูล Wi-Fi Hook ที่จำเป็นสำหรับ 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 ในอุปกรณ์

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

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

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

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

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