Android应用程序的OOM(内存不足)调整进程优先级

13
我正在开发一个Android Launcher(主屏幕替换)应用程序,遇到了在低内存情况下Launcher被杀死的问题。当用户回到主屏幕并等待时,这显然不太好。
在我的研究中,我发现Android将进程分为几个优先级组,从最高到最低:
系统
持久性
前台
可见
可察觉
A服务
主页
以前
B服务
后台
您可以通过执行以下命令来查看哪些进程属于哪个组:adb shell dumpsys meminfo
我找到的关于此主题的最全面的文档是:http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle 但是,它没有清楚地说明上述所有组的情况。具体来说,
  1. 什么情况下会被认为是“可感知”的进程?一些应用程序(例如Go Launcher EX)似乎已经找到了在后台时保持在此类别中的方法。这样,它就不会被频繁杀掉。他们是如何做到的呢?

    我从adb shell dumpsys activity中发现Go Launcher Ex被视为前台服务。我能找到的有关此主题的唯一文档说,您需要在状态栏中放置一个持久通知。但是,Go Launcher Ex以某种方式避开了这个要求。我迷失了:-(

  2. “A服务”、“主页”和“B服务”之间有什么区别?

  3. 对于启动器应用程序,是否有任何其他一般建议,以使其比常规应用程序具有更高的优先级?我认为这是完全合理的请求,因为对于用户来说,启动器应该被认为比大多数事情(除了当前的前台活动)具有更高的优先级。


好问题!为 dumpsys 添加 1。 - herbertD
2个回答

11

回答问题1)和3):
如果你运行logcat -b events,你会看到那些具有可感知优先级的应用程序确实会创建通知。但是所有属性(包括contentView)都设置为null。
因此,在我研究同样问题时,我只是尝试创建一个空的通知并用它来启动我的服务:

startForeground(42, new Notification())

然后voilà:logcat说:

I/notification_enqueue( 1607): [my.testapp.TestApp,42,NULL,Notification(pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 kind=[null])]

以及dumpsys meminfo:

...
17539 kB: Perceptible  
     ...  
     6164 kB: my.testapp.TestApp (pid 25573)  
...

我认为这并不是有意为之,应该明确只有在真的非常需要时才使用它。我不想想象每个糟糕的服务都在使用这个。


2
谢谢你的回答!我刚刚确认了一切,这真是太神奇了...我有点想把这个答案藏起来,因为我担心每个糟糕的应用程序都会尝试使用它,并完全绕过Android的内存管理 :-) - dubchoi
我之前使用了startForeground(0,notify),但是使用startForeground(1,notify)对我很有效,感谢你的想法帮我找出代码中的问题。我从未想过将通知ID设置为1或42会改变这么多东西。 - Diljeet

0
根据您所引用的文档,您可以尝试在启动器中使用更高的优先级启动长期服务,并检查KILL时间的性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接