2. 实现WiFi HAL的打开和关闭

任务说明

本案例实现Android WiFi HAL层中打开(turn_on)与关闭(turn_off)的核心接口逻辑。目标是在HAL实现中正确响应Framework的开关请求,完成状态管理,并通过HIDL接口对外暴露能力。最终交付一个可编译的HAL服务端实现,包含接口定义、状态跟踪与开关动作的日志化处理。

接口定义

基于Android 10+的WiFi HIDL架构,定义IWifi.hal接口,声明打开与关闭方法。实际HAL实现需继承此接口并完成业务逻辑。

// IWifi.hal
package android.hardware.wifi@1.3;

interface IWifi {
    // 打开WiFi,成功返回Ok
    turn_on() generates (WifiStatus status);
    // 关闭WiFi,成功返回Ok
    turn_off() generates (WifiStatus status);
};

HAL服务实现

创建Wifi.cpp实现上述接口。内部维护mEnabled状态变量,通过互斥锁保证并发安全。开关操作记录日志并更新状态,同时模拟底层硬件切换动作(实际产品中此处调用驱动接口)。

// Wifi.cpp
#include <android/hardware/wifi/1.3/IWifi.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include <utils/Log.h>
#include <mutex>

using ::android::hardware::wifi::V1_3::IWifi;
using ::android::hardware::wifi::V1_0::WifiStatus;
using ::android::hardware::wifi::V1_0::WifiStatusCode;
using ::android::hardware::Return;
using ::android::sp;

class Wifi : public IWifi {
private:
    std::mutex mMutex;
    bool mEnabled = false;

public:
    Return<WifiStatus> turn_on() override {
        std::lock_guard<std::mutex> lock(mMutex);
        WifiStatus status;
        if (mEnabled) {
            status.code = WifiStatusCode::ERROR_ALREADY_EXISTS;
            status.description = "WiFi already on";
            ALOGE("turn_on: already enabled");
            return status;
        }
        // 实际产品中在此调用硬件驱动接口
        mEnabled = true;
        status.code = WifiStatusCode::OK;
        status.description = "Success";
        ALOGI("turn_on: WiFi enabled");
        return status;
    }

    Return<WifiStatus> turn_off() override {
        std::lock_guard<std::mutex> lock(mMutex);
        WifiStatus status;
        if (!mEnabled) {
            status.code = WifiStatusCode::ERROR_ALREADY_EXISTS;
            status.description = "WiFi already off";
            ALOGE("turn_off: already disabled");
            return status;
        }
        mEnabled = false;
        status.code = WifiStatusCode::OK;
        status.description = "Success";
        ALOGI("turn_off: WiFi disabled");
        return status;
    }
};

服务注册与启动

创建service.cpp注册HAL服务,使Framework能够发现并绑定。

// service.cpp
#include <android/hardware/wifi/1.3/IWifi.h>
#include <hidl/LegacySupport.h>
#include "Wifi.h"

using ::android::hardware::wifi::V1_3::IWifi;
using ::android::hardware::defaultPassthroughServiceImplementation;

int main() {
    ALOGI("WiFi HAL service starting...");
    return defaultPassthroughServiceImplementation<IWifi>("default");
}

构建配置

创建Android.bp定义模块编译规则,确保HAL实现可被编译为共享库并注册为服务。

// Android.bp
cc_binary {
    name: "android.hardware.wifi@1.3-service",
    relative_install_path: "hw",
    vendor: true,
    srcs: ["service.cpp", "Wifi.cpp"],
    shared_libs: [
        "libhidlbase",
        "libhidltransport",
        "liblog",
        "libutils",
        "android.hardware.wifi@1.3",
    ],
    init_rc: ["wifi.rc"],
}

cc_library_shared {
    name: "android.hardware.wifi@1.3-impl",
    relative_install_path: "hw",
    vendor: true,
    srcs: ["Wifi.cpp"],
    shared_libs: [
        "libhidlbase",
        "libhidltransport",
        "liblog",
        "libutils",
        "android.hardware.wifi@1.3",
    ],
}

创建wifi.rc定义服务启动脚本:

service wifi_hal_service /vendor/bin/hw/android.hardware.wifi@1.3-service
    class hal
    user wifi
    group wifi
    seclabel u:r:hal_wifi:s0

验证方法

编译并推送至设备后,通过以下步骤验证:

  1. 使用lshal确认服务已注册:lshal | grep wifi,应看到android.hardware.wifi@1.3::IWifi。
  2. 调用HIDL接口测试开关功能,可编写小型测试程序或使用hidl_test工具。
  3. 观察logcat输出,应看到turn_on: WiFi enabled或turn_off: WiFi disabled日志。
  4. 重复调用相同操作,应返回ERROR_ALREADY_EXISTS,验证状态管理正确。

判定标准:服务成功注册;开关调用返回OK;重复操作返回错误码;日志输出与操作一致。

WiFi HAL 开关调用时序 Framework HAL Service WiFi Driver turn_on() WifiStatus(OK) driver_enable() success mEnabled = true ALOGI("enabled") 重复调用 turn_on/turn_off 时返回 ERROR_ALREADY_EXISTS,状态机保证操作幂等性