Redroid 11 启用虚拟wifi
首先感谢@zhouziyang的Redroid项目,能够在docker上跑一个丝滑的Android
根据@zhouziyang几篇issuses中的提示,参考他对redroid 10的修改完成了我对redroid 11的修改
开启虚拟wifi需要docker宿主机启用mac80211_hwsim模块!!
成品镜像DockerHub链接,选择redroid-11-wifi分支,这个镜像本身也添加了Google框架和libhoudini
添加这个虚拟wifi是因为想在服务器上跑某vpn软件,但是软件一直提示无法链接,根据logcat和软件开源部分代码来看,有可能是通过getNetworkInfo等相关方法获取不到当前有效的Networkinfo,并且暴力尝试(bushi)虚拟机安装多个版本的Android x86之后,发现有虚拟wifi的虚拟机连接成功概率更高,并且一直成功连接的wsa虚拟机也是虚拟wifi的。
先上效果图
首先,根据这篇issuse,先注释掉这行workaround
根据某篇issuse找到了历史的包含redroid-10-wifi分支的commit,vendor_droid的c76d24和device_generic_goldfish
根据@zhouziyang的提示,阅读init.wifi.sh
,了解虚拟wifi的结构拓扑
虚拟wifi利用mac80211_hwsim
这个模块,利用namespace将docker容器默认提供的以太网接口与安卓主系统分开,然后在router的namespace下利用mac80211_create_radios
创建虚拟wifi信号,开启hostapd和dhcp服务器,并设置NAT和重新初始化eth0
拓扑结构如下(摘自init.wifi.sh)
难点在于修改现有的设备树:
添加相应模块,参考andorid 11相应的vendor.mk,修改vendor/redroid/vendor.mk加入相应模块,参考作者commit修改goldfish下的init.wifi.sh,在设备树device/redroid中,修改相应的service rc文件,添加service和部分初始化代码,然后解决编译过程各种报错,包括但不限于编译wpa_supplicant的报错需要修改goldfish的mk文件(参考commit),让目录下所有的库可见。
ps: 不得不说android这些年还是变化很大
现在编译简直不要太方便,(更好的设备加持),android改进了的编译系统,组件的增量编译不要几分钟就完成了
android 11底层api有些变化还埋了雷,之前houdini库他有个linker设置让我不得不从头编译这个镜像(还好加入vendor有现成的)
这次adbd搞死我,发现/system/bin/adbd不存在?!可是start adbd又可以,后来一查官方文档
adbd 模块 ( com.android.adbd ) 采用APEX格式,adbd藏在/apex/com.android.adbd
下这才找到,整个调试过程最耗时间就是这里
新的android构建系统加入个小模块感觉比以前体验好一点?(也许不像上次玩cm11加的是驱动),加模块倒是没遇到什么大麻烦
是怎么 在 redroid 里面加入libhoudini的? 需要改那些东西
加入这个仓库https://github.com/supremegamers/vendor_intel_proprietary_houdini
Google官方文档(https://source.android.com/docs/core/architecture/vndk/linker-namespace?hl=zh-cn#changes-r)中是这么说的:在 Android 11 中,静态 ld.config.*.txt 文件会从代码库中移除,而 LinkerConfig 会在运行时生成它们。这个库应该是完成了LinkerConfig的相关配置,而且这个配置应该是AOSP编译的时候生成的。
我直接使用了wifi镜像,并启用了sudo modprobe mac80211_hwsim这个模块(没做什么额外配置)
可是总是没有网络,我需要额外做什么吗?
是不是还得要配置这些东西
”
虚拟wifi利用mac80211_hwsim这个模块,利用namespace将docker容器默认提供的以太网接口与安卓主系统分开,然后在router的namespace下利用mac80211_create_radios创建虚拟wifi信号,开启hostapd和dhcp服务器,并设置NAT和重新初始化eth0
“
我尝试设置了下,总是会卡住,希望能指导一下
然后我的宿主机是一台跑在腾讯云上面的ubuntu的云主机,这是我的docker启动命令
docker run -itd --privileged \
--name redroid-wifi \
-v /root/docker/redroid-wifi:/data \
-p 55555:5555 \
-p 10001:1080 \
-p 10002:8080 \
teddynight/redroid:redroid-11-wifi \
androidboot.redroid_net_proxy_type=static \
androidboot.hardware=mt6891 \
ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi \
ro.product.cpu.abilist64=x86_64,arm64-v8a \
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi \
ro.dalvik.vm.isa.arm=x86 \
ro.dalvik.vm.isa.arm64=x86_64 \
ro.enable.native.bridge.exec=1 \
ro.enable.native.bridge.exec64=1 \
ro.dalvik.vm.native.bridge=libhoudini.so
能提供更多信息吗,比如使用普通镜像能否上网;然后使用我的这个版本的镜像,docker exec分别执行`/system/bin/ip`和`execns router /system/bin/ip`,将执行命令的结果发来看一下
使用大佬仓库里面的teddynight/redroid:latest 这个是正常的
然后执行上述的命令返回如下信息
root@VM-16-8-ubuntu:~# docker exec -it redroid-wifi execns router /system/bin/ip
OCI runtime exec failed: exec failed: unable to start container process: exec: "execns": executable file not found in $PATH: unknown
root@VM-16-8-ubuntu:~# docker exec -it redroid-wifi /system/bin/ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: wlan0: mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 02:15:b3:00:00:00 brd ff:ff:ff:ff:ff:ff
4: radio0@if2: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether de:48:7a:db:91:3c brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet 192.168.200.2/24 brd 192.168.200.255 scope global radio0
valid_lft forever preferred_lft forever
噢噢,我可能说的不太清楚,有些遗漏。就是teddynight/redroid:latest的执行`/system/bin/ip a`,然后teddynight/redroid:redroid-11-wifi的执行` /vendor/bin/execns router ip a`,能麻烦你再发一次结果给我看看吗
然后前面命令执行之后,在wifi镜像下docker exec执行`/vendor/bin/execns router ping 223.5.5.5`,不通再试试你docker宿主机的ip,docker容器所在虚拟子网的网关ip,其实这些都是为了先确定看看是不是网卡重新创建出现了问题。因为你前面提到你说你的容器成功启动,只是不能上网,应该是命名空间开起来了,问题没有https://github.com/TeddyNight/device_generic_goldfish/issues/1这里那么严重
这是wifi的
root@VM-16-8-ubuntu:~# docker exec -it redroid-wifi /vendor/bin/execns router ip a
1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: radio0-peer@if4: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ca:d0:be:b6:d2:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet 192.168.200.1/24 scope global radio0-peer
valid_lft forever preferred_lft forever
inet6 fe80::c8d0:beff:feb6:d2d8/64 scope link
valid_lft forever preferred_lft forever
3: wlan1: mtu 1400 qdisc mq state UP group default qlen 1000
link/ether 02:15:b3:00:01:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.232.1/21 scope global wlan1
valid_lft forever preferred_lft forever
inet6 fe80::15:b3ff:fe00:100/64 scope link
valid_lft forever preferred_lft forever
17: eth0@if18: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever
root@VM-16-8-ubuntu:~# docker exec -it redroid-wifi /vendor/bin/execns router ping 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=1 ttl=116 time=38.5 ms
64 bytes from 223.5.5.5: icmp_seq=2 ttl=116 time=38.5 ms
64 bytes from 223.5.5.5: icmp_seq=3 ttl=116 time=38.4 ms
^C
--- 223.5.5.5 ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 3004ms
rtt min/avg/max/mdev = 38.492/38.503/38.512/0.226 ms
然后这是不带wifi的
root@VM-16-8-ubuntu:~# docker exec -it redroid /system/bin/ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
19: eth0@if20: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::36d4:9b8b:1188:f0ed/64 scope link stable-privacy
valid_lft forever preferred_lft forever
然后我的redroid-wifi的用scrcpy查看的话,是连上AndroidWIfi的,但是没有网络
(我是一台在香港的机器)
另外大佬你的博客评论老是发布上去,方便给个联系方式吗?
这是我的邮箱huhbo1992@@gmail.com
记录一下这位朋友遇到的问题:iptable_nat模块没有加载
能提供下arm64的镜像吗
你好,我电脑上原来的工程删了,重新下载编译比较耗时,可能暂时不提供了。你可以尝试自己编译,如果遇到问题我可以提供一些力所能及的帮助!