Wi-Fi

Mô-đun Wi-Fi có thể cập nhật, nghĩa là mô-đun này có thể nhận được các bản cập nhật cho các tính năng bên ngoài chu kỳ phát hành Android thông thường. Mô-đun này chứa các thành phần sau.

Thành phần mô-đun Wi-Fi

Hình 1. Thành phần và cấu trúc mô-đun Wi-Fi

Mô-đun Wi-Fi mang lại các lợi ích sau.

  • Người dùng cuối có được trải nghiệm Wi-Fi nhất quán trên các thiết bị Android và khắc phục các vấn đề về khả năng tương tác thông qua các bản cập nhật mô-đun.

  • Nhà phát triển ứng dụng giảm được tình trạng phân mảnh nền tảng.

  • Nhà sản xuất thiết bị gốc (OEM) có thể đáp ứng các yêu cầu của nhà mạng, đồng thời giảm chi phí cho việc tuỳ chỉnh riêng lẻ (vì họ không cần triển khai các yêu cầu giống nhau theo nhiều cách).

Ranh giới mô-đun cho Android 12 và Android 13

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi (tệp từ frameworks/base/wifi/java)
      • tests/
        • android/net/wifi (tệp từ frameworks/base/wifi/tests)
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi (các tệp từ frameworks/opt/net/wifi/service/java)
      • tests/
        • com/android/server/wifi (các tệp từ frameworks/opt/net/wifi/tests)
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/ (tệp từ frameworks/base/packages/OsuLogin)
    • ServiceResources/ (mới trong Android 12, tệp kê khai APK Lớp phủ được lưu trữ tại đây)
      • res/ (mới trong Android 11, cấu hình Wi-Fi được trích xuất từ frameworks/base/core/res/res)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (mới trong Ứng dụng Android 13 để chạy hộp thoại người dùng do dịch vụ yêu cầu được lưu trữ tại đây.)
      • src/
        • com/android/wifi/dialog (Chứa Hoạt động mà hộp thoại được khởi chạy từ đó)
      • AndroidManifest.xml
      • Android.bp

Các thư mục trước đó cũng chứa mã nằm ngoài thành phần hệ thống mô-đun và ở vị trí hiện tại, ví dụ:

  • wificond interface (các lớp trong gói android.net.wifi.nl80211, ví dụ: WifiNl80211Manager)
  • Ứng dụng Lớp phủ tài nguyên mẫu
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Nhà sản xuất thiết bị gốc (OEM) có thể sử dụng các lệnh mẫu để di chuyển các bản vá từ thư mục dự án ban đầu sang thư mục dự án mới.

Di chuyển một bản vá từ frameworks/base/wifi

Tạo tệp bản vá trong root/frameworks/base/wifi

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

Áp dụng tệp bản vá cho root/packages/modules/Wifi

git am -p2 --directory=framework/ patch-file.txt

Di chuyển bản vá từ Frameworks/opt/net/wifi

Để di chuyển bản vá từ frameworks/opt/net/wifi, bạn cần thực hiện các bước phức tạp vì hệ phân cấp thư mục đã thay đổi trong quá trình di chuyển.

Trong frameworks/opt/net/wifi, hãy chia thay đổi thành hai thay đổi, một thay đổi cho service/ và một thay đổi cho tests/.

Di chuyển thay đổi 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

Tạo 2 tệp bản vá cam kết

git format-patch -1 service-commit --stdout > service-patch.txt
git format-patch -1 test-commit --stdout > test-patch.txt

Áp dụng hai bản vá cho các gói/mô-đun/Wifi

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

Thu gọn hai cam kết trở lại thành một cam kết

git rebase -i

Thay đổi thao tác của thay đổi thứ hai thành squash.

Chỉnh sửa thông báo cam kết nếu phù hợp.

Ranh giới mô-đun cho Android 11

