进程在 Marshmallow 上被杀死但在 Lollipop 上没有

Process being killed on Marshmallow but not on Lollipop

有一个现有的应用程序(几年前)在设备启动时启动。 在 Lollipop 上一切正常,但在 Marshmallow 上,应用程序启动后大约 10 或 20 秒左右,进程被终止。 logcat 中没有任何异常的迹象,当进程被终止时唯一记录的是这一行:

"I/ActivityManager﹕ Killing 3100:com.company.E/u0a85 (adj 15): empty #17"

知道 "empty #17" 可能意味着什么,如果它有什么重要的话。或者有什么建议可以找出它被杀的原因吗?

就像@CommonsWare 评论的那样,这意味着您的流程没有 运行 组件。 ActivityManager 将保留空进程以加速未来的启动,但仅 a limited number of them -- the default 32/2 = 16 on your device. Your app is #17, so it is killed.

apps that have been empty for more than 30 minutes 的最大数量也有一个(下)限制。但这会给你一个 "empty for X s" 的原因字符串,而不是 "empty #X".

这不是 Marshmallow 中的新功能。不知道为什么你以前没有经历过。也许你有,但你没有注意到它。也许它发生得足够晚,你有时间完成你的工作。或者您设备的 Lollipop/Marshmallow 版本可能在某些方面有所不同(例如,启动时启动的进程数量增加并变为空,或者 ProcessList.java 中的限制配置不同?)。

无论如何,如果您没有活动组件,就不能指望您的进程保持活力。为您的工作启动服务 -- 并确保在完成后停止它。

框架可以随时取消同步。例如一个同步不是 * 用户发起并持续超过 30 分钟将被视为超时并取消。 * 同样,框架将尝试确定适配器是否正在取得进展 * 通过在一分钟内监控其网络 activity。如果网络流量超过此 * window 足够接近零,同步将被取消。

这是 Marshmallow 中的新变化。 您可以使用 Lollipop 代码验证它 here.