Answers:
不幸的是,即使在CyanogenMod中,也无法更改内置网络共享支持的IP地址范围。Wi-Fi热点IP硬编码在android.net.wifi.WifiStateMachine.startTethering()中;USB绑定IP硬编码在com.android.server.connectivity.Tethering中。
但是,如果您的手机已扎根,则可以尝试使用第三方网络共享应用程序,这些应用程序可以更改IP地址范围。例如,当内置的USB绑定在Samsung Galaxy W的CyanogenMod alpha中被破坏时,我使用了适用于Root Users的有线绑定。对于Wi-Fi网络共享,您可以尝试使用同一作者的“ 无线Root用户”应用程序,该应用程序还可以更改IP地址范围。
由于Google代码已关闭,因此以上链接不再起作用。有人将源代码从这些存储库导出到GitHub:
但是,没有进一步的开发活动,这些应用程序可能不再能在最新的Android版本上运行。
万一有人想尝试那些过时的应用程序,我已经能够在Google Code存档中找到一些APK文件:
Android内置的wifi网络共享设计为使用192.168.43.1/24作为服务器,并使用来netd
处理网络共享dnsmasq
。第一个DNS范围是192.168.42.1-254
和,第二个DNS范围是192.168.43.1-254
。
Netd不容易更改。它需要一个套接字才能与其通信,并且该套接字是在android开始绑定时使用的。但是遍历Tethering.java
(我使用Froyo)的源文件,我们看到:
// usb client will be provided 192.168.42.129
private static final String USB_NEAR_IFACE_ADDR = "192.168.42.129";
private static final String USB_NETMASK = "255.255.255.0";
// FYI - the default wifi is 192.168.43.1 and 255.255.255.0
private String[] mDhcpRange;
private static final String DHCP_DEFAULT_RANGE1_START = "192.168.42.2";
private static final String DHCP_DEFAULT_RANGE1_STOP = "192.168.42.254";
private static final String DHCP_DEFAULT_RANGE2_START = "192.168.43.2";
private static final String DHCP_DEFAULT_RANGE2_STOP = "192.168.43.254";
稍后我们将看到使用的范围,如BACKUPS。
mDhcpRange = context.getResources().getStringArray(
com.android.internal.R.array.config_tether_dhcp_range);
if ((mDhcpRange.length == 0) || (mDhcpRange.length % 2 ==1)) {
mDhcpRange = new String[4];
mDhcpRange[0] = DHCP_DEFAULT_RANGE1_START;
mDhcpRange[1] = DHCP_DEFAULT_RANGE1_STOP;
mDhcpRange[2] = DHCP_DEFAULT_RANGE2_START;
mDhcpRange[3] = DHCP_DEFAULT_RANGE2_STOP;
}
dhcp范围的主要来源不是硬编码的42和43,而是从内部字符串数组array.config_tether_dhcp_range中读取的。但目前为空。
您可以编辑android框架。在我的手机上是/system/framework/framework-res.apk
。在线上有大量用于编辑framework-res.apk的教程,从简单的字符串到完整的主题。为您的手机和android版本找到一个。
您要更改的主要内容是 /res/values/arrays.xml
寻找 <array name="config_tether_dhcp_range" />
改成:
<string-array name="config_tether_dhcp_range">
<item>192.168.x.y</item>
<item>192.168.x.z</item>
</string-array>
根据需要进行编译/ zip /签名(遵循教程),然后重新安装。
如果要使用多个范围,只需一遍又一遍地复制两个项目。您始终需要为每个范围提供起点和终点。尝试将其保持在相同的/ 24,即192.168.50.
5和192.168.50.99
其他值。您可以确认它可以使用,busybox ps | grep dnsmasq
或者如果您没有busybox,请ps dnsmasq
使用中的pid cat /proc/pid/cmdline
。您应该获得(或类似):
/ system / bin / dnsmasq --no守护程序--no-poll -no-resolv --dhcp-range = 192.168.50.5,192.168.50.99,1h
FWIW,我的WIFI网络共享使用默认dnsmasq
范围,但已为我的计算机分配了192.168.43.147/24
网关192.168.43.1/24
。不确定为什么您的默认42.x
地址。
注意:根是必需的。
默认的DHCP IP地址范围是硬编码的(1),如果不使用修改后的源代码重建ROM,就无法更改它。或使用一点技巧。
开启网络共享时,至少会发生以下情况:
hostapd
-管理访问点的守护程序-已启动。dnsmasq
-DHCP / DNS服务器(最多Pie)-从硬编码的命令行参数(7)启动(否则可以通过/etc/dnsmasq.conf
(8)设置)。因此,我们可以/system/bin/dnsmasq
用一个自定义的shell脚本替换它,从而控制两者之间的过程。将原始二进制文件重命名为其他名称:
# mv /system/bin/dnsmasq /system/bin/dnsmasq.bin
创建脚本/system/bin/dnsmasq
:
#!/system/bin/sh
OLD_SUBNET='192.168.43'
NEW_SUBNET='192.168.1'
WIFI_INTERFACE='wlan0'
LOCAL_TABLE='97'
export PATH=/system/bin
# delete old route, add new
ip route del ${OLD_SUBNET}.0/24 dev ${WIFI_INTERFACE} table $LOCAL_TABLE
ip route add ${NEW_SUBNET}.0/24 dev ${WIFI_INTERFACE} table $LOCAL_TABLE
# set new IP address on Wi-Fi interface
ip address add ${NEW_SUBNET}.1/24 dev $WIFI_INTERFACE
# inject new subnet in hard-coded arguments received from netd
set -- $(printf '%s' "$*" | sed 's/'${OLD_SUBNET}'/'${NEW_SUBNET}'/g')
unset OLD_SUBNET NEW_SUBNET WIFI_INTERFACE LOCAL_TABLE
# execute original binary with new arguments
exec dnsmasq.bin $*
确认您的Wi-Fi接口的名称(wlan0
通常)。用ip link
或检查ls /sys/class/net/
。
另外,请确认您的本地网络的路由表是97
:grep local_network /data/misc/net/rt_tables
。Android的路由非常混乱,每个新版本都变得更加复杂。因此,我不确定这是否一直存在。同样,在进行任何更改之前,请检查您的路由策略和表以弄清楚应在脚本中添加的内容:
~# RULES="$(ip rule | grep -vE 'unreachable|local')"
~# echo "$RULES"
~# for t in $(echo "$RULES" | awk '{print $NF}' | uniq); do ip r s table $t; done
如果(全部或部分)尚未定义并且status为,则还需要定义SELinux规则enforcing
。使用Magisk suploicy
或其他类似工具sepolicy-inject
:
# execute binaries from /system/bin
allow netd system_file dir { read open getattr search }
allow netd system_file file { read gettattr open execute execute_no_trans }
# execute /system/bin/sh
allow netd shell_exec file { read getattr open execute execute_no_trans }
# execute /system/bin/toolbox and its applets
allow netd toolbox_exec file { read gettattr open execute execute_no_trans }
# configure RPDB rules / routing tables
allow netd netd capability { sys_admin }
*重新启动后无法永久使用,使用某些init.d
脚本或替换/sepolicy
为ramdisk
设置文件权限:
~# chown 0.0 /system/bin/dnsmasq*
~# chmod 0755 /system/bin/dnsmasq*
~# chcon u:object_r:dnsmasq_exec:s0 /system/bin/dnsmasq*
请享用!
或者,您可以从命令行设置完整的网络共享,运行自己的进程。该答案包括说明,尽管问题有所不同。
有关: