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 ที่แยกมาจาก 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 สามารถใช้คำสั่งตัวอย่างเพื่อช่วยย้ายแพตช์จากไดเร็กทอรีโปรเจ็กต์ดั้งเดิมไปยังไดเร็กทอรีโปรเจ็กต์ใหม่

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

กำลังสร้างไฟล์แพตช์ใน root/frameworks/base/wifi

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

การใช้ไฟล์แพทช์กับรูท/แพ็คเกจ/โมดูล/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 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

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

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

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

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

การปรับแต่ง

โมดูล Wi-Fi ไม่รองรับการปรับแต่งโดยตรง แต่คุณปรับแต่งการกำหนดค่าได้โดยใช้ Runtime Resource Overlays (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 hooks ที่จำเป็นสำหรับการแปลงนี้อยู่ในคลาส 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 สามารถใช้ @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 ตัวอย่างเช่น ต่อไปนี้เป็นกฎการ build สำหรับ 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 .

  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