Android 工作中BUG处理,以太网静态IP设置后信息丢失问题

问题背景:
Android10,MTK平台,AOSP 9638方案,在连接了Ethernet手动设置IP信息,断电上电重启TV设备后,以太网回连失败,ip信息为空问题,但拔插网线或者串口执行ifconfig eth0 down 、 ifconfig eth0 up可恢复正常。

解决方案:
首先在EthernetTracker.java中更改maybeTrackInterface()方法的类型,然后启动一个工作线程,判断当前以太网接口是否处于活动状态,即读取sys/class/net/eth0/carrier的值,如果为1则为活动状态,读取文件内容并返回连接状态true,否则会记录错误并返回 false,最后执行updateInterfaceState(mIfaceTmp, false); 和 updateInterfaceState(mIfaceTmp, true); 以此重启网络接口,相当于串口执行ifconfig eth0 down 、 ifconfig eth0 up 的效果。

代码对策:

--- a/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
+++ b/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
@@ -45,6 +45,10 @@ import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.concurrent.ConcurrentHashMap;
 
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
 /**
  * Tracks Ethernet interfaces and manages interface configurations.
  *
@@ -236,12 +240,15 @@ final class EthernetTracker {
         }
     }
 
-    private void maybeTrackInterface(String iface) {
+    //private void maybeTrackInterface(String iface) {
+		private boolean maybeTrackInterface(String iface) {
+			Log.d("zxx","11111");
         if (DBG) Log.i(TAG, "maybeTrackInterface " + iface);
         // If we don't already track this interface, and if this interface matches
         // our regex, start tracking it.
         if (!iface.matches(mIfaceMatch) || mFactory.hasInterface(iface)) {
-            return;
+            //return;
+			return false;
         }
 
         if (mIpConfigForDefaultInterface != null) {
@@ -250,18 +257,58 @@ final class EthernetTracker {
         }
 
         addInterface(iface);
+		 return true;
     }
     private void trackAvailableInterfaces() {
         try {
             final String[] ifaces = mNMService.listInterfaces();
             for (String iface : ifaces) {
-                maybeTrackInterface(iface);
+                //maybeTrackInterface(iface);
+			    if (maybeTrackInterface(iface)) {
+                    String mIfaceTmp = iface;
+                    new Thread(new Runnable() {
+                        public void run() {
+                            //carrier is always 1 when kernel boot up,
+                            // sleep a little time to wait kernel's correct carrier status
+                            try {
+                                Thread.sleep(3000);
+                            } catch (InterruptedException ignore) {
+                            }
+							if(isEthernetInterfaceActive()){
+                                IpConfiguration config = getIpConfiguration(mIfaceTmp);
+                                if(config != null && IpAssignment.STATIC == config.getIpAssignment())
+                                {
+                                    updateInterfaceState(mIfaceTmp, false);
+                                    updateInterfaceState(mIfaceTmp, true);
+                                }
+                            }else{
+                                 updateInterfaceState(mIfaceTmp, false);
+                             }
+                        }
+                    }).start();
+                    break;
+                }
             }
         } catch (RemoteException | IllegalStateException e) {
             Log.e(TAG, "Could not get list of interfaces " + e);
         }
     }
+	
+   private boolean isEthernetInterfaceActive() {
+    String ifaceName = "eth0"; //check carrier status;ifaceName depond on actual situation
+    try {
+        String carrierFilePath = "/sys/class/net/" + ifaceName + "/carrier";
+        BufferedReader reader = new BufferedReader(new FileReader(carrierFilePath));
+        String carrierStatus = reader.readLine();
+        reader.close();
+        return "1".equals(carrierStatus);
+    } catch (IOException e) {
+        Log.e(TAG, "Could not read carrier status for interface " + ifaceName, e);
+        return false;
+    }
+  }
+
     private class InterfaceObserver extends BaseNetworkObserver {

  • 20
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
针对Android的冻屏bug处理,您可以尝试以下几个方法来解决问题: 1. 检查设备设置:首先,确保您的设备没有启用任何特定的冻屏设置。有些设备有自动冻屏或定时冻屏功能,可能会导致应用程序在一段时间后自动冻结。检查设置菜单的“显示”或“锁屏”选项,调整对应的设置。 2. 检查应用程序代码:检查您的应用程序代码,尤其是与屏幕状态相关的部分。确保您正确地处理了屏幕冻结和解冻事件。您可以使用Android的生命周期方法(如onPause()和onResume())来处理这些事件,以确保应用程序在冻屏和解冻时正确地执行所需的操作。 3. 使用WakeLock:如果您的应用程序需要在屏幕关闭时继续运行(例如后台音乐播放器),您可以使用WakeLock来保持设备唤醒状态。这样可以防止设备进入休眠模式并导致应用程序被冻结。但是,请注意使用WakeLock可能会对设备电池寿命产生一定影响,因此请明智地使用。 4. 更新设备驱动程序和固件:有时,冻屏问题可能是由设备驱动程序或固件问题引起的。确保您的设备上运行的Android版本和相关驱动程序是最新的。可以通过检查设备制造商的官方网站或系统更新功能来获取最新的更新。 5. 联系开发者社区:如果以上方法都无法解决问题,可以尝试在开发者社区寻求帮助。在Android开发者论坛、Stack Overflow或GitHub等平台上,可能有其他开发者遇到类似的问题并提供了解决方案或建议。 请注意,以上方法仅为一般建议,具体解决方案可能因设备、应用程序和操作系统版本而异。根据实际情况进行调试和排除故障是解决冻屏bug的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值