操作步骤:
1.开启管家锁屏自动清理
2.打开手机一些APP
实际结果:锁屏几分钟后有部分应用未清理(例如今日头条APP,这两个必现)
期待结果:锁屏几分钟后应正常清理后台应用
复现率:必现
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
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, 此进程,即:
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
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 的目的符合
缺点:流程过于复杂, 修改影响,太大了。