今日头条,清理分析

操作步骤:
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 的目的符合

缺点:流程过于复杂, 修改影响,太大了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值