Framework – [Android 8.1 系统多网口实现方法]

Framework – [Android 8.1 系统多网口实现方法]Android 8.1 系统多网口实现方法 分享一篇本人专利技术,已提交申请,转发请备注,谢谢! 软件开发交流群 QQ 群:686809487

Android 8.1 系统多网口实现方法

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

软件开发交流群

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://bianchenghao.cn/19555.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注