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

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

发布时间:2019-09-18 12:23:44 所属栏目:业界 来源:高爷
导读:写这篇文章的契机是因为一个实际遇到的问题 , 这个问题其实不难 , 不过在分析了这个问题然后写日记的时候 , 我突然觉得这个问题分析的过程有必要记录一下 , 分享给大家。分析过程中有用到一些工具 , 一些方法 , 也从另外一个聪明的小伙伴梅明那里学到了一

ActivityManagerService.killBackgroundProcesses

  1. public void killBackgroundProcesses(final String packageName, int userId) { 
  2. ...... 
  3.             synchronized (this) { 
  4.                 killPackageProcessesLocked(packageName, appId, targetUserId, 
  5.                         ProcessList.SERVICE_ADJ, false, true, true, false, "kill background"); 
  6.             } 

对源码比较熟悉的同学可以很快知道 , AMS.killBackgroundProcesses 这个接口会提供给三方应用去调用 , 其 Binder 的客户端在 ActivityManager.killBackgroundProcesses 这里

ActivityManager.killBackgroundProcesses

  1. /** 
  2.  * Have the system immediately kill all background processes associated 
  3.  * with the given package.  This is the same as the kernel killing those 
  4.  * processes to reclaim memory; the system will take care of restarting 
  5.  * these processes in the future as needed. 
  6.  * 
  7.  * @param packageName The name of the package whose processes are to 
  8.  * be killed. 
  9.  */ 
  10. @RequiresPermission(Manifest.permission.KILL_BACKGROUND_PROCESSES) 
  11. public void killBackgroundProcesses(String packageName) { 
  12.     try { 
  13.         getService().killBackgroundProcesses(packageName, 
  14.                 mContext.getUserId()); 
  15.     } catch (RemoteException e) { 
  16.         throw e.rethrowFromSystemServer(); 
  17.     } 
对 SystemServer 进程进行断点 Debug

知道了上面的代码逻辑 , 我们需要做的就是找到在这个场景下 , 是哪个应用调用 ActivityManager.killBackgroundProcesses 杀掉了桌面. 由于不知道具体是哪个应用(这里虽然我们怀疑是 com.jx.cmcc.ict.ibelieve , 但是没有证据) , 我们先对 SystemServer 进程进行 Debug .

1.首先对源码进行 debug , 首先在 Android 中点击 debug 按钮 , 选择 system_process 这个进程(就是我们所说的 SystemServer) , 然后点击 OK . 代码的断点我们打在上面列出的 ActivityManagerService.killBackgroundProcesses 方法里面。

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

2.点击启动怀疑的 App ( 可以从 EventLog 和视频里面倒推,找到比较可疑的 App , 安装后进行本地测试复现 , 这里选择了视频中出现的几个应用,包括我们之前怀疑的 com.jx.cmcc.ict.ibelieve- 和我信 ) , 点击其他的应用都不会进入到这个断点, 而在点击 和我信 这个 App 启动后走到的断点。

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

3.这里我们可以看到调用栈是一个 Binder 调用 , 我们需要找到这个 Binder 调用的客户端. 在 AS 里面继续操作 , 点击如下图的计算器按钮 , 输入 getRealCallingPid() 点击下面的 Evaluate , 就可以看到结果. result = 29771

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

4.通过 PS 命令 , 查看这个 pid 对应的 app。

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

可以看到就是这个应用调用的 killBackgroundProcesses。

对 App 进程进行断点 Debug

(编辑:核心网)

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

热点阅读