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

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

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

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

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

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 รายการกับแพ็กเกจ/โมดูล/Wi-Fi

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

การรวม 2 คอมมิตกลับเป็น 1 คอมมิต

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)
  • OsuLogin APK (OsuLoginGoogle.apk)
  • APK ทรัพยากร (ServiceWifiResourcesGoogle.apk)
  • ใบรับรอง WFA

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

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

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

โมดูลนี้โต้ตอบกับเฟรมเวิร์กโดยใช้ @SystemApi เวอร์ชันเสถียรเท่านั้น (ไม่มีการใช้ @hide API) และลงนามด้วยลายเซ็นของ 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 ฮุกที่จำเป็นสำหรับการแปลงนี้มีอยู่ในคลาส android.net.wifi.WifiMigration

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

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

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

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

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • เรียกใช้โดยโมดูล Wi-Fi เพื่อดึงข้อมูลเนื้อหาไฟล์ Store สำหรับผู้ใช้ 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 ได้ด้วย