Android 13 设置静态ip导致有线网一直断开重连分析解决

Android 13 设置静态ip导致有线网一直断开重连分析解决

本文分享一个Android13 有线网的bug!或者说新的有线网络的一个修改。

Android13 设置静态ip地址发现一个问题,有线网会一直断开重连。

设置正常的网关没有这个问题,设置错误的网关就会有这个问题。

一、简单分析和解决

1、日志线索:

找到循环断开连接的关键日志,从日志中找出连接上后,断开网络的日志。


05-13 15:28:38.768  1186  3064 W IpClient.eth0: [IpReachabilityMonitor] WARN ALERT neighbor went from: null to: NeighborEvent{@43196,RTM_NEWNEIGH,if=14,170.168.20.1,NUD_FAILED,[null]}
05-13 15:28:38.768   445  3068 W resolv  : Validation failed
05-13 15:28:38.769  1186  3064 W IpReachabilityMonitor: FAILURE: LOST_PROVISIONING, NeighborEvent{@43196,RTM_NEWNEIGH,if=14,170.168.20.1,NUD_FAILED,[null]}
05-13 15:28:38.770   802  1023 I EthernetNetworkFactory: updateNeighborLostEvent FAILURE: LOST_PROVISIONING, NeighborEvent{@43196,RTM_NEWNEIGH,if=14,170.168.20.1,NUD_FAILED,[null]}
05-13 15:28:38.771   802  1023 D EthernetNetworkFactory: reconnecting Ethernet
05-13 15:28:38.845   802  1023 D EthernetNetworkFactory: Starting Ethernet IpClient(eth0)
05-13 15:28:38.846   802  1024 D ConnectivityService: [105 ETHERNET] EVENT_NETWORK_INFO_CHANGED, going from CONNECTED to DISCONNECTED
05-13 15:28:38.846   802  1024 D ConnectivityService: [105 ETHERNET] disconnected, was satisfying 16
05-13 15:28:38.851   802  1024 W BestClock: java.time.DateTimeException: Missing NTP fix

从上面日志看到,IpReachabilityMonitor 这个类打印了验证失败的信息,
接着往 EthernetNetworkFactory 和 ConnectivityService 进行通知。

并且从日志很容易可以看到相关流程类:

2、相关代码类:

packages\modules\Connectivity\service\src\com\android\server\ConnectivityService.java

packages\modules\Connectivity\service-t\src\com\android\server\ethernet\EthernetNetworkFactory.java

packages\modules\NetworkStack\src\android\net\ip\IpReachabilityMonitor.java

3、重连的关键代码

EthernetNetworkFactory.java


        void updateNeighborLostEvent(String logMsg) {
            Log.i(TAG, "updateNeighborLostEvent " + logMsg); //上面日志是有打印这个方法的!
            // Reachability lost will be seen only if the gateway is not reachable.(这里写了网关不可用会回调这里)
            // Since ethernet FW doesn't have the mechanism to scan for new networks
            // like WiFi, simply restart.
            // If there is a better network, that will become default and apps
            // will be able to use internet. If ethernet gets connected again,(这里写了有线网会重连!)
            // and has backhaul connectivity, it will become default.
            restart(); // 注释了这行代码,就不会一直断开重连了!
        }

        void restart() {
            restart(null);
        }


        //断开重连的重要流程
        void restart(@Nullable final INetworkInterfaceOutcomeReceiver listener) {
            if (DBG) Log.d(TAG, "reconnecting Ethernet");
            stop();//断开有线网
            start(listener);//启动有线网
        }

从上面代码看 restart就是系统一直断开重连有线网网络的关键点。

至于在哪里对网关gateway 进行检验的,就有对 IpReachabilityMonitor 之前进行追踪分析了。

其实大概也能猜到,应该是在有线网服务的某个地方,设置网关后,
有个Client对象,用子线程对这个网关地址进行连接判断是否正常连接,连接失败就进行回调,后面一路回调。

4、解决方法一直重连:

(1)去除有线网络对网关的检验

这个就要追一下代码了,
思路1,往IpReachabilityMonitor 之前进行追踪分析;
思路2,从EthernetManager 设置有线网网关的配置对象一路往下分析。

这个暂时没分析需求,有兴趣的可以自动进行分析。

(2)去除重连操作

EthernetNetworkFactory.java 去除 restart() 方法的调用即可。

其他:

Android13 有线网对比Android11 是有比较多变更的。

Android 13 有线网变更:
https://blog.csdn.net/wenzhi20102321/article/details/130607641

Android11 有线网和wifi优先级设置:
https://blog.csdn.net/wenzhi20102321/article/details/122243516

其他有线网介绍:
https://so.csdn.net/so/search?q=%E6%9C%89%E7%BA%BF%E7%BD%91&t=blog&u=wenzhi20102321

猜你喜欢

转载自blog.csdn.net/wenzhi20102321/article/details/131296086