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模块没有加载
我的现象和上面一样,运行的是redroid-wifi镜像,现象是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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: wlan0: mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 02:15:b3:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.232.2/21 brd 192.168.239.255 scope global wlan0
valid_lft forever preferred_lft forever
inet6 fe80::6f20:a4cf:9716:c031/64 scope link stable-privacy
valid_lft forever preferred_lft forever
4: radio0@if2: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ee:51:18:02:52:96 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
inet6 fe80::ec51:18ff:fe02:5296/64 scope link
valid_lft forever preferred_lft forever
665ce944c10d:/ # /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 aa:01:c9:89:89:c7 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::a801:c9ff:fe89:89c7/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
21: eth0@if22: 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
665ce944c10d:/ # /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=117 time=4.86 ms
64 bytes from 223.5.5.5: icmp_seq=2 ttl=117 time=4.84 ms
iptable_nat也加载了
lsmod
Module Size Used by
iptable_nat 16384 1
xt_nat 16384 1
xt_tcpudp 20480 3
veth 32768 0
mac80211_hwsim 90112 0
mac80211 1253376 1 mac80211_hwsim
cfg80211 974848 2 mac80211_hwsim,mac80211
libarc4 16384 1 mac80211
ashmem_linux 20480 57
binder_linux 217088 100 [permanent]
ipt_REJECT 16384 1
nf_reject_ipv4 16384 1 ipt_REJECT
tls 114688 0
tcp_diag 16384 0
inet_diag 24576 1 tcp_diag
xt_conntrack 16384 1
nft_chain_nat 16384 3
xt_MASQUERADE 20480 4
nf_nat 49152 4 iptable_nat,xt_nat,nft_chain_nat,xt_MASQUERADE
docker exec 执行一下 `/vendor/bin/execns router iptables -L -t nat` 看看转发规则有没有正确建立
能提供下arm64的镜像吗
你好,我电脑上原来的工程删了,重新下载编译比较耗时,可能暂时不提供了。你可以尝试自己编译,如果遇到问题我可以提供一些力所能及的帮助!
Ted大兄弟,真心请求一下redroid11,x86_64版本到底是怎么集成libhoudini.so的呀,能说具体一点吗。我看https://github.com/supremegamers/vendor_intel_proprietary_houdini这个仓库有很多分支,然后我选择了默认的wsa,按照他的步骤来发现redroid11源码上并没有nativebridge这个目录,跟device/generic/common上的东西根本都对不上。我直接在redroid的device.mk上加入$(call inherit-product-if-exists, vendor/intel/proprietary/houdini/houdini.mk)
$(call inherit-product-if-exists, vendor/intel/proprietary/houdini/native_bridge_arm_on_x86.mk)。发现libhoudini.so是有了,但是仍然打不开arm的app。所以特别疑惑https://hub.docker.com/repository/docker/teddynight/redroid这个是怎么做到的,看到能留个联系方式或者回复下吗,十分感谢!!!!
很久没搞这个了,印象里你device.mk设置是没问题的,然后wsa分支对应的是android11,确保你把那个项目克隆到了vendor/intel/proprietary/houdini;然后你docker启动参数参照dockerhub上我之前的设置,设置正确应该是可以的。另外你要确定APP在其他环境比如wsa下能不能正常打开。
docker exec -it redroid_redroid-wifi_1 /vendor/bin/execns router iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.232.0/21 anywhere
MASQUERADE all -- 192.168.200.0/24 anywhere
wifi网络连接受限怎么搞啊 大佬 用wlan1(这个应该是虚拟wifi的服务端吧)IP地址去ping 8.8.8.8也是可以ping通的