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的c76d24device_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加的是驱动),加模块倒是没遇到什么大麻烦

标签: none

已有 12 条评论

  1. 请教一下 请教一下

    是怎么 在 redroid 里面加入libhoudini的? 需要改那些东西

    1. Ted Ted

      加入这个仓库https://github.com/supremegamers/vendor_intel_proprietary_houdini

    2. Ted Ted

      Google官方文档(https://source.android.com/docs/core/architecture/vndk/linker-namespace?hl=zh-cn#changes-r)中是这么说的:在 Android 11 中,静态 ld.config.*.txt 文件会从代码库中移除,而 LinkerConfig 会在运行时生成它们。这个库应该是完成了LinkerConfig的相关配置,而且这个配置应该是AOSP编译的时候生成的。

  2. 有个问题 有个问题

    我直接使用了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

    1. Ted Ted

      能提供更多信息吗,比如使用普通镜像能否上网;然后使用我的这个版本的镜像,docker exec分别执行`/system/bin/ip`和`execns router /system/bin/ip`,将执行命令的结果发来看一下

      1. 有个问题 有个问题

        使用大佬仓库里面的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

        1. Ted Ted

          噢噢,我可能说的不太清楚,有些遗漏。就是teddynight/redroid:latest的执行`/system/bin/ip a`,然后teddynight/redroid:redroid-11-wifi的执行` /vendor/bin/execns router ip a`,能麻烦你再发一次结果给我看看吗

          1. Ted Ted

            然后前面命令执行之后,在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这里那么严重

  3. 有个问题 有个问题

    这是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

  4. Ted Ted

    记录一下这位朋友遇到的问题:iptable_nat模块没有加载

  5. Fei Fei

    能提供下arm64的镜像吗

    1. Ted Ted

      你好,我电脑上原来的工程删了,重新下载编译比较耗时,可能暂时不提供了。你可以尝试自己编译,如果遇到问题我可以提供一些力所能及的帮助!

添加新评论