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.除法求值
系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图:给定图中的一些点(点即变量),以及某些边的权值(权值即两个变量的比值),试…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...