4.2.2 wpa_supplicant编译配置
先介绍本实例的背景情况。有一台三星Galaxy Note 2手机,其OS为Android 4.1.2。现在,编译一个AOSP(Android Open Source Project)的wpa_supplicant程序以替换Note 2中原有的wpa_supplicant。
提示 AOSP即Google公版Android源码。几乎所有手机厂商都会根据芯片、硬件以及厂商自定义的特性去修改它。由于Note 2源码不公开,所以笔者只能编译AOSP版的wpa_supplicant。
假设读者已经按第1章要求部署Android 4.1源码和开发环境,接下来要做的事情如下。
- cd 4.1source #首先进入4.1源码根目录
- source build/envsetup #建立Android源码编译环境
- lunch #选择要编译的设备和版本。笔者选择了1,代表full-eng。eng代表工程版,该选项对应的目标设备类型
- #(TARGET_PRODUCT)为generic,其编译出来的镜像文件可由模拟器加载并运行
由上述配置可知,笔者将使用generic版本编译一个wpa_supplicant以运行在真实的机器上。
提示 通过执行lunch命令可知,不同的设备应有对应的编译配置项。由于笔者没有Note 2的源码,所以只能尝试编译generic版本。
接下来要为generic平台定制所使用的wpa_supplicant版本,通过修改BoardConfig.mk来完成的。
[—>BoardConfig.mk]
- #在此文件最后添加如下内容
- WPA_SUPPLICANT_VERSION := VER_0_8_X #表明使用wpa_supplicant_8
- BOARD_WPA_SUPPLICANT_DRIVER := NL80211 #表明驱动使用Nl80211
- BOARD_WLAN_DEVICE := bcmdhd #表明Kernel中的Wi-Fi设备为博通公司的bcmdhd
- #编译博通公司驱动相关的静态库,该库对应的代码也在AOSP源码中,位置是
- #hardware/broadcom/wlan/bcmdhd/wpa_supplicant_8_lib/
- BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd
巧合的是,Note 2使用的wlan芯片刚好为bcmdhd。
除了修改BoardConfig.mk外,WPAS也定义了自己的编译配置文件android.config,其内容如下。
- ......#该文件主要定义了编译时生成的宏,各平台根据自己的硬件情况去设置需要编译的内容
- # Driver interface for generic Linux wireless extensions
- CONFIG_DRIVER_WEXT=y #可注释这一条以取消编译WEXT相关代码
- # Driver interface for Linux drivers using the nl80211 kernel interface
- CONFIG_DRIVER_NL80211=y #可去掉此行的注释符号以增加对Nl80211的支持
- CONFIG_LIBNL20=y
- ......#其他很多编译配置项都可在此文件中修改
- #注意,此文件中对CONFIG_DRIVER_NL80211的修改和BoardConfig.mk中的BOARD_WPA_SUPPLICANT_DRIVER
- #相重合。BoardConfig.mk的优先级较高,所以请读者先修改它
配置完毕后,开始编译。
- #首先要编译wpa_supplicant依赖的静态库lib_driver_cmd_bcmdhd
- mmm hardware/broadcom/wlan/bcmdhd/wpa_supplicant_8_lib/
- mmm external/wpa_supplicant_8 #生成wpa_supplicant,同时也会生成wpa_cli
将编译后的wpa_supplicant替换Note 2的/system/bin/wpa_supplicant并设置其为可运行(通过chmod命令设置其权限位0755)。同时,把wpa_cli"push"到/system/bin下为后续测试做准备。
经过测试发现,AOSP的wpa_supplicant以及wpa_cli均能正常工作在Note 2上。这也间接表明Note 2并未对wpa_supplicant以及博通芯片相关的代码做较大改动。
注意 严格来说,android.cfg应该是唯一的编译控制文件。但由于底层wlan芯片不同,WPAS可能还依赖其他模块。所以,在具体实施时,BoardConfig.mk(或其他文件,视具体情况而定)也需要做修改。