加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

Android 框架问题分析案例 - 谁杀了桌面?

发布时间:2019-09-18 16:26:03 所属栏目:业界 来源:高爷
导读:写这篇文章的契机是由于一个实境碰着的题目 , 这个题目着实不难 , 不外在说明白这个题目然后写日志的时辰 , 我溘然认为这个题目说明的进程有须要记录一下 , 分享给各人。说明进程中有效到一些器材 , 一些要领 , 也从其它一个智慧的小搭档梅明哪里学到了一

当地安装这个应用举办调试, 发明登录后,再次启动, 桌面必会被杀 ,确定就是这个 App 的题目。

Android 框架题目说明案例 - 谁杀了桌面?

到了这一步我们已经根基上确定题目就是这个 App 引起的了 , 不外假如我们想看较量具体的挪用环境 , 可以行使 Android Studio Profile。

行使 Android Studio Profiler 器材

打开 Android Studio , 点击 Profiler 按钮 , 点击 + 号 , 选择 com.jx.cmcc.ict.ibelieve 这个历程 , 然后点击 CPU 这一栏。

Android 框架题目说明案例 - 谁杀了桌面?

这里选择了 Trace Java Methods , 然后点击旁边的 Record , 就可以开始举办操纵 , 操纵竣事后 , 点击 Stop , AS 会自动开始理会。

Android 框架题目说明案例 - 谁杀了桌面?

理会功效我们可以看这里:

Android 框架题目说明案例 - 谁杀了桌面?

最下面就是方才操纵所对应的具体函数挪用栈 , 以真正运行的次序展示在我们眼前(我常常会用这个器材来查察源码逻辑和三方应用的代码逻辑 , 不管是进修照旧办理题目 , 都是一个很是好的要领)。

我们行使 ctrl+f 举办搜刮 killBackgroundProcesses , 假若有的话 , 会以高亮表现, 我们只必要用鼠标放大就可以看到具体的挪用栈。

Android 框架题目说明案例 - 谁杀了桌面?

可以看到这个 App 在 loadComplete 回调内里执行了 killBackground 要领.(到了这里,应用开拓者就已经知道是那边的题目了,修复起来飞快)。

权限题目说明

如上面所示 , 挪用 killBackgroundProcesses 是必要Manifest.permission.KILL_BACKGROUND_PROCESSES 这个权限的。

  1. @RequiresPermission(Manifest.permission.KILL_BACKGROUND_PROCESSES) 
  2. public void killBackgroundProcesses(String packageName) { 

执行 adb shell dumpsys package com.jx.cmcc.ict.ibelieve 查察 com.jx.cmcc.ict.ibelieve 这个历程所申请的权限 , 发明这个应用在安装的时辰就申请了KILL_BACKGROUND_PROCESSES 这个权限 , 且默认是授予的。

  1. install permissions: 
  2.   ...... 
  3.   android.permission.ACCESS_NETWORK_STATE: granted=true 
  4.   android.permission.KILL_BACKGROUND_PROCESSES: granted=true 
  5.   android.permission.WRITE_USER_DICTIONARY: granted=true 
  6.   ...... 

对应的权限级别为 normal。

Android 框架题目说明案例 - 谁杀了桌面?

也就是说 , 全部的第三方应用都可以默认有这个权限 , 只要你申请 . 这个案例内里 , 就是由于这个 App 申请了这个权限 , 且执行了错误的举动 , 导致把桌面杀掉 , 严峻影响用户体验. Sad !

Systrace 器材可以找出来 Kill 桌面的首恶么?

因为常常行使 Systrace , 那么 Systrace 是否可以找到首恶呢? 谜底是可以 (这里假如对如安在 Systrace 上查察叫醒信息不相识 , 可以看一下这篇文章 说明 Systrace 准备常识 ). 我们录制一段 Systrace , 安装下面的次序去看

1.起首看 system_server 历程对应的 trace ,找到 killProcessGroup 对应的点 , 查察其叫醒环境 , 可以看到是 19688 这个线程叫醒执行 AMS 的 killProcessGroup。

Android 框架题目说明案例 - 谁杀了桌面?

在 Systrace 中搜刮 19688 , 可以看到是 Binder:1295_1E , 1295 就是 SystemServer。

Android 框架题目说明案例 - 谁杀了桌面?

查察对应的 Binder:1295_1E , 看看是哪个线程叫醒这个线程。

Android 框架题目说明案例 - 谁杀了桌面?

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读