您的位置:首页 > 其它

今日头条,清理分析

2017-03-06 12:18 330 查看
操作步骤:

1.开启管家锁屏自动清理

2.打开手机一些APP

实际结果:锁屏几分钟后有部分应用未清理(例如今日头条APP,这两个必现)

期待结果:锁屏几分钟后应正常清理后台应用

复现率:必现
今日头条:6.0.2

apk不被清理,一般情况下,有两种情况:

1、APK 在保护名单中

2、APK 在灭屏时处于前台

查看log:

开始清理后台进程。
02-09 16:59:26.106117  2242  3476 D PCtrlBgApp: pkg to kill=[com.sina.news, com.taobao.taobao, com.letv.android.filemanager, com.sina.weibo, com.tencent.qqlive,com.tencent.mm, com.letv.android.client], top=[com.ss.android.article.news],
except=null

从上面的log,可以看到,今日头条(com.ss.android.article.news),是前台进程 所以没有被kill

但是联系测试,测试表示,灭屏前没有打开今日头条到前台。

??????

不可能啊,仔细看一边log:

用户点击home键, 回到桌面
02-09 16:57:52.497437  1202  1355 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 mCallingUid=1000 cmp=com.android.launcher3/.Launcher (has extras)} from uid
1000 from pid 1202 on display 0

手机开始灭屏
02-09 16:57:53.653042  1202  1356 I PowerManagerService: Sleeping (uid 1000)...
02-09 16:57:53.653079  1202  1356 D PowerManagerNotifier: onWakefulnessChangeStarted: wakefulness=0, reason=2, interactive=false
02-09 16:57:53.653233  1202  1202 I ActivityManager: onWakefulnessChanged: 0

灭屏前,的确没有将 今日头条切换到前台。

灭屏后 13010 进程将 今日头条的 SswoActivity 页面 切换到前台
02-09 16:57:55.907782  1202  2319 I ActivityManager: START u0 {flg=0x10000000 mCallingUid=10160 cmp=com.ss.android.article.news/com.ss.android.message.sswo.SswoActivity} from uid 10160 from pid 13010 on display 0

kill时今日头条处于前台进程。
02-09 16:59:26.106117  2242  3476 D PCtrlBgApp: pkg to kill=[com.sina.news, com.taobao.taobao, com.letv.android.filemanager, com.sina.weibo, com.tencent.qqlive, com.tencent.mm, com.letv.android.client], top=[com.ss.android.article.news],
except=null

开始亮屏
02-09 17:08:08.065457  1202  1356 I PowerManagerService: Waking up from sleep (uid 1000)...
02-09 17:08:08.098044  1202  1202 I WindowManager: Started waking up...
02-09 17:08:08.081723  1202  1247 I WindowManager: Screen turning on...

13010 进程将 SswoActivity 页面移除
02-09 17:08:08.843069 13010 13010 D WindowClient: Remove from mViews: com.android.internal.policy.PhoneWindow$DecorView{1e4129 V.E...... R.....I. 0,0-0,0}, this = android.view.WindowManagerGlobal@fbf6386

由此可以,管家在锁屏后无法清理 今日头条的原因是,13010 在灭屏时将 今日头条的,一个页面 SswoActivity 移到了前台,亮屏后,又主动将其移除,

所以管家灭屏后无法清理应用, 亮屏后用户也看不见,

使用kill -STOP   stop 13010进程,可知 SswoActivity 为一个透明的activity

13010 进程为:

02-09 16:57:30.472246  1202  2320 I ActivityManager: Start proc 13010:com.ss.android.article.news:push/u0a160 for service com.ss.android.article.news/com.ss.android.message.NotifyService

修改方案:

在管家,灭屏时,获取一下,topActivity, 之后查杀时 依据此 topActivity 去查杀,

修改后,验证:

最近使用列表中,今日头条不见了,

但是结果发现在查杀之后,最近列表上找不到apk了, ps下进程还存在:

之前

u0_a135   8528  617   1458564 76444 SyS_epoll_ 00f71d5f3c S com.ss.android.article.news:push

u0_a135   8541  617   1668932 161388 SyS_epoll_ 00f71d5f3c S com.ss.android.article.news

u0_a135   8619  617   1458592 75764 SyS_epoll_ 00f71d5f3c S com.ss.android.article.news:pushservice

u0_a135   8797  617   1436664 60648 SyS_epoll_ 00f71d5f3c S com.ss.android.article.news:ad

之后

u0_a135   8903  617   1452848 74132 SyS_epoll_ 00f71d5f3c S com.ss.android.article.news:push

u0_a135   8916  617   1504060 103212 SyS_epoll_ 00f71d5f3c S com.ss.android.article.news

u0_a135   8997  617   1460428 78956 SyS_epoll_ 00f71d5f3c S com.ss.android.article.news:pushservice

由此可以知道,管家 kill 今日头条后,今日头条,又起来到了,

使用jdb 大法,在system_server启动进程时,添加断点,获取到的堆栈 为:

启动进程1

  [1] com.android.server.am.ActivityManagerService.startProcessLocked (ActivityManagerService.java:3,523)

  [2] com.android.server.am.ActivityManagerService.startProcessLocked (ActivityManagerService.java:3,505)

  [3] com.android.server.am.ActivityManagerService.startProcessLocked (ActivityManagerService.java:3,369)

  [4] com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked (ActivityStackSupervisor.java:1,507)

  [5] com.android.server.am.ActivityStack.resumeTopActivityInnerLocked (ActivityStack.java:2,444)

  [6] com.android.server.am.ActivityStack.resumeTopActivityLocked (ActivityStack.java:1,894)

  [7] com.android.server.am.ActivityStackSupervisor.resumeTopActivitiesLocked (ActivityStackSupervisor.java:3,159)

  [8] com.android.server.am.ActivityStackSupervisor.resumeTopActivitiesLocked (ActivityStackSupervisor.java:3,148)

  [9] com.android.server.am.ActivityManagerService.handleAppDiedLocked (ActivityManagerService.java:5,216)   if (!restarting && hasVisibleActivities && !mStackSupervisor.resumeTopActivitiesLocked()) {

  [10] com.android.server.am.ActivityManagerService.removeProcessLocked (ActivityManagerService.java:6,893)

  [11] com.android.server.am.ActivityManagerService.killPackageProcessesLocked (ActivityManagerService.java:6,488)

  [12] com.android.server.am.ActivityManagerService.forceStopPackageLocked (ActivityManagerService.java:6,637)

  [13] com.android.server.am.ActivityManagerService.forceStopPackageLocked (ActivityManagerService.java:6,371)

  [14] com.android.server.am.ActivityManagerService.forceStopPackage (ActivityManagerService.java:6,181)

  [15] android.app.ActivityManagerNative.onTransact (ActivityManagerNative.java:1,525)

  [16] com.android.server.am.ActivityManagerService.onTransact (ActivityManagerService.java:2,715)

  [17] android.os.Binder.execTransact (Binder.java:453)

启动进程2

  [1] com.android.server.am.ActivityManagerService.startProcessLocked (ActivityManagerService.java:3,523)

  [2] com.android.server.am.ActivityManagerService.startProcessLocked (ActivityManagerService.java:3,505)

  [3] com.android.server.am.ActivityManagerService.startProcessLocked (ActivityManagerService.java:3,369)

  [4] com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked (ActivityStackSupervisor.java:1,507)

  [5] com.android.server.am.ActivityStack.resumeTopActivityInnerLocked (ActivityStack.java:2,444)

  [6] com.android.server.am.ActivityStack.resumeTopActivityLocked (ActivityStack.java:1,894)

  [7] com.android.server.am.ActivityStack.resumeTopActivityLocked (ActivityStack.java:1,877)

  [8] com.android.server.am.ActivityStack.finishCurrentActivityLocked (ActivityStack.java:3,472)

  [9] com.android.server.am.ActivityStack.finishActivityLocked (ActivityStack.java:3,400)

  [10] com.android.server.am.ActivityStack.finishDisabledPackageActivitiesLocked (ActivityStack.java:4,702)

  [11] com.android.server.am.ActivityStackSupervisor.finishDisabledPackageActivitiesLocked (ActivityStackSupervisor.java:3,104)

  [12] com.android.server.am.ActivityManagerService.forceStopPackageLocked (ActivityManagerService.java:6,643)

  [13] com.android.server.am.ActivityManagerService.forceStopPackageLocked (ActivityManagerService.java:6,371)

  [14] com.android.server.am.ActivityManagerService.forceStopPackage (ActivityManagerService.java:6,181)

  [15] android.app.ActivityManagerNative.onTransact (ActivityManagerNative.java:1,525)

  [16] com.android.server.am.ActivityManagerService.onTransact (ActivityManagerService.java:2,715)

  [17] android.os.Binder.execTransact (Binder.java:453)

  

对应堆栈 查看代码:

在ams的 handleAppDiedLocked 方法中
private final void handleAppDiedLocked(......){
if (!restarting && hasVisibleActivities && !mStackSupervisor.resumeTopActivitiesLocked()) {
......

        }

    }

今日头条的

restarting 为false

hasVisibleActivities 为true 

然后会调用 resumeTopActivitiesLocked 去启动进程

使用 am force-stop, 具有同样效果,无法彻底stop, 此进程,即:
相当于系统 无法测试 stop 一个灭屏是处于前台的 进程。

此是android 的原生问题,如果想要完全停止他,有这些方案:

1、进行double kill,即相当于调用两次  am force-stop 去stop 此类应用,

第一次stop, 此类应用被kill,虽然会起来,但是前台activity将不存在,

第二次stop,因为activity 没有在top 页面,会被完全kill。

优点:修改简单,影响较小。

缺点:单一性,只使用于管家,其他调用系统forceStopPackage  接口的apk 不生效,且与系统设计 forceStopPackage 的原则不符合

2、修改ams forceStopPackage 流程

优点:所有调用此接口的apk 都生效,具有统一性,且与google设计forceStopPackage 的目的符合

缺点:流程过于复杂, 修改影响,太大了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: