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.除法求值
系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图:给定图中的一些点(点即变量),以及某些边的权值(权值即两个变量的比值),试…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
