[RK3399/RK3328][Android7.1.1/9.0/10.0] Ethernet:设置静态后,异常断电导致ip设置没有保存的问题

本文详细介绍了在RK3399/RK3328平台上,Android系统以太网静态IP配置在断电重启后丢失的问题。通过深入分析,发现IP设置未正确保存至文件系统。文章提供了修改系统源代码,增加同步命令来确保IP配置持久化的解决方案。

测试平台

Platform: RK3399/RK3328
OS: Android7.1.1/9.0/10.0

现象

在设置-以太网中设置ip地址(如dhcp->static或static ip修改),生效后,立刻断电,重新上电开机后发现ip状态恢复到设置前.

分析

查看了一下以太网的ip设置是以文件方式保存的,怀疑是因为文件存在缓存中没有真正保存导致的。

保存地址:/data/misc/ethernet/ipconfig.txt

再次测试,在设置后运行命令adb shell sync :/data/misc/ethernet/ipconfig.txt 之后再断电,重新上电开机后发现ip状态正确.所以写入文件后sync是可以解决问题的。

解决方案

diff --git a/frameworks/base/services/core/java/com/android/server/net/IpConfigStore.java b/frameworks/base/services/core/java/com/android/server/net/IpConfigStore.java
index d8718a2..3c1750a 100644
--- a/frameworks/base/services/core/java/com/android/server/net/IpConfigStore.java
+++ b/frameworks/base/services/core/java/com/android/server/net/IpConfigStore.java
@@ -38,6 +38,13 @@ import java.io.IOException;
 import java.net.InetAddress;
 import java.net.Inet4Address;
 
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
 public class IpConfigStore {
     private static final String TAG = "IpConfigStore";
     private static final boolean DBG = false;
@@ -167,6 +174,7 @@ public class IpConfigStore {
         }
         out.writeUTF(EOS);
 
+        out.flush();
         return written;
     }
 
@@ -178,10 +186,33 @@ public class IpConfigStore {
                 for(int i = 0; i < networks.size(); i++) {
                     writeConfig(out, networks.keyAt(i), networks.valueAt(i));
                 }
+                Log.v("sjfe","2 writeIpAndProxyConfigurations");
+                try{
+                    sync(filePath);
+                }catch (IOException e){
+                    Log.v("sjfe","2 sync error:"+e.toString());
+                }
+
             }
         });
     }
 
+    public void sync(String filepath) throws IOException {
+        File f = new File(filepath);
+        RandomAccessFile raf = null;
+
+        try {
+            raf = new RandomAccessFile(f, "r");
+            FileDescriptor fd = raf.getFD();
+            fd.sync();
+
+        } finally {
+            if (raf != null) {
+                raf.close();
+            }
+        }
+    }
+
     public SparseArray<IpConfiguration> readIpAndProxyConfigurations(String filePath) {
         SparseArray<IpConfiguration> networks = new SparseArray<IpConfiguration>();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值