编译AOSP时预配置WiFi SSID和密码实现自动连接的方法
当然可以实现!作为经常折腾AOSP的开发者,我来给你分享几种靠谱的方案,都是实际项目中用过的,能让你烧录ROM后直接自动连上WiFi,省掉手动输入的麻烦:
方法1:通过
wpa_supplicant.conf预配置(最通用) Android底层靠wpa_supplicant管理WiFi连接,我们直接把WiFi信息打包到系统的配置文件里,系统启动后会自动加载。
步骤如下:
- 找到你的设备配置目录:
device/<你的厂商>/<设备型号>/(如果没有就自己创建这个目录) - 新建
wifi文件夹,里面创建wpa_supplicant.conf,内容按下面的格式写:
ctrl_interface=/data/misc/wifi/sockets update_config=1 country=CN # 换成你所在地区的国家代码 network={ ssid="你的WiFi名称" # 注意引号要保留 psk="你的WiFi密码" key_mgmt=WPA-PSK # 加密方式,WPA2-PSK也用这个;开放网络直接删掉这行和psk priority=1 # 优先级,数字越大越优先连接 }
- 在设备的
device.mk里添加编译规则,把这个配置文件拷贝到系统路径:
PRODUCT_COPY_FILES += \ device/<你的厂商>/<设备型号>/wifi/wpa_supplicant.conf:system/etc/wifi/wpa_supplicant.conf
- 搞定权限:因为系统对文件权限要求严格,得给配置文件设置正确的权限。创建
set_wifi_permissions.sh脚本放在设备目录:
chmod 644 /system/etc/wifi/wpa_supplicant.conf chown system:wifi /system/etc/wifi/wpa_supplicant.conf
然后在device.mk里加:
PRODUCT_COPY_FILES += \ device/<你的厂商>/<设备型号>/set_wifi_permissions.sh:system/bin/set_wifi_permissions.sh # 添加开机执行的rc文件 PRODUCT_COPY_FILES += \ device/<你的厂商>/<设备型号>/init.wifi.rc:system/etc/init/init.wifi.rc
init.wifi.rc的内容:
on boot exec system system -- /system/bin/sh /system/bin/set_wifi_permissions.sh
这样开机后会自动给配置文件设置权限,wpa_supplicant启动时就会加载它,自动连接WiFi。
方法2:通过Settings默认配置(Android 8.0+适用)
从Android O开始,可以通过系统Settings的默认值来预配置,这种方式更贴近原生系统的设置逻辑。
步骤:
- 在设备目录下创建
overlay文件夹,路径是device/<你的厂商>/<设备型号>/overlay - 新建
frameworks/base/packages/SettingsProvider/res/values/defaults.xml文件,添加WiFi默认配置:
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="def_wifi_on">true</bool> <!-- 默认开启WiFi --> <string name="def_wifi_ssid">"你的WiFi名称"</string> <string name="def_wifi_psk">"你的WiFi密码"</string> <string name="def_wifi_key_mgmt">"WPA-PSK"</string> </resources>
- 在
device.mk里引用这个overlay:
PRODUCT_PACKAGE_OVERLAYS += device/<你的厂商>/<设备型号>/overlay
⚠️ 注意:有些原生AOSP的SettingsProvider可能不会自动读取这些值,这时候你需要修改frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java里的loadSystemSettings方法,添加逻辑把这些默认值插入到WiFi的配置数据库中。
方法3:通过开机脚本自动添加WiFi(灵活易调试)
如果不想改太多系统文件,用开机执行shell命令的方式也很方便,适合快速测试。
步骤:
- 创建
add_wifi.sh脚本放在设备目录:
#!/system/bin/sh # 等WiFi服务启动,避免执行太早失败 sleep 10 # 添加并启用WiFi网络 wpa_cli -i wlan0 add_network wpa_cli -i wlan0 set_network 0 ssid '"你的WiFi名称"' wpa_cli -i wlan0 set_network 0 psk '"你的WiFi密码"' wpa_cli -i wlan0 set_network 0 key_mgmt WPA-PSK wpa_cli -i wlan0 enable_network 0 wpa_cli -i wlan0 save_config
- 在
device.mk里把脚本拷贝到系统:
PRODUCT_COPY_FILES += \ device/<你的厂商>/<设备型号>/add_wifi.sh:system/bin/add_wifi.sh
- 添加开机启动的rc文件
init.addwifi.rc:
on boot exec system system -- /system/bin/sh /system/bin/add_wifi.sh
然后在device.mk里加:
PRODUCT_COPY_FILES += \ device/<你的厂商>/<设备型号>/init.addwifi.rc:system/etc/init/init.addwifi.rc
⚠️ 注意:wlan0是WiFi接口名称,不同设备可能不一样,比如有些平板是wlan1,你可以先烧个原生ROM,用ip link命令查看实际接口名。
几个关键注意事项
- 加密方式要匹配:如果是开放WiFi,就删掉
key_mgmt和psk;如果是企业级WPA2,需要配置eap、identity等额外参数。 - 版本兼容性:不同Android版本的系统路径、权限规则有差异,比如Android 10+对系统分区写权限限制更严,要确保路径正确。
- 测试排查:烧录后如果没自动连接,用
logcat | grep wpa_supplicant看日志,一般能找到是配置文件权限不对还是加密方式不匹配的问题。
内容的提问来源于stack exchange,提问作者Saleh




