设备名"/>
Android11修改连接WiFi后AP端显示的设备名
修改build.prop文件
1.修改 /system/build.prop 最后添加,xxx 为自己设置的设备名:
net.hostname=xxx
2. 重启、重连wifi,从热点或路由器后台查看设备名即为修改后的名称
代码里动态配置
暴力手段:grep -rn “net.hostname” *
可以看到/packages/modules/NetworkStack / src/android/net/dhcp/DhcpPacket.java 类里
@VisibleForTestingpublic String getHostname() {if (mHostName == null&& !ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.Q)) {return SystemProperties.get("net.hostname");}return mHostName;}
打印日志可知,mHostName为null,并且ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.Q)为true,所以if里面为false,走了return mHostName;所以AP端没有收到这个值,路由器页面显示设备,显示匿名主机。
既然搞清楚这里了,那就很简单了,第一:让if里走进去,return SystemProperties.get(“net.hostname”);
第二:找个合适的位置,合适的时机set一下net.hostname,这不就完事了。
由于我们需求显示的是设备名加上SN号后四位,这里没有权限读取SN,还得处理Selinux权限,所以换个地方。
//frameworks/base / services/core/java/com/android/server/ConnectivityService.java
//构造里添加了下面一个方法private void updateApName() {String apName = SystemProperties.get("net.hostname");if (apName == null || apName.equals("")) {String deviceSn = SystemProperties.get("ro.serialno");if (deviceSn != null && !deviceSn.equals("")) {if (deviceSn.length() > 4) {apName = "XXXXXX_" + deviceSn.substring(deviceSn.length() - 4);} else {apName = "XXXXXX_" + deviceSn;}} else {apName = "XXXXX";}SystemProperties.set("net.hostname", apName);}}@VisibleForTestingprotected ConnectivityService(Context context, INetworkManagementService netManager,INetworkStatsService statsService, INetworkPolicyManager policyManager,IDnsResolver dnsresolver, IpConnectivityLog logger, INetd netd, Dependencies deps) {if (DBG) log("ConnectivityService starting up");//*************************************************updateApName();//*************************************************
}
编译一下,验证,连接上WiFi后,在路由器上可以看到如下:
更多推荐
Android11修改连接WiFi后AP端显示的设备名
发布评论