美文网首页
Framework - [Android 8.1 系统多网口实现

Framework - [Android 8.1 系统多网口实现

作者: 他晓 | 来源:发表于2021-08-29 23:29 被阅读0次

    分享一篇本人专利技术,已提交申请,转发请备注,谢谢!

    软件开发交流群
    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 获取相关代码

    相关文章

      网友评论

          本文标题:Framework - [Android 8.1 系统多网口实现

          本文链接:https://www.haomeiwen.com/subject/eufniltx.html