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 จะถูกเก็บไว้ที่นี่)
      • res/ (ใหม่ใน Android 11, Wi-Fi configs แยกมาจาก frameworks/base/core/res/res )
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (ใหม่ใน Android 13 App เพื่อเปิดกล่องโต้ตอบผู้ใช้ที่ร้องขอโดยบริการจะถูกเก็บไว้ที่นี่)
      • src/
        • com/android/wifi/dialog (ประกอบด้วยกิจกรรมที่เปิดใช้กล่องโต้ตอบ)
      • AndroidManifest.xml
      • Android.bp

ไดเร็กทอรีด้านบนยังมีโค้ดที่ยังคงอยู่นอกส่วนประกอบของระบบโมดูลาร์และในตำแหน่งปัจจุบัน เช่น:

  • wificond interface (คลาสในแพ็คเกจ android.net.wifi.nl80211 เช่น WifiNl80211Manager )
  • ตัวอย่างแอป Resource Overlay
  • 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 ให้แยกคอมมิชชันออกเป็นสองคอมมิชชัน หนึ่งสำหรับ 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

ใช้แพตช์ทั้งสองกับแพ็คเกจ/โมดูล/Wifi

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

การสควอชคอมมิชชันทั้งสองกลับเป็นคอมมิทเดียว

git rebase -i

เปลี่ยนการดำเนินการคอมมิตที่สองเป็น 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 APIs หรือส่วนขยาย 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

การพึ่งพาโมดูล

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

  • การเชื่อมต่อ
  • โทรศัพท์
  • ห้องสมุดโปรโต
  • ส่วนประกอบของระบบอื่น ๆ
  • WiFi HAL
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

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

การปรับแต่ง

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

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

รูปที่ 2 การปรับแต่งโมดูล Wi-Fi

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

ดำเนินการแปลงรูปแบบด้วยวิธีต่อไปนี้

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

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

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

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

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

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

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

สัญลักษณ์ (คลาส เมธอด ฟิลด์ ฯลฯ) ที่มีคำอธิบายประกอบด้วย @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 เฟรมเวิร์กที่ซ่อนอยู่

สัญลักษณ์ที่มี @hide อยู่นอกโมดูล Wi-Fi ไม่สามารถเข้าถึงได้ด้วยรหัสภายในโมดูล Wi-Fi อุปกรณ์ที่ไม่มีโมดูล Wi-Fi สามารถใช้ @hide API ภายนอก (เช่น จาก framework.jar ) ใน service-wifi ต่อไปได้โดยทำการปรับเปลี่ยน frameworks/opt/net/wifi/service/Android.bp บี 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