当前位置: 首页 > news >正文

Android13以太网静态IP不保存的问题

最近在做Amlogic T982的样机,关于以太网部分,系统Settings只有一个Ethernet的条目,没有其他任何信息,什么以太网mac地址,开关,IP地址,子网掩码,默认网关,dns, 设置代理,设置静态IP这些功能统统都没有,只能自己参考Android11的代码移植过来,目前来看其他都正常,只有静态IP设置后无法保存,重启之后,依然还是dhcp  查了logcat发现如下信息:

07-26 03:24:59.141   572  2065 E DelayedDiskWrite: Error writing data file /data/misc/apexdata/com.android.tethering/misc/ethernet/ipconfig.txt
07-26 03:24:59.141   972   972 D EthernetSettings: curEtherStateETHER_STATE_CONNECTING
07-26 03:24:59.141   572   748 D EthernetNetworkFactory: updateInterface, iface: eth0, ipConfig: IP assignment: STATIC
07-26 03:24:59.141   572   748 D EthernetNetworkFactory: Static configuration: IP address 192.168.0.179/24 Gateway 192.168.0.1  DNS servers: [ 192.168.0.1 0.0.0.0 ] Domains
07-26 03:24:59.141   572   748 D EthernetNetworkFactory: Proxy settings: NONE
07-26 03:24:59.141   572   748 D EthernetNetworkFactory: , old ipConfig: IP assignment: DHCP
07-26 03:24:59.141   572   748 D EthernetNetworkFactory: Proxy settings: NONE
07-26 03:24:59.141   572   748 D EthernetNetworkFactory: , capabilities: null, old capabilities: [ Transports: ETHERNET Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&NOT_ROAMING&NOT_CONGESTED&NOT_SUSPENDED&NOT_VCN_MANAGED LinkUpBandwidth>=100000Kbps LinkDnBandwidth>=100000Kbps Specifier: <EthernetNetworkSpecifier (eth0)> UnderlyingNetworks: Null], listener: null
07-26 03:24:59.141   572   748 D EthernetNetworkFactory: reconnecting Ethernet

看起来是在写这个文件/data/misc/apexdata/com.android.tethering/misc/ethernet/ipconfig.txt失败了

 找到相关代码位置,packages/modules/Connectivity/service-t/src/com/android/server/ethernet/EthernetConfigStore.java

发现是直接在写配置文件,也没有去判断路径文件是否存在,于是手动创建目录和文件之后,发现IP配置信息会写进去,但是重启之后发现依然还是dhcp

在write方法里面做了路径判断,路径不存在就去创建,并且把路径改成了以前的老版本的路径,

data/misc/ethernet/ipconfig.txt

修改如下:

public void write(String iface, IpConfiguration config) {
-        write(iface, config, APEX_IP_CONFIG_FILE_PATH + CONFIG_FILE);
+        //write(iface, config, APEX_IP_CONFIG_FILE_PATH + CONFIG_FILE);
+               String filePath = LEGACY_IP_CONFIG_FILE_PATH + CONFIG_FILE;
+               try {
+                       File dir = new File(LEGACY_IP_CONFIG_FILE_PATH);
+                       if (!dir.exists()) {
+                               Log.i(TAG, "write path = " + APEX_IP_CONFIG_FILE_PATH + ", dir.exists() = " + dir.exists());
+                               dir.mkdirs();
+                       }
+                       File file = new File(filePath);
+                       if (!file.exists()) {
+                               file.createNewFile();
+                       }
+                       Log.i(TAG, "write file.exists() = " + file.exists());
+                } catch (Exception e) {
+                       Log.i(TAG, "writee:" + e.getMessage());
+                }
+               write(iface, config, filePath);}

这样试了一下,发现可以正常保存和获取到静态IP信息。

以为这样就万事大吉拉?并没有,在反复测试中偶然发现设置静态IP后重启,竟然卡在开机动画无限循环,logcat也没有看到有用的信息,百思不得其解,cat data/misc/ethernet/ipconfig.txt查看了一下配置文件,竟然是空的,设置好静态IP之后,我确定查看过这个文件,IP信息已经写进去了,没想到竟然会丢失数据,于是把这个配置文件删除,再重启,发现就可以正常开机了,那这个随机丢失数据导致不能开机的问题也太致命了,这要是发给客户不得被喷死?还得继续研究一下是什么问题。

我有仔细研究了一下logcat发现了报错信息:

--------- beginning of crash
07-26 06:56:29.917   580   580 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
07-26 06:56:29.917   580   580 E AndroidRuntime: java.lang.RuntimeException: Failed to boot service com.android.server.ConnectivityServiceInitializer: onBootPhase threw an exception during phase 500
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.SystemServiceManager.startBootPhase(SystemServiceManager.java:297)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.SystemServer.startOtherServices(SystemServer.java:2664)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.SystemServer.run(SystemServer.java:938)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.SystemServer.main(SystemServer.java:648)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)
07-26 06:56:29.917   580   580 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to read from field 'int android.util.ArrayMap.mSize' on a null object reference in method 'void android.util.ArrayMap.putAll(android.util.ArrayMap)'
07-26 06:56:29.917   580   580 E AndroidRuntime:        at android.util.ArrayMap.putAll(ArrayMap.java:705)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.ethernet.EthernetConfigStore.loadConfigFileLocked(EthernetConfigStore.java:112)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.ethernet.EthernetConfigStore.read(EthernetConfigStore.java:104)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.ethernet.EthernetConfigStore.read(EthernetConfigStore.java:87)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.ethernet.EthernetTracker.start(EthernetTracker.java:196)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.ethernet.EthernetServiceImpl.start(EthernetServiceImpl.java:85)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.ConnectivityServiceInitializer.onBootPhase(ConnectivityServiceInitializer.java:97)
07-26 06:56:29.917   580   580 E AndroidRuntime:        at com.android.server.SystemServiceManager.startBootPhase(SystemServiceManager.java:294)
07-26 06:56:29.917   580   580 E AndroidRuntime:        ... 6 more
07-26 06:56:29.917   623   642 V APM::AudioPolicyEngine: getDevicesForStrategyInt no device found for strategy 1

查看代码位置:

private void loadConfigFileLocked(final String filepath) {final ArrayMap<String, IpConfiguration> configs =IpConfigStore.readIpConfigurations(filepath);mIpConfigurations.putAll(configs);}

原来是这里直接读取文件,读到的信息是空的没有判断就放进ArrayMap  看log报错是int android.util.ArrayMap.mSize空指针,就是说获取的这个configs为null 

/** Returns a map of network identity token and {@link IpConfiguration}. */public static ArrayMap<String, IpConfiguration> readIpConfigurations(InputStream inputStream) {ArrayMap<String, IpConfiguration> networks = new ArrayMap<>();DataInputStream in = null;try {in = new DataInputStream(inputStream);int version = in.readInt();if (version != 3 && version != 2 && version != 1) {loge("Bad version on IP configuration file, ignore read");return null;}

就是这里文件内容是空的,就直接return null 了

loadConfigFileLocked方法里面拿到数据configs也没有判断是否为空,就直接putAll传进去了,这就导致遍历map时候空指针了。

我发现就算解决了这个空指针的问题,不会出现开机报错卡在动画,依然解决不了问题,数据还是会丢失,静态IP还是无法保存,客户依然会喷人,这可怎么办,自己写一个保存获取静态IP的逻辑吗?

我仔细分析了一下,这问题不是单纯的保存获取数据的问题了,系统代码这个写文件读文件的操作没什么大毛病,自己写一个逻辑依然是文件读写,这个可能涉及到系统文件读写的问题,可能是软件也可能是硬件问题,需要进一步排查分析原因。。。

相关文章:

Android13以太网静态IP不保存的问题

最近在做Amlogic T982的样机&#xff0c;关于以太网部分&#xff0c;系统Settings只有一个Ethernet的条目&#xff0c;没有其他任何信息&#xff0c;什么以太网mac地址&#xff0c;开关&#xff0c;IP地址&#xff0c;子网掩码&#xff0c;默认网关&#xff0c;dns, 设置代理&a…...

Redis 7.x 系列【31】LUA 脚本

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 EVAL2.2 SCRIPT LOAD2.3 EVALSHA2.4 SCRIPT FLUSH2.5 其他 3. …...

mysql中You can’t specify target table for update in FROM clause错误

mysql中You can’t specify target table for update in FROM clause错误 You cannot update a table and select directly from the same table in a subquery. mysql官网中有这句话&#xff0c;我们不能在一个语句中先在子查询中从某张表查出一些值&#xff0c;再update这张表…...

Linux Vim最全面的教程

Vim 是一个非常强大的文本编辑器&#xff0c;它在 Linux 环境中尤其受欢迎。Vim 支持高度定制&#xff0c;并且拥有丰富的功能&#xff0c;包括多级撤销、宏、脚本语言支持等。下面是关于 Vim 的一个较为全面的教程。 Vim 的启动 要启动 Vim&#xff0c;你可以在终端中输入 v…...

setsockopt选项对tcp速度

GPT-4 (OpenAI) 每个setsockopt调用都涉及到一个套接字描述符&#xff0c;一个指定网络层的常数&#xff08;如IPPROTO_IP, IPPROTO_TCP, IPPROTO_IPV6, SOL_SOCKET等&#xff09;&#xff0c;一个指定需配置的选项的常数&#xff0c;一个指向配置值的指针&#xff0c;以及那个…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号3

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…...

bool数组的理解和应用[C++]

文章目录 bool数组的用法bool数组的定义声明bool数组的初始化访问和修改数组元素遍历数组 运用bool数组简单代码 在今天做题中发现了bool类不仅能用于函数类型还能用于数组类型&#xff0c;好奇查了查发现bool还有很多用处&#xff1a;基本变量&#xff0c;在枚举类型中会用到&…...

JavaScript模拟滑动手势

双击回到顶部 左滑动 右滑动 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Gesture…...

Text Control 控件教程:使用 .NET C# 中的二维码和条形码增强文档

QR 码和条形码非常适合为文档和 PDF 文件增加价值&#xff0c;因为它们提供轻松的信息访问、验证信息、跟踪项目和提高交互性。条形码可以弥补纸质或数字人类可读文档与网络门户或网络应用程序中的数字信息之间的差距。大多数用户都熟悉 QR 码和条形码&#xff0c;它们在许多过…...

最新爆火的开源AI项目 | LivePortrait 本地安装教程

LivePortrait 本地部署教程&#xff0c;强大且开源的可控人像AI视频生成 1&#xff0c;准备工作&#xff0c;本地下载代码并准备环境&#xff0c;运行命令前需安装git 以下操作不要安装在C盘和容量较小的硬盘&#xff0c;可以找个大点的硬盘装哟 2&#xff0c;需要安装FFmp…...

揭秘Django与Neo4j:构建智能知识图谱的终极指南

揭秘Django与Neo4j:构建智能知识图谱的终极指南 前言 图是一种用于对象之间的成对关系进行建模的数学结构。 它由两个主要元素组成:节点和关系。 节点:节点可以看作是传统数据库中的记录。每个节点代表一个对象或实体,例如一个人或一个地方。节点按标签分类,这有助于根…...

项目一缓存商品

文章目录 概要整体架构流程技术细节小结 概要 因为商品是经常被浏览的,所以数据库的访问量就问大大增加,造成负载过大影响性能,所以我们需要把商品缓存到redis当中,因为redis是存在内存中的,所以效率会比MySQL的快. 整体架构流程 技术细节 我们在缓存时需要保持数据的一致性所…...

SEO与数据中心代理IP的结合能带来哪些便利?

本文将探讨将SEO与数据中心代理IP结合所带来的好处&#xff0c;以及如何利用这种组合来提升网站在搜索引擎中的排名和可见性。 1. 数据中心代理IP的作用和优势 数据中心代理IP指的是由数据中心提供的IP地址&#xff0c;用于隐藏真实服务器的位置和身份。与其他类型的代理IP相…...

《昇思25天学习打卡营第6天|ResNet50图像分类》

写在前面 从本次开始&#xff0c;接触一些上层应用。 本次通过经典的模型&#xff0c;开始本次任务。这里开始学习resnet50网络模型&#xff0c;应该也会有resnet18&#xff0c;估计18的模型速度会更快一些。 resnet 通过对论文的结论进行展示&#xff0c;说明了模型的功能&…...

Activiti 6 兼容openGauss数据库bytes类型不匹配

当前有个项目需要做国产调研&#xff0c;需要适配高斯数据库&#xff0c;项目启动的时候&#xff0c;提示column "bytes_" is type bytea but expression is of type blob byte_字段是act_ge_bytearray表的&#xff0c;openGauss里的类型是bytea&#xff0c;类型是匹…...

缓存技术:提升性能与效率的利器

在当今数字化时代&#xff0c;软件应用的性能与响应速度成为了衡量其成功与否的重要标准之一。随着数据量的爆炸性增长和用户需求的日益多样化&#xff0c;如何高效地处理这些数据并快速响应用户请求成为了软件开发中亟待解决的问题。缓存技术&#xff0c;作为提升系统性能、优…...

LeetCode 637, 67, 399

文章目录 637. 二叉树的层平均值题目链接标签思路代码 67. 二进制求和题目链接标签思路代码 399. 除法求值题目链接标签思路导入value 属性find() 方法union() 方法query() 方法 代码 637. 二叉树的层平均值 题目链接 637. 二叉树的层平均值 标签 树 深度优先搜索 广度优先…...

如何压缩视频大小不改变画质?这5个视频压缩免费软件超好用!

如何压缩视频大小不改变画质&#xff1f;随着生活的水平逐步提高&#xff0c;视频流媒体服务越来越受欢迎。提供简短而引人注目的视频来展示您的产品或服务已成为一种出色的营销手段。然而&#xff0c;当您要准备导出最终视频时&#xff0c;可能会面临一个常见问题&#xff1a;…...

深入理解 Java 虚拟机第三版(周志明)

这次社招选的这本作为 JVM 资料查阅&#xff0c;记录一些重点 1. 虚拟机历史 Sun Classic VM &#xff1a;已退休 HotSpot VM&#xff1a;主流虚拟机&#xff0c;热点代码探测技术 Mobile / Embedded VM &#xff1a;移动端、嵌入式使用的虚拟机 2.2 运行时数据区域 程序计…...

算法 定长按组翻转链表

一、题目 已知一个链表的头部head&#xff0c;每k个结点为一组&#xff0c;按组翻转。要求返回翻转后的头部 k是一个正整数&#xff0c;它的值小于等于链表长度。如果节点总数不是k的整数倍&#xff0c;则剩余的结点保留原来的顺序。示例如下&#xff1a; &#xff08;要求不…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...