注:好记性不如烂笔头,记录自己项目解决问题的方案, 每个项目的实际情况不一样,但方案思路可参考
在传统平台上,tbox⽹卡与tbox设备link状态强相关,当tbox设备link up时,⽹卡挂载且分配ip;当tbox link down时,会移除⽹卡的所有配置。 在8155平台上,由于以太⽹设备必须通过QNX系统识别,所以tbox⽹卡与仪表通讯⽹卡必须共⽤,⽽仪表通 信⽹卡开机默认启动且不能被移除,所以应⽤通过接⼝获取到以太⽹络始终可⽤。
解决思路: 通过修改Ethernet框架层代码动态根据tbox link状态通知应⽤以太⽹卡状态变化但不实际更改⽹卡配置。
上代码:
第一笔改动
代码位置:framework/base/services/core/java/com/android/server/ConnectivityService.java
/**
* 定义一个 SystemProperties的key
* Tbox attach state. Details in TboxService
*/
private static final String PROP_TBOX_ATTACH_STATE = "persist.xxx.yyyy";
//修改 getActiveNetworkInfo方法
@Override
public NetworkInfo getActiveNetworkInfo() {
enforceAccessPermission();
final int uid = Binder.getCallingUid();
final NetworkState state = getUnfilteredActiveNetworkState(uid);
filterNetworkStateForUid(state, uid, false);
maybeLogBlockedNetworkInfo(state.networkInfo, uid);
if(state != null && state.networkInfo != null) {
if((ConnectivityManager.getNetworkTypeName(ConnectivityManager.TYPE_ETHERNET)).equalsIgnoreCase(state.networkInfo.getTypeName())) {
if(SystemProperties.getInt(PROP_TBOX_ATTACH_STATE, 0) == 0) {
state.networkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null);
state.networkInfo.setIsAvailable(false);
}
}
}
return state.networkInfo;
}
第二笔改动
代码位置:framework/base/services/core/java/com/android/server/ConnectivityService.java
//定义设置网络连接状态的方法
private void setEth0Disconnect(NetworkState state) {
if(state != null && state.networkInfo != null) {
if((ConnectivityManager.getNetworkTypeName(ConnectivityManager.TYPE_ETHERNET)).equalsIgnoreCase(state.networkInfo.getTypeName())) {
if(SystemProperties.getInt(PROP_TBOX_ATTACH_STATE, 0) == 0) {
state.networkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null);
state.networkInfo.setIsAvailable(false);
}
}
}
}
//分别在以下方法中调用
public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) {
NetworkStack.checkNetworkStackPermission(mContext);
final NetworkState state = getUnfilteredActiveNetworkState(uid);
filterNetworkStateForUid(state, uid, ignoreBlocked);
setEth0Disconnect(state);
return state.networkInfo;
}
@Override
public NetworkInfo getNetworkInfo(int networkType) {
enforceAccessPermission();
final int uid = Binder.getCallingUid();
if (getVpnUnderlyingNetworks(uid) != null) {
// A VPN is active, so we may need to return one of its underlying networks. This
// information is not available in LegacyTypeTracker, so we have to get it from
// getUnfilteredActiveNetworkState.
final NetworkState state = getUnfilteredActiveNetworkState(uid);
if (state.networkInfo != null && state.networkInfo.getType() == networkType) {
filterNetworkStateForUid(state, uid, false);
setEth0Disconnect(state);
return state.networkInfo;
}
}
final NetworkState state = getFilteredNetworkState(networkType, uid);
setEth0Disconnect(state);
return state.networkInfo;
}
@Override
public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) {
enforceAccessPermission();
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
if (nai != null) {
final NetworkState state = nai.getNetworkState();
filterNetworkStateForUid(state, uid, ignoreBlocked);
setEth0Disconnect(state);
return state.networkInfo;
} else {
return null;
}
然后在自己的TBOX服务中,检测TBOX的连接状态, 调用SystemProperties.set()方法设置相应的属性即可, 前提需要在系统权限,系统用户的进程中。
参考:
Android network框架分析之NetworkManagementService和netd交互深入分析(一)_ʚ兔子的先森ɞ的博客-CSDN博客