Dịch vụ Wi-Fi tiếp tục chạy bên trong quy trình Dịch vụ hệ thống. Mô-đun Wi-Fi bao gồm tất cả mã trong packages/modules/Wifi, bao gồm cả mã sau.

  • Các lớp dịch vụ và SDK cho WifiService, WifiP2pService, WifiAwareService, WifiScannerServiceWifiRttService
  • OsuLogin
  • ServiceWifiResources

Mô-đun này loại trừ các thành phần sau đây, các thành phần này vẫn là một phần của bản dựng AOSP của OEM.

  • Thành phần gốc wificond trong system/connectivity/wificond
  • Giao diện wificond (các lớp trong gói android.net.wifi.nl80211, ví dụ: WifiNl80211Manager)
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Android 11 không di chuyển tệp, nhưng các bản phát hành trong tương lai có thể sẽ di chuyển. Để giảm công sức chuyển các thay đổi về vị trí tệp, bạn nên cập nhật nhiều thay đổi nhất có thể cho AOSP (sau khi chuyển sang Android 11 hoặc tái cấu trúc các tiện ích độc quyền để sử dụng API Android chính thức hoặc tiện ích HAL của nhà cung cấp nhằm gỡ rối mã nguồn AOSP).

Định dạng mô-đun

Mô-đun Wi-Fi (com.android.wifi) ở định dạng APEX và có sẵn cho các thiết bị chạy Android 11 trở lên. Tệp APEX bao gồm các thành phần sau.

  • Thư viện SDK (framework-wifi.jar)
  • Thư viện dịch vụ (service-wifi.jar)
  • Tệp APK OsuLogin (OsuLoginGoogle.apk)
  • Tệp APK tài nguyên (ServiceWifiResourcesGoogle.apk)
  • Chứng chỉ WFA

Phần phụ thuộc mô-đun

Mô-đun Wi-Fi phụ thuộc vào các thành phần sau.

  • Khả năng kết nối
  • Điện thoại
  • Thư viện proto
  • Các thành phần hệ thống khác
  • Wi-Fi HAL
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Mô-đun này chỉ tương tác với khung bằng cách chỉ sử dụng @SystemApi ổn định (không sử dụng API @hide) và được ký bằng chữ ký Google thay vì chữ ký nền tảng.

Tuỳ chỉnh

Mô-đun Wi-Fi không hỗ trợ tuỳ chỉnh trực tiếp, nhưng bạn có thể tuỳ chỉnh cấu hình bằng cách sử dụng lớp phủ tài nguyên thời gian chạy (RRO) hoặc cấu hình của nhà mạng.

Tuỳ chỉnh Wi-Fi

Hình 2. Tuỳ chỉnh mô-đun Wi-Fi

  • Đối với các tuỳ chỉnh nhỏ, hãy bật hoặc tắt chế độ cài đặt trong config RRO.
  • Để có thêm quyền kiểm soát, hãy tuỳ chỉnh các giá trị cấu hình cho bất kỳ khoá cấu hình nhà mạng nào được hiển thị dưới dạng @SystemAPI.

Sử dụng lớp phủ tài nguyên thời gian chạy

Bạn có thể tuỳ chỉnh mô-đun Wi-Fi bằng cách ghi đè cấu hình mặc định bằng RRO. Để biết danh sách các cấu hình có thể phủ, hãy tham khảo packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml. Để biết thông tin chi tiết về hành vi cấu hình, hãy tham khảo packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml. Để biết ứng dụng lớp phủ mẫu, hãy tham khảo device/google/coral/rro_overlays/WifiOverlay/.

Vì tệp device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml đặt thuộc tính targetPackage thành com.android.wifi.resources và APK tài nguyên do mô-đun Wi-Fi phân phối có tên gói là com.google.android.wifi.resources, nên bạn phải đặt APK lớp phủ targetPackage thành com.google.android.wifi.resources để phủ thành công cấu hình Wi-Fi.

Di chuyển định dạng bộ nhớ cấu hình

Mô-đun Wi-Fi chỉ có thể phân tích cú pháp định dạng bộ nhớ cấu hình Wi-Fi AOSP. Nếu trước đây bạn đã sửa đổi định dạng bộ nhớ cấu hình Wi-Fi (bao gồm danh sách mạng đã lưu của người dùng), thì bạn phải chuyển đổi dữ liệu đó sang định dạng AOSP khi nâng cấp thiết bị lên bất kỳ bản phát hành Android nào có mô-đun Wi-Fi. Các móc cần thiết cho lượt chuyển đổi này nằm trong lớp android.net.wifi.WifiMigration.

Triển khai việc chuyển đổi định dạng theo các phương thức sau.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Được mô-đun Wi-Fi gọi để truy xuất nội dung tệp trong kho chia sẻ Wi-Fi đã được chuyển đổi sang định dạng AOSP.

    • Trước đây (trong Android 10), các tệp này được lưu trữ trong thư mục /data/misc/wifi trên thiết bị.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Được mô-đun Wi-Fi gọi để truy xuất nội dung tệp cửa hàng dành riêng cho người dùng Wi-Fi đã được chuyển đổi sang định dạng AOSP (Dự án nguồn mở Android).

    • Trước đây (trong Android 10), các tệp này được lưu trữ trong thư mục /data/misc_ce/<userId>/wifi trên thiết bị.

Truy cập vào các API Wi-Fi bị ẩn

Các ký hiệu (lớp, phương thức, trường, v.v.) được chú thích bằng @hide trong mô-đun Wi-Fi không thuộc giao diện API công khai và không thể truy cập được trên các thiết bị đã cài đặt mô-đun. Các thiết bị không có mô-đun Wi-Fi có thể tiếp tục sử dụng API Wi-Fi @hide theo các bước sau.

  1. Xoá các giới hạn về khả năng hiển thị được đặt cho framework-wifi tại packages/modules/Wifi/framework/Android.bp bằng cách thay đổi thuộc tính impl_library_visibility thành công khai.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. Thay đổi quy tắc bản dựng để cho phép các API Wi-Fi @hide của thư viện truy cập. Ví dụ: sau đây là quy tắc xây dựng cho java_library.

    java_library {
        name: "foo-lib",
    
        // no sdk_version attribute defined
    
        libs: [
            "dependency1",
            "dependency2",
        ],
    }
    

    Để cho phép foo-lib truy cập vào thư viện, hãy thay đổi quy tắc bản dựng như sau:

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. Đảm bảo rằng framework-wifi.impl xuất hiện trước framework trong danh sách libs. Thứ tự của các phần phụ thuộc trong thuộc tính libs là rất quan trọng.

Truy cập vào các API khung bị ẩn

Mã trong mô-đun Wi-Fi không thể truy cập vào các biểu tượng được chú thích bằng @hide bên ngoài mô-đun Wi-Fi. Các thiết bị không bao gồm mô-đun Wi-Fi có thể tiếp tục sử dụng các API bên ngoài của @hide (ví dụ: từ framework.jar) trong service-wifi bằng cách thực hiện những sửa đổi sau đối với frameworks/opt/net/wifi/service/Android.bp.

  1. Trong cả wifi-service-pre-jarjarservice-wifi, hãy thay đổi thuộc tính sdk_version thành core_platform.

  2. Trong cả wifi-service-pre-jarjarservice-wifi, hãy thêm frameworkandroid_system_server_stubs_current vào thuộc tính libs.

  3. Xác minh kết quả tương tự như mã mẫu sau.

    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",
        ],
    }
    

Thử nghiệm

Bộ kiểm tra tính tương thích (CTS) với Android xác minh chức năng của mô-đun Wi-Fi bằng cách chạy một tập hợp các bài kiểm thử CTS toàn diện trên mọi bản phát hành mô-đun. Bạn cũng có thể chạy các bài kiểm thử được mô tả trong phần Kiểm thử, gỡ lỗi và điều chỉnh Wi-Fi.