android oreo 终于可以管理后台了

2017-08-22 12:36:58 +08:00
 athanos
在电池里终于可以为每个程序设置后台权限。实测微信留的三个活动后台都被系统干掉了。
16438 次点击
所在节点    Android
33 条回复
chnyang
2017-08-22 23:50:43 +08:00
@czmecho
@ysc3839
@chinawrj
@chinvo
@EricCartman
@daozhihun

楼上的这么多位,我想问问你们关后台只靠推送,那冷启动微信不会很慢吗?不懂求问
athanos
2017-08-22 23:52:37 +08:00
@chnyang 禁用了之后仍然收得到消息,而且并没有清除出内存,cache 里还有。 @honeycomb 看过源码,应该知道到底是怎么一回事。
ysc3839
2017-08-23 00:00:48 +08:00
@chnyang 我之前用 LineageOS 的时候并没有关掉微信的后台,怕错过什么通知。不过微信启动确实很慢,点了图标后卡至少 2 秒才出现界面,有时候会显示地球界面,又要等 5 秒。其他应用都没有这种状况,QQ 点图标都是秒开,企鹅界面也没出现过超过 3 秒的情况……
honeycomb
2017-08-23 00:26:37 +08:00
@athanos
我也发现有这个问题

微信在 7.1.2 里被杀得很爽快,但在 8.0.0 似乎不会被杀掉 service

oasisfeng 提出的 issue report:
https://issuetracker.google.com/issues/62480012

实际对应的问题早在 16 年 11 月就提交了,但 Google 无视了它
https://issuetracker.google.com/issues/37126419


修复的版本
stopInBackgroundLocked(int uid)

确实按照 37126419 的建议,把 stopping.add(service)移到 if 语句之外

https://android.googlesource.com/platform/frameworks/base/+/android-8.0.0_r4/services/core/java/com/android/server/am/ActiveServices.java
honeycomb
2017-08-23 00:36:41 +08:00
但确实可以在 8.0.0 看到系统杀死微信的 service 的报告

I/ActivityManager(1031): Process com.tencent.mm:tools (pid 7111) has died: fore RCVR
W/ActivityManager(1031): Stopping service due to app idle: u0a128 -1m32s154ms com.tencent.mm/.booter.CoreService
W/ActivityManager(1031): Stopping service due to app idle: u0a128 -1m20s538ms com.tencent.mm/.booter.NotifyReceiver$NotifyService


看上去这一套配合绿色守护的浅睡有一定效果,GCM 有的时候能把微信拉起来
EricCartman
2017-08-23 01:04:49 +08:00
@czmecho #20 appops 可以解决
skylancer
2017-08-23 01:40:55 +08:00
@daozhihun 关掉进程当然收不到,因为
1. 请看 GCM 实现
2. 微信并不是(用)高优先级
zhxhwyzh14
2017-08-23 08:20:50 +08:00
电池里怎么设置的后台权限呀?
dong3580
2017-08-23 08:30:04 +08:00
微信好像不给 GPS 不让用,有意思,
honeycomb
2017-08-23 09:29:03 +08:00
@dong3580 用 appops 治它
xingda920813
2017-08-23 10:27:36 +08:00
@cybermonster
@honeycomb
[到时候会出现不让你管理,否则不给用微信的情况]
-----------------------------------------------------
App 可以检测到 op RUN_IN_BACKGROUND 是否被 ignore / deny.

final int OP_RUN_IN_BACKGROUND = 63;
int mode = (int) AppOpsManager.class
.getMethod("checkOp",
int.class,
int.class,
String.class)
.invoke(getSystemService(AppOpsManager.class),
OP_RUN_IN_BACKGROUND,
Binder.getCallingUid(),
getPackageName());
System.out.println(mode);

targetSdkVersion 23 的 Legacy 应用, 上面的代码安装上时返回 0 (MODE_ALLOWED), adb 设为 ignore 后返回 1 (MODE_IGNORED), 设为 deny 后抛出 java.lang.SecurityException: com.company.test from uid 10172 not allowed to perform RUN_IN_BACKGROUND.
EmmaSwan
2017-08-24 03:19:59 +08:00
谷歌还是对流氓软件太仁慈了。不给权限不让用的,直接全球 PLAY 下架,让它永远呆在天朝就好了
honeycomb
2017-08-25 20:37:28 +08:00
@xingda920813
是的
如果出现那种情况就卸载吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/384807

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX