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