谈谈Persistent属性

article/2025/10/9 18:33:23

文章目录

    • 1. 背景
    • 2. 开机自启动流程
    • 3. adb kill -9 杀进程后会自动重启
    • 4. 小结

1. 背景

在应用AndroidManifest文件下添加 android:persistent=“true” 关键字,并把Apk预置到system/app目录下,可以给应用实现开机自启动和保活效果。

从以下两个疑问去找答案:

  1. 开机自启动 how?
  2. adb kill -9 杀进程后会自动重启 how?

2. 开机自启动流程

开机后通过adb shell ps -A | grep 包名查看进程号,确实起了进程。

➜  Desktop psa | grep demo
u0_a61        3329  3329  1753 3600572  83104 ep_poll    7b2c9a4ff34a S e.ecloudapidemo

查看进程的oom_adj值是-800,优先级非常高,可以看出带persistent的进程很难被系统杀死。

xxx64:/ # cat proc/3329/oom_score_adj                                                                                                                                    
-800
xxx64:/ # 

在ActivityManagerService.java的startProcessLocked方法打调用栈如下:

    private boolean startProcessLocked(String hostingType, String hostingNameStr, String entryPoint,ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,String seInfo, String requiredAbi, String instructionSet, String invokeWith,long startTime) {app.pendingStart = true;app.killedByAm = false;app.removed = false;app.killed = false;final long startSeq = app.startSeq = ++mProcStartSeqCounter;app.setStartParams(uid, hostingType, hostingNameStr, seInfo, startTime);if (mConstants.FLAG_PROCESS_START_ASYNC) {if (DEBUG_PROCESSES) Slog.i(TAG_PROCESSES,"Posting procStart msg for " + app.toShortString());//Add by QXLif(null != app && app.processName != null && app.processName.equals("com.example.ecloudapidemo")) {android.util.Log.d("qxl","ams startProcessLocked stack:"+ android.util.Log.getStackTraceString(new Throwable()));}

重启设备抓开机Log,结果如下:
02-07 01:09:41.247 1941 1956 D qxl : ams startProcessLocked stack:java.lang.Throwable
02-07 01:09:41.247 1941 1956 D qxl : at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:4486)
02-07 01:09:41.247 1941 1956 D qxl : at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:4451)
02-07 01:09:41.247 1941 1956 D qxl : at com.android.server.am.ActivityManagerService.addAppLocked(ActivityManagerService.java:13289)
02-07 01:09:41.247 1941 1956 D qxl : at com.android.server.am.ActivityManagerService.addAppLocked(ActivityManagerService.java:13253)
02-07 01:09:41.247 1941 1956 D qxl : at com.android.server.am.ActivityManagerService.startPersistentApps(ActivityManagerService.java:13011)
02-07 01:09:41.247 1941 1956 D qxl : at com.android.server.am.UserController$Injector.startPersistentApps(UserController.java:2195)
02-07 01:09:41.247 1941 1956 D qxl : at com.android.server.am.UserController.finishUserUnlocked(UserController.java:449)
02-07 01:09:41.247 1941 1956 D qxl : at com.android.server.am.UserController.handleMessage(UserController.java:1999)
02-07 01:09:41.247 1941 1956 D qxl : at android.os.Handler.dispatchMessage(Handler.java:102)
02-07 01:09:41.247 1941 1956 D qxl : at android.os.Looper.loop(Looper.java:193)
02-07 01:09:41.247 1941 1956 D qxl : at android.os.HandlerThread.run(HandlerThread.java:65)
02-07 01:09:41.247 1941 1956 D qxl : at com.android.server.ServiceThread.run(ServiceThread.java:44)

开机自启动的流程就比较清楚了。

3. adb kill -9 杀进程后会自动重启

虽然persistent特性的应用进程oom_adj是-800很难被系统杀掉,但不排除其他因素导致应用进程被杀,比如我们通过命令adb shell kill -9 xxx即可杀掉某个进程。

作用于上面的persistent应用试试:

adb shell kill -9 3329

