修改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 类里
@VisibleForTesting
public 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);
}
}
@VisibleForTesting
protected 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后,在路由器上可以看到如下: