Android系统卡启动问题排查
Android系统启动正常来说会涉及到如下几个过程:
- 引导加载程序(Bootloader)
- Linux内核(Kernel),负责硬件抽象、内存管理、进程管理、网络堆栈等
- init进程
init进程读取init.rc配置文件,用于启动各种守护进程和服务,它是Android系统的第一个用户级进程 - Zygote进程,Zygote是一个特殊的Java虚拟机进程,它预加载核心类库,并在需要时通过进程fork机制快速启动应用程序
- System Server,由Zygote启动的System Server进程是Android系统的核心服务进程,它启动并管理各类系统服务,如Activity Manager、Package Manager、Window Manager等。
实践中,如果把android进行了容器化处理。容器化处理之后,1、2两个步骤其实在宿主机上执行了,系统启动直接从第三步开始。
最近我处理了几个系统卡启动的问题,这里做一点归纳总结:
netpolicy
netpolicy 的策略配置在 /data/system/netpolicy.xml 。
restrictBackground=“true”
当restrictBackground设置为false时,系统允许后台应用自由使用网络。这是默认行为,适用于不需要特别限制网络使用的情况。
当restrictBackground设置为true时,系统会限制后台应用的网络使用。这意味着在后台运行的应用程序可能无法使用网络,除非它们被列入允许的例外名单。一些应用可能在后台无法正常接收数据或推送通知。
我遇到的问题是restrictBackground设置为true时,系统会先调用 com.android.server.connectivity.Tethering.untetherAll,修改UsbTethering的状态。而 UsbDeviceManager 这个对象其实没有初始化。这个行为是在system server进程中执行的。所以造成了system server进程崩溃。
*** FATAL EXCEPTION IN SYSTEM PROCESS: NetworkPolicyFATAL EXCEPTION IN SYSTEM PROCESS: NetworkPolicy
java.lang.IllegalStateExceptionat com.android.internal.util.Preconditions.checkState(Preconditions.java:169)at com.android.internal.util.Preconditions.checkState(Preconditions.java:182)at com.android.server.usb.UsbService.setCurrentFunctions(UsbService.java:465)at android.hardware.usb.UsbManager.setCurrentFunctions(UsbManager.java:703)at com.android.server.connectivity.Tethering.setUsbTethering(Tethering.java:968)at com.android.server.connectivity.Tethering.enableTetheringInternal(Tethering.java:406)at com.android.server.connectivity.Tethering.stopTethering(Tethering.java:390)at com.android.server.connectivity.Tethering.untetherAll(Tethering.java:520)at com.android.server.ConnectivityService$5.onRestrictBackgroundChanged(ConnectivityService.java:1850)at com.android.server.net.NetworkPolicyManagerService.dispatchRestrictBackgroundChanged(NetworkPolicyManagerService.java:4422)
system server进程崩溃之后,它关联的一些system进程也会相继被杀。然后就卡启动了。
这个崩溃点其实挺有意思的,在这个情况下:
- netpolicy的命令有时候可以使用,有时候不能使用。
adb shell dumpsys netpolicy
adb shell cmd netpolicy set restrict-background true
adb shell cmd netpolicy set restrict-background false
- netd是起来了,还没初始化完,又被杀掉了。
所以这种场景下,ping的时候会报错找不到域名(dns服务没就绪),直接ping ip会报错网络不可达。
- iptable设置了是无效的(短暂有效)
netd在启动的时候会通过 iptables-restore、ip6tables-restore ,设置一些策略,如果在这个场景下手动设置一些iptable的规则,会被iptables-restore中的默认设备覆盖掉。
iptables -L
iptables -D bw_data_saver 1
iptables -I bw_data_saver 1 -j RETURN
PackageManagerService
PackageManagerService在多用户环境中需要管理每个用户的应用配置,而/data/system/users/0.xml文件是用来存储主用户(用户ID为0)的配置数据。因此,PackageManagerService在运行时可能会读取或修改这个文件,以获取或更新用户的应用配置和相关信息。
System zygote died with exception
java.lang.RuntimeException: There must be exactly one installer; found []at com.android.server.pm.PackageManagerService.getRequiredInstallerLPr(PackageManagerService.java:3456)at com.android.server.pm.PackageManagerService.<init>(PackageManagerService.java:3041)at com.android.server.pm.PackageManagerService.main(PackageManagerService.java:2317)at com.android.server.SystemServer.startBootstrapServices(SystemServer.java:591)at com.android.server.SystemServer.run(SystemServer.java:391)at com.android.server.SystemServer.main(SystemServer.java:269)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:464)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:787)
上面这个错误,发射在 /data/system/users/0.xml 中,0.xml文件被破坏了,获取不到主用户的配置信息,会导致PackageManagerService启动失败。
这个操作也是在 SystemServer 中的,通用会导致 SystemServer 在进入“崩溃->重启”的循环中。
总结
总的来说,上面两个例子的权限都应该是600,即只有文件的所有者(system)有读写权限。但是我们开放了su的权限,用户/用户使用的软件其实是有权限可以修改这个文件的。后续可以增加SELinux的策略,来规避这些文件被修改导致的系统故障。
相关文章:
Android系统卡启动问题排查
Android系统启动正常来说会涉及到如下几个过程: 引导加载程序(Bootloader)Linux内核(Kernel),负责硬件抽象、内存管理、进程管理、网络堆栈等init进程 init进程读取init.rc配置文件,用于启动各…...
STP(生成树协议)
STP的基本概念 概述 STP是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。STP在网络中运行后会持续监控网络的状态,当网络出现拓扑变更时,STP能够感知并且进行自动…...
【前端面试】随机、结构赋值、博弈题
解构赋值(Destructuring Assignment)是 JavaScript ES6 引入的一项非常有用的特性,它允许我们快速地从数组或对象中提取值,并将它们赋给变量。这种方式使得代码更加简洁、易读,并且能够减少重复的访问和赋值操作。 1.…...
Volta——开箱即用的Node.js 版本管理工具
Volta volta 是一个较新的 Node.js 版本管理器,旨在简化 Node.js 和其他工具的安装和管理,在 2019 年出世,仍在积极开发中。Volta 采用了与 nvm 不同的方法:它不是管理 Node.js 的多个版本,而是管理项目及其依赖项。当…...
ubuntu 磁盘空间满,找不到占用文件的目录
解决方法: 检查磁盘空间: 执行 df -h 查看各分区磁盘使用情况。 查找大文件或目录: 执行 du -sh /* 2>/dev/null 查找根目录下的大文件或目录,再逐一进入子目录使用相同命令查找。 清理缓存和临时文件: 清理 /t…...
1. 机器学习基本知识(5)——练习题(参考答案)
20.🔗本章代码笔记📓链接(需要🪜):(01_the_machine_learning_landscape.ipynb - Colab (google.com)) 如果你不想通过上面的官方网址下载本章的笔记,还可以在本篇博文的…...
spark-sql 备忘录
wordcount sc.textFile("../data/data.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(__).collect 读取json 文件 并通过sql 执行 join 查询 public static void main(String[] args) {SparkSession session SparkSession.builder().master(&qu…...
基于softmax回归的多分类
基于softmax回归的多分类任务是机器学习领域中的一种常见应用。softmax回归,又称多项逻辑回归或多类逻辑回归,是逻辑回归在多分类问题上的推广。以下是对基于softmax回归的多分类任务的详细解释: 一、softmax回归的原理 softmax回归的核心思想是通过softmax函数将输入数据…...
bs4基本运用
1. bs4基本使用 1.1. 简介 bs4的全称为 BeautifulSoup。和lxml一样,是一个html的解析器,主要功能也是解析数据和提取数据 。 本模块作为了解模块,实际开发中很少用这个模块去解析数据,大家可能会想为什么这个模块会逐渐被淘汰&…...
MySQL 时区参数 time_zone 详解
文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用?修改它有什么影响?如何设置该参数,本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT CUR…...
Redis - 消息队列 Stream
一、概述 消息队列 定义 消息队列模型:一种分布式系统中的消息传递方案,由消息队列、生产者和消费者组成消息队列:负责存储和管理消息的中间件,也称为消息代理(Message Broker)生产者:负责 产…...
Docker:国内加速源
阿里云docker加速云: sudo tee /etc/docker/daemon.json <<EOF { “registry-mirrors”: [“https://euf11uji.mirror.aliyuncs.com”] } EOFhttps://docker.mozhu.dev/ sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": [&qu…...
Android Studio更改项目使用的JDK
一、吐槽 过去,在安卓项目中配置JDK和Gradle的过程非常直观,只需要进入Android Studio的File菜单中的Project Structure即可进行设置,十分方便。 原本可以在这修改JDK: 但大家都知道,Android Studio的狗屎性能,再加…...
ubuntu+ros新手笔记(四):gazebo无法加载
以下为ChatGPT 的解决方案,对我来说是可行的!! 我按照第2步操作就解决辣!! 我的提问: 在ubuntu 22.04 和ros2 humble环境下,gazebo加载不了 ChatGPT 回答: 在 Ubuntu 22.04 和 …...
vue季度选择器(antd2.0 版本无此控件,单独写一个)
vue季度选择器 效果显示 效果显示 <template><div><a-popoverplacement"bottom"overlayClassName"season-picker"trigger"click"v-model"showSeason"><template #content><div class"season-picker-b…...
C/C++代码性能优化技巧的书籍及资料
使用C/C开发的场景,大多对代码的执行的速度,实时性有较高的要求,像嵌入式系统的开发,资源还受限。在算力存储空间有限的MCU上写出简洁又高效的代码实际是一种艺术。软件工程师在代码设计上的这种差距,会反映在产品的性…...
通俗易懂的 Nginx 反向代理 配置
通俗易懂的 Nginx 反向代理 配置 首先 root 与 alias 的区别 root 是直接拼接 root location location /i/ {root /data/w3; }当请求 /i/top.gif ,/data/w3/i/top.gif 会被返回。 alias 是用 alias 替换 location location /i/ {alias /data/w3/images/; }当请…...
docker设置容器自动启动
说起开机自动启动应该很多人都遇到过,我们公司做的系统很多的中间件都没有设置开机自动启动然后中间修改问题又设置了一些临时生效的文件,开始的时候大家都不以为意,知道公司陆续有人离职入职管理交接一塌糊涂,项目成了历史遗留问…...
蓝桥杯刷题——day1
蓝桥杯刷题——day1 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。本题中,将空字符串定义为有效的 回文串 。 题目链接&a…...
Leetcode 面试150题 399.除法求值
系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图:给定图中的一些点(点即变量),以及某些边的权值(权值即两个变量的比值),试…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
