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编译的时候生成的。