文章目录

  • 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方法做进程拉起后的业务逻辑。

谈谈Persistent属性相关推荐

  1. 说说Android应用的persistent属性

    2019独角兽企业重金招聘Python工程师标准>>> 说说Android应用的persistent属性 侯 亮 1 启动persistent应用 在Android系统中,有一种永久 ...

  2. android:persistent属性

    为什么写这篇文章呢?前段时间在研究telephony时,一直没有在framework下发现对telephony的初始化(PhoneFactory.java中的makeDefaultPhones函数)的 ...

  3. 谈谈- declare-styleable属性

    在Android开发中,往往要用到自定义的控件来实现我们的需求或效果.在使用自定义  控件时,难免要用到自定义属性,那怎么使用自定义属性呢? 一.简单使用: 1.在文件res/values/下新建at ...

  4. vue源码-对于「计算属性」的理解

    vue源码-对于「计算属性」的理解 这是我最近学习vue源码的一个个人总结和理解,所以可能并不适合每一位读者 本文的整体脉络如下,首先尽可能去掉细节,对计算属性源码的大致实现有一个了解,然后举一例子, ...

  5. 【原创】RabbitMQ之Queue属性测试

    2019独角兽企业重金招聘Python工程师标准>>> 常用queue属性 在 rabbitmq-c代码中可以看到如下代码 上图所示为queue声明时使用的结构体.其中最容易让使用者 ...

  6. Android 系统(88)---Android关键字persistent

    Android关键字persistent 在Android程序开发时我们会接触到一些系统为了某些功能而定义的关键属性,例如在AndroidManifest.xml文件中 经常看到的persistent ...

  7. CSS中的Position、Float属性的一些深入探讨

    为什么80%的码农都做不了架构师?>>>    HTML布局的基本要点: 如果要掌握.运用好Position.Float属性必须要对HTML的两个基本点有清晰的了解. 盒子模型(bo ...

  8. 如何从访客属性分析网站用户群

    阿里巴巴.今日头条的崛起标志着互联网时代已经进入了用户导向的时代,包括淘宝天猫的"千人千面",今日头条的资讯推荐机制,这都帮助了他们的企业在市场中取得大规模的占有. 所以,面对现在 ...

  9. 细谈position属性:static、fixed、relative与absolute

    更新时间:2019-07-24 09:21:38 学习WEB有些时日了,对DOM中的定位概念有些模糊,特地花了一个下午的时间搜资料.整理写下这篇随笔. 首先,我们要清楚一个概念:文档流. 简单的讲,就 ...

最新文章

  1. Android在OnCreate中获取控件的宽度和高度
  2. Android之解决TabLayout里面每个Tab项的间距和修改指示线的长度(非反射)和修改选中字体大小
  3. vba 修改文本文档 指定行_VBA程序报错,用调试三法宝,bug不存在的
  4. Internet Explorer 6 中的 CSS 增强功能
  5. HTML5的知识分享(一):HTML5的基础标签
  6. 费诺编码的gui页面设计_关于页面可视化搭建的一些思考(一)
  7. GitHub 微信公众号爬虫推荐
  8. 简历模板80套.zip
  9. 2009年以来我买过的书(部分)
  10. (二十一)查询我的订单
  11. 茶饮连锁门店数字化转型
  12. FigDraw 20. SCI文章中绘图之马赛克图 (mosaic)
  13. 微波技术大作业课设-分立电容电感+微带单枝短截线+微带双枝短截线
  14. nosql包括的数据库
  15. 一个对小学生的随机生成的四则运算试题
  16. java自定义权限注解
  17. 安装Selenium2Library步骤以及加载Selenium2Library时为红色
  18. Snappy 1.1.7 源码编译以及验证
  19. 初识数据结构:链表实现图书信息管理系统(C语言,仅供参考)
  20. 专业分享:“以数治税”金税四期背景下,企业税务风控与管理的思考

热门文章

  1. python+opencv人脸识别-图片处理+代码
  2. 2021年全国职业院校技能大赛(中职组)网络安全竞赛试题(9)思路
  3. 利用Simulink、STM32CUBEMX、STM32-MAT/TARGET自动生成简单的led灯闪烁代码(保姆级教程)
  4. NOIP2018出征策
  5. js 中有关字符串的操作
  6. 顺序表的实现和顺序表相关OJ题
  7. 佳能推全新手机照片打印机-“瞬彩”
  8. Android版本更新 ~ 版本号判断
  9. 高级平面设计师必备|怀旧风格的木材墨水肌理素材(纹理、笔刷)
  10. ajax伪造请求头设置失败,以及浏览器插件解决方案(待完善)