此时打印调用栈信息如下:
02-07 01:10:37.374 1941 2066 D qxl : ams startProcessLocked stack:java.lang.Throwable
02-07 01:10:37.374 1941 2066 D qxl : at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:4486)
02-07 01:10:37.374 1941 2066 D qxl : at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:4451)
02-07 01:10:37.374 1941 2066 D qxl : at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:4266)
02-07 01:10:37.374 1941 2066 D qxl : at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:4260)
02-07 01:10:37.374 1941 2066 D qxl : at com.android.server.am.ActivityManagerService.cleanUpApplicationRecordLocked(ActivityManagerService.java:20377)
02-07 01:10:37.374 1941 2066 D qxl : at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:5968)
02-07 01:10:37.374 1941 2066 D qxl : at com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java:6162)
02-07 01:10:37.374 1941 2066 D qxl : at com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java:1897)
02-07 01:10:37.374 1941 2066 D qxl : at android.os.BinderProxy.sendDeathNotice(Binder.java:1193)

由此可以看到persistent进程被杀后,触发了进程启动时和AMS之间的binder墓碑机制走到cleanUpApplicationRecordLocked方法,针对persistent应用AMS会重新拉起新的进程。

应用进程启动后如何和AMS绑上这样的关系?可以参考其他人画的流程图:
在这里插入图片描述

4. 小结

大概搞清楚persistent的实现后,我们可以基于这个机制做保活和自启名单的定制需求了。Application这边可以利用重写Application的onCreate方法做进程拉起后的业务逻辑。


http://chatgpt.dhexx.cn/article/EUxODBmY.shtml

相关文章

cache和persist区别

cache()是persist()的特例,persist可以指定一个StorageLevel(缓存级别) cache的缓存级别是memory_only 区别就是cache默认是在内存中存储的,而persist可以设置存储的级别: 如何选择一种最合适的持久化策略 默认情况下,性能最高…

安卓机型传感器分区故障persist的相关说明 修复步骤

手机的分区很多。有些分区刷机不管是卡刷还是底层9008刷写等等默认是不会刷写的。其中包括基带分区 persist分区等等这些。这类分区一般也不会出问题,当然也有个例。例如更新降级或者刷写第三方或者全部檫除分区或者格机软件等等会导致这些分区出问题。今天这个帖子…

Android Q - Signature|privileged permissions not in privapp-permissions whitelist(卡在开机logo无法开机)

简单记录下,我是在 launcher3 里进行修改,添加了几个权限后,替换应用正常运行,但是在重新编译软件时无法开机,Android studio 提示错误如下: system_process E/AndroidRuntime: *** FATAL EXCEPTION IN SYS…

Failed to get D-Bus connection: Operation not permitted一个关于--privileged=true失效并不能进入root权限的大坑

一个关于--privilegedtrue失效并不能进入root权限的大坑,坑了我一晚上。。。 先上连接解决这个问题 感谢这位大佬可以用 https://blog.csdn.net/zhenliang8/article/details/78330658 我的问题出在哪儿了? 这里并不是/bin/bash 而是/usr/sbin/init 不按…

【错误记录】手机应用无法联网 ( 添加 READ_PRIVILEGED_PHONE_STATE 权限导致手机应用网络不可用 )

文章目录 一、报错信息二、解决方案 一、报错信息 在应用的首界面 , 连接 WebSocket 服务器 , 调用了 WebSocketClient # connectBlocking() 方法 , 阻塞连接 WebSocket , 但是网络没有相应 , 导致了 ANR 异常 ; 参考 【Android WebSocket】Android 端 WebSocket 基本用法 ( 添…

k8s设置pod privileged权限(特权):securityContext.privileged=true

k8s部署es的时候需要初始化很多linux的内核参数。 但是文件系统挂载到pod容器中就会变成read-only,难以进行操作实现需求。 所以需要给POD privileged权限,然后在容器的初始化脚本或代码中去修改sysctl参数。 创建POD/deployment/daemonset等对象时&…

ARM基础(2):模式和特权等级(User/Thread mode和Privileged level)

Cortex-M3处理器支持两种模式和两种特权级别。 如下图所示,当处理器运行于Thread mode时,它可以处于Privileged或User级别;而Handler mode下,只能处于Privileged级别。当处理器复位完毕后,处于Thread mode。 在User级…

【云原生 | Kubernetes 系列】K8s 实战 实施Pod 容器标准的两种方式

实施Pod 容器标准的两种方式 前言一、通过名字空间标签来要求实施 baseline Pod 容器标准1.1、使用 kubectl label 为现有名字空间添加标签1.2、应用到所有名字空间1.3、应用到单个名字空间 二、通过配置内置准入控制器实施 Pod 安全标准总结 前言 上一节学习了 PodSecurity &a…

privilege_role

本文章为网络笔记,看了warehouse老师的视频受益匪浅,更是感觉自己技术太过初级,特写了本笔记,方便以后反复学习! 如有任何不妥,请发邮件至102448567qq.com删除文章! 关于warehouse: …

docker --privileged=true 参数作用

大约在0.6版,privileged被引入docker。使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚…

docker--privileged

一、 privilegedtrue|false 介绍 true container内的root拥有真正的root权限。 false container内的root只是外部的一个普通用户权限。默认false privileged启动的容器 可以看到很多host上的设备可以执行mount。可以在docker容器中启动docker容器。 二、测试验证 2.1、未设…

(十二)docker --privileged

1. privileged参数作用 --privileged Give extended privileges to this container 大约在0.6版,privileged被引入docker。使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用…

TDL、CDL信道模型简述

主要参考:3GPP TR 38.811 TDL(Tapped Delay Line)抽头延时线模型 TDL模型主要针对多径时延参数和反映信道时变特性的多普勒参数进行研究,主要有TDL-A、TDL-B、TDL-B、TDL-D、TDL-E五种。其中前三者为NLOS传输的多径信道模拟&…

无线信道模型分类和建模方法介绍--附思维导图

目录 1 统计性模型(经验模型)1.1 模型分类(1)按衰落分类(2)按路径损耗和延迟拓展分类(3)按IO数量分类 1.2 建模方法(1)方法一分类(2)方…

【S-V信道】基于毫米波的5G通信S-V信道模型仿真

1.软件版本 MATLAB2021a 2.本算法理论知识 由于大气中存在一定含量的极化氧分子和水汽(如图3.1所示),因此毫米波在传输过程中容易被大气吸收,从而导致信号衰减,影响通信质量[13,14]。根据相关研究发现,在…

m无线通信信道matlab仿真,包括自由空间损耗模型,Okumura-Hata模型,COST231 Hata模型,SUI信道模型

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 无线信道是移动通信的传输媒体,所有的信息都在这个信道中传输。信道性能的好坏直接决定着人们通信的质量,因此要想在有限的频谱资源上尽可能地高质量、大容量传输…

3GPP LTE/NR信道模型

LTE三种典型信道模型: EPA(Extended Pedestrian A):扩展步行信道模型 EVA(Extended Vehicular A):扩展车辆信道模型 ETU(Extended Typical Urban):扩展典型城市信道模型 EPA EVA ETU Excess tap delay [ns] Relative power…

无线通信与编码_MATLAB仿真实现Jakes信道模型_含仿真代码_瑞利衰落信道模型

1、Jakes模型简介 1.1 Rayleigh衰落信道 瑞利分布:当一个随机二维向量的两个分量呈独立的、均值为0、有着相同的方差的正态分布时,这个向量的模呈瑞利分布。 瑞利分布的概率密度函数如下: 瑞利衰落信道是一种无线电信号传播环境的统计模型…

MATLAB平台学习(9)信道模型

目录 应用场景 市内微小区(Urban-micro) 市区宏小区(Urban-macro) 郊区宏小区(Rural-macro) 室内热点(indoor-hotspot) EPA、EVA、ETU、HST 各种场景下的路径损耗 信道的建模…

S-V信道模型理解

Saleh和Valenzuela提出的S-V信道模型是基于大量室内信道测试构建的,更加符合室内真实路径的传播规律,可以用来进行信道建模与仿真。下图显示了具有多簇射线的S-V信道模型,该模型中多径以簇形式达到,其通过两个完全对立的泊松过程&…