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
验证方法
编译并推送至设备后,通过以下步骤验证:
- 使用
lshal确认服务已注册:lshal | grep wifi,应看到android.hardware.wifi@1.3::IWifi。 - 调用HIDL接口测试开关功能,可编写小型测试程序或使用
hidl_test工具。 - 观察
logcat输出,应看到turn_on: WiFi enabled或turn_off: WiFi disabled日志。 - 重复调用相同操作,应返回
ERROR_ALREADY_EXISTS,验证状态管理正确。
判定标准:服务成功注册;开关调用返回OK;重复操作返回错误码;日志输出与操作一致。