โมดูล Wi-Fi อัปเดตได้ ซึ่งหมายความว่าสามารถรับการอัปเดตความสามารถ นอกรอบการเผยแพร่ Android ปกติได้ โมดูลนี้มีคอมโพเนนต์ต่อไปนี้
รูปที่ 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) หรือการกำหนดค่าของผู้ให้บริการ
รูปที่ 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 ต่อไปได้โดยทำตามขั้นตอนต่อไปนี้
นำการจำกัดระดับการเข้าถึงที่กำหนดไว้ใน
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. ], ... }
เปลี่ยนกฎการสร้างเพื่อให้สิทธิ์เข้าถึงไลบรารี
@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", ], }
ตรวจสอบว่า
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
ในทั้ง
wifi-service-pre-jarjar
และservice-wifi
ให้เปลี่ยนแอตทริบิวต์sdk_version
เป็นcore_platform
ใน ทั้ง
wifi-service-pre-jarjar
และservice-wifi
ให้เพิ่มframework
และandroid_system_server_stubs_current
ลงในแอตทริบิวต์libs
ตรวจสอบว่าผลลัพธ์คล้ายกับตัวอย่างโค้ดต่อไปนี้
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 ได้ด้วย