#!/system/bin/sh IFACE=wlan0 # WiFi interface name SSID=abcxyz # WiFi network name PSK=foobarfoobar # WiFi network password DIR=/data/local/tmp/WIFI # temporary directory mkdir -p $DIR if [ "$1" = stop ] then pkill wpa_supplicant ip ru del lookup main ip r f table main ip a f dev $IFACE rm -rf $DIR ndc resolver setnetdns 0 '' 0.0.0.0 exit fi # set interface up, add rule to lookup into 'main' table svc wifi disable for i in /sys/class/net/*; do ip link set down dev $(basename $i); done ip link set dev lo up ip link set dev $IFACE up ip rule add lookup main # destroy set network if any ndc network default set 0 # create configuration file <<-CONF cat >$DIR/wpa_supplicant.conf network={ ssid="$SSID" psk="$PSK" scan_ssid=1 } CONF # scan WiFi and connect to access point wpa_supplicant -B -i $IFACE -c $DIR/wpa_supplicant.conf until iw dev $IFACE link | grep -q '^Connected to'; do sleep 1; done # create 'udhcpc' script <<-'SCRIPT' cat >$DIR/udhcpc_default.script #!/system/bin/sh [ "$1" = bound ] || exit 0 # set IP address, add gateway route and set DNS ip address add $ip/$mask dev $interface ip route add default via $router dev $interface ndc resolver setnetdns 0 '' $dns SCRIPT # start DHCP client to obtain IP from server chmod 0755 $DIR/udhcpc_default.script busybox udhcpc -v -f -q -i $IFACE -s $DIR/udhcpc_default.script #!/system/bin/sh IFACE=wlan0 # WiFi interface name SSID=abcxyz # WiFi network name PSK=foobarfoobar # WiFi network password DIR=/data/local/tmp/WIFI # temporary directory mkdir -p $DIR if [ "$1" = stop ] then pkill wpa_supplicant ip ru del lookup main ip r f table main ip a f dev $IFACE rm -rf $DIR ndc resolver setnetdns 0 '' 0.0.0.0 exit fi # set interface up, add rule to lookup into 'main' table svc wifi disable for i in /sys/class/net/*; do ip link set down dev $(basename $i); done ip link set dev lo up ip link set dev $IFACE up ip rule add lookup main # destroy set network if any ndc network default set 0 # create configuration file <<-CONF cat >$DIR/wpa_supplicant.conf network={ ssid="$SSID" psk="$PSK" scan_ssid=1 } CONF # scan WiFi and connect to access point wpa_supplicant -B -i $IFACE -c $DIR/wpa_supplicant.conf until iw dev $IFACE link | grep -q '^Connected to'; do sleep 1; done # create 'udhcpc' script <<-'SCRIPT' cat >$DIR/udhcpc_default.script #!/system/bin/sh [ "$1" = bound ] || exit 0 # set IP address, add gateway route and set DNS ip address add $ip/$mask dev $interface ip route add default via $router dev $interface ndc resolver setnetdns 0 '' $dns SCRIPT # start DHCP client to obtain IP from server chmod 0755 $DIR/udhcpc_default.script busybox udhcpc -v -f -q -i $IFACE -s $DIR/udhcpc_default.script #!/system/bin/sh IFACE=wlan0 # WiFi interface name SSID=abcxyz # WiFi network name PSK=foobarfoobar # WiFi network password DIR=/data/local/tmp/WIFI # temporary directory mkdir -p $DIR if [ "$1" = stop ] then pkill wpa_supplicant ip ru del lookup main ip r f table main ip a f dev $IFACE rm -rf $DIR ndc resolver setnetdns 0 '' 0.0.0.0 exit fi # set interface up, add rule to lookup into 'main' table svc wifi disable for i in /sys/class/net/*; do ip link set down dev $(basename $i); done ip link set dev lo up ip link set dev $IFACE up ip rule add lookup main # destroy set network if any ndc network default set 0 # create configuration file <<-CONF cat >$DIR/wpa_supplicant.conf network={ ssid="$SSID" psk="$PSK" scan_ssid=1 } CONF # scan WiFi and connect to access point wpa_supplicant -B -i $IFACE -c $DIR/wpa_supplicant.conf until iw dev $IFACE link | grep -q '^Connected to'; do sleep 1; done # create 'udhcpc' script <<-'SCRIPT' cat >$DIR/udhcpc_default.script #!/system/bin/sh [ "$1" = bound ] || exit 0 # set IP address, add gateway route and set DNS ip address add $ip/$mask dev $interface ip route add default via $router dev $interface ndc resolver setnetdns 0 '' $dns SCRIPT # start DHCP client to obtain IP from server chmod 0755 $DIR/udhcpc_default.script busybox udhcpc -v -f -q -i $IFACE -s $DIR/udhcpc_default.script #!/system/bin/sh IFACE=wlan0 # WiFi interface name SSID=abcxyz # WiFi network name PSK=foobarfoobar # WiFi network password DIR=/data/local/tmp/WIFI # temporary directory mkdir -p $DIR if [ "$1" = stop ] then pkill wpa_supplicant ip ru del lookup main ip r f table main ip a f dev $IFACE rm -rf $DIR ndc resolver setnetdns 0 -'' 0.0.0.0 exit fi # set interface up, add rule to lookup into 'main' table svc wifi disable for i in /sys/class/net/*; do ip link set down dev $(basename $i); done ip link set dev lo up ip link set dev $IFACE up ip rule add lookup main # destroy set network if any ndc network default set 0 # create configuration file <<-CONF cat >$DIR/wpa_supplicant.conf network={ ssid="$SSID" psk="$PSK" scan_ssid=1 } CONF # scan WiFi and connect to access point wpa_supplicant -B -i $IFACE -c $DIR/wpa_supplicant.conf until iw dev $IFACE link | grep -q '^Connected to'; do sleep 1; done # create 'udhcpc' script <<-'SCRIPT' cat >$DIR/udhcpc_default.script #!/system/bin/sh [ "$1" = bound ] || exit 0 # set IP address, add gateway route and set DNS ip address add $ip/$mask dev $interface ip route add default via $router dev $interface ndc resolver setnetdns 0 -'' $dns SCRIPT # start DHCP client to obtain IP from server chmod 0755 $DIR/udhcpc_default.script busybox udhcpc -v -f -q -i $IFACE -s $DIR/udhcpc_default.script #!/system/bin/sh IFACE=wlan0 # WiFi interface name SSID=abcxyz # WiFi network name PSK=foobarfoobar # WiFi network password DIR=/data/local/tmp/WIFI # temporary directory mkdir -p $DIR if [ "$1" = stop ] then pkill wpa_supplicant ip ru del lookup main ip r f table main ip a f dev $IFACE rm -rf $DIR ndc resolver setnetdns 0 - 0.0.0.0 exit fi # set interface up, add rule to lookup into 'main' table svc wifi disable for i in /sys/class/net/*; do ip link set down dev $(basename $i); done ip link set dev lo up ip link set dev $IFACE up ip rule add lookup main # destroy set network if any ndc network default set 0 # create configuration file <<-CONF cat >$DIR/wpa_supplicant.conf network={ ssid="$SSID" psk="$PSK" scan_ssid=1 } CONF # scan WiFi and connect to access point wpa_supplicant -B -i $IFACE -c $DIR/wpa_supplicant.conf until iw dev $IFACE link | grep -q '^Connected to'; do sleep 1; done # create 'udhcpc' script <<-'SCRIPT' cat >$DIR/udhcpc_default.script #!/system/bin/sh [ "$1" = bound ] || exit 0 # set IP address, add gateway route and set DNS ip address add $ip/$mask dev $interface ip route add default via $router dev $interface ndc resolver setnetdns 0 - $dns SCRIPT # start DHCP client to obtain IP from server chmod 0755 $DIR/udhcpc_default.script busybox udhcpc -v -f -q -i $IFACE -s $DIR/udhcpc_default.script #!/system/bin/sh IFACE=wlan0 # WiFi interface name SSID=abcxyz # WiFi network name PSK=foobarfoobar # WiFi network password DIR=/data/local/tmp/WIFI # temporary directory mkdir -p $DIR if [ "$1" = stop ] then pkill wpa_supplicant ip ru del lookup main ip r f table main ip a f dev $IFACE rm -rf $DIR ndc resolver setnetdns 0 '' 0.0.0.0 exit fi # set interface up, add rule to lookup into 'main' table svc wifi disable for i in /sys/class/net/*; do ip link set down dev $(basename $i); done ip link set dev lo up ip link set dev $IFACE up ip rule add lookup main # destroy set network if any ndc network default set 0 # create configuration file <<-CONF cat >$DIR/wpa_supplicant.conf network={ ssid="$SSID" psk="$PSK" scan_ssid=1 } CONF # scan WiFi and connect to access point wpa_supplicant -B -i $IFACE -c $DIR/wpa_supplicant.conf until iw dev $IFACE link | grep -q '^Connected to'; do sleep 1; done # create 'udhcpc' script <<-'SCRIPT' cat >$DIR/udhcpc_default.script #!/system/bin/sh [ "$1" = bound ] || exit 0 # set IP address, add gateway route and set DNS ip address add $ip/$mask dev $interface ip route add default via $router dev $interface ndc resolver setnetdns 0 '' $dns SCRIPT # start DHCP client to obtain IP from server chmod 0755 $DIR/udhcpc_default.script busybox udhcpc -v -f -q -i $IFACE -s $DIR/udhcpc_default.script svc wifi enable|disable should work if it's only about turning WiFi ON and OFF. Or you can use setWifiEnabled method directly by calling service wifi. On Android 8.1 its code (order) is 24, so you can do from adb shell:
~$ service call wifi s16 null i32 1 # Trun WiFi ON ~$ service call wifi s16 null i32 0 # Trun WiFi OFF But since you also need to add new network to connect, it becomes difficult to go through Android APIs from commandline.
CONNECTING TO WIFI FROM COMMANDLINE:
Another approach is to use wpa_supplicant (and optionally wpa_cli) directly from CLI, don't rely on pre-generated WifiConfigStore.xml or wpa_supplicant.conf.
The following script includes the simple steps:
#!/system/bin/sh IFACE=wlan0 # WiFi interface name SSID=abcxyz # WiFi network name PSK=foobarfoobar # WiFi network password DIR=/data/local/tmp/WIFI # temporary directory mkdir -p $DIR if [ "$1" = stop ] then pkill wpa_supplicant ip ru del lookup main ip r f table main ip a f dev $IFACE rm -rf $DIR ndc resolver setnetdns 0 - 0.0.0.0 exit fi # set interface up, add rule to lookup into 'main' table svc wifi disable for i in /sys/class/net/*; do ip link set down dev $(basename $i); done ip link set dev lo up ip link set dev $IFACE up ip rule add lookup main # destroy set network if any ndc network default set 0 # create configuration file <<-CONF cat >$DIR/wpa_supplicant.conf network={ ssid="$SSID" psk="$PSK" scan_ssid=1 } CONF # scan WiFi and connect to access point wpa_supplicant -B -i $IFACE -c $DIR/wpa_supplicant.conf until iw dev $IFACE link | grep -q '^Connected to'; do sleep 1; done # create 'udhcpc' script <<-'SCRIPT' cat >$DIR/udhcpc_default.script #!/system/bin/sh [ "$1" = bound ] || exit 0 # set IP address, add gateway route and set DNS ip address add $ip/$mask dev $interface ip route add default via $router dev $interface ndc resolver setnetdns 0 - $dns SCRIPT # start DHCP client to obtain IP from server chmod 0755 $DIR/udhcpc_default.script busybox udhcpc -v -f -q -i $IFACE -s $DIR/udhcpc_default.script * Omit the DHCP part if you want to set IP, route and DNS manually. * I use my own built `wpa_supplicant` [binary][2]. `udhcpc` is a busybox applet, `ip`, `iw` and `ndc` are part of stock Android. * For further options see [`wpa_supplicant.conf`][3] and [`udhcpc` samples][4]. DNS:
Apps built with Android SDK depend on Bionic libc resolver for DNS queries, so we need to set DNS servers through native APIs. But still the Java network stack is down, so some apps depending on Android APIs may not behave normally. Programs linked against other C libraries may require resolv.conf to exist. See details in How to configure DNS? and How does Android OS do DNS name resolution?
WIFI DRIVER AND FIRMWARE:
Another problem could be to load WiFi in-kernel driver (as module) and firmware on boot. This is handled by vendor specific wcnss_service which runs in combination with [email protected] HAL. For instance on my device with Qualcomm Atheros Prima WLAN module the service loads firmware (WCNSS_qcom_cfg.ini and related WCNSS_*) files from /vendor/firmware/wlan/prima/ or /persist.
Once you turn on WiFi after boot, all services are started (including wificond) and firmware is loaded. You can check using rfkill or iw phy commands or directly from /sys/class/rfkill. To manually load driver:
~# echo -n sta >/sys/module/wlan/parameters/fwpath Some more details can be found here, here and here.
When loading driver/firmware WiFi interface should already be created. Check using iw dev or ip link. Or you can manually create:
~# iw $(busybox rfkill -no device list wifi) interface add $IFACE type managed