分享一篇本人专利技术,已提交申请,转发请备注,谢谢!
软件开发交流群
QQ群:686809487
基于 Android 8.1 系统下 Ethernet 多网口动态获取 IP ,设置 IP 功能的实现方法,通过修改 Android 8.1 系统源码的方式在 Android 8.1 系统的设置界面,子模块网络和互联网界面中增加 Ethernet,Ethernet1,Ethernet2 设置的功能,支持用户静态网络和动态网络的设置,当网线插拔时,动态获取网络的 IP 地址,设置静态 IP 后,重启恢复上次保存的静态 IP 地址信息。
效果图
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述以太网整体框架
在这里插入图片描述 在这里插入图片描述以太网框架相关类调用关系图
在这里插入图片描述实现思路
1. 在 Settings 中增加资源文件和布局文件
2. 在设置界面增加多个网络入口
3. 增加设置网络的 Activity
4. 在 frameworks core 层增加多网口接口和实现方法
5. 在 frameworks net 实现多网络连接的配置方法
UML 类图
在这里插入图片描述主要修改的类 EthernetNetworkFactory
路径:frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
Android 系统默认只支持一个网口,在 EthernetNetworkFactory 类中做了很多限制,以下是 Android 8.1 系统源码
EthernetNetworkFactory [maybeStartIpManager]
public void maybeStartIpManager() {
if (mNetworkRequested && mIpManager == null && isTrackingInterface()) {
startIpManager();
}
}
public boolean isTrackingInterface() {
return !TextUtils.isEmpty(mIface);
}
EthernetNetworkFactory [stopTrackingInterface]
private boolean stopTrackingInterface(String iface) {
if (!iface.equals(mIface))
return false;
Log.d(TAG, "Stopped tracking interface " + iface);
setInterfaceInfo("", null);
stopIpManager();
return true;
}
EthernetNetworkFactory [setInterfaceInfo]
private void setInterfaceInfo(String iface, String hwAddr) {
boolean oldAvailable = isTrackingInterface();
mIface = iface;
mHwAddr = hwAddr;
boolean available = isTrackingInterface();
mNetworkInfo.setExtraInfo(mHwAddr);
mNetworkInfo.setIsAvailable(available);
if (oldAvailable != available) {
int n = mListeners.beginBroadcast();
for (int i = 0; i < n; i++) {
try {
mListeners.getBroadcastItem(i).onAvailabilityChanged(available);
} catch (RemoteException e) {
// Do nothing here.
}
}
mListeners.finishBroadcast();
}
}
EthernetNetworkFactory [InterfaceObserver]
private class InterfaceObserver extends BaseNetworkObserver {
@Override
public void interfaceLinkStateChanged(String iface, boolean up) {
mHandler.post(() -> {
updateInterfaceState(iface, up);
});
}
@Override
public void interfaceAdded(String iface) {
mHandler.post(() -> {
maybeTrackInterface(iface);
});
}
@Override
public void interfaceRemoved(String iface) {
mHandler.post(() -> {
if (stopTrackingInterface(iface)) {
trackFirstAvailableInterface();
}
});
}
}
每次去创建连接时都会去判断 mIface 是否为空,所以要创建多网口支持,必须使maybeStartIpManager() 每次都能调用,可将每次的连接变量存到 HashMap 中,达到每个网口唯一并且可以动态管理
private HashMap<String, IpManager> mMapIpManager = new HashMap<>();
private HashMap<String, NetworkInfo> mMapNetworkInfo = new HashMap<>();
private HashMap<String, NetworkAgent> mMapNetworkAgent = new HashMap<>();
private HashMap<String, LinkProperties> mMapLinkProperties = new HashMap<>();
private HashMap<String, Integer> mMapEtherState = new HashMap<>();
private HashMap<String, Boolean> mMapFaceChange = new HashMap<>();
涉及到的类有
EthernetManager.java
路径:frameworks/base/core/java/android/net/EthernetManager.java
EthernetServiceImpl.java
路径:frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java
关注微信公号 他晓 后台回复 Ethernet 获取相关代码
网友评论