Android 8.1 系统多网口实现方法
分享一篇本人专利技术,已提交申请,转发请备注,谢谢!
软件开发交流群
![效果图](https://i-blog.csdnimg.cn/blog_migrate/d47847294c7eff8daa6d72285c7a8c77.jpeg)
基于 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 获取相关代码
![效果图](https://i-blog.csdnimg.cn/blog_migrate/625356c947f5cb8977461fa062256eba.jpeg)