最近我们购买了一个新的带有 Android 5.1.1 的 Galaxy S6,我们在使用新的三星 SPCM 内存管理器时遇到了一些问题。它正在积极关闭我们应用程序的后台服务,即使设置为 START_STICKY,它也不会重新启动。
此外,该服务占用的 RAM 不超过 5MB,但不知何故,我们最终还是以 SPCM 算法的最低分数而被选择杀死。
这是我们的服务:
Public class IncomingService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
@Override
public void onCreate() {
if (mPhoneListener == null) {
mPhoneListener = new CallStateListener();
TelephonyManager tm = (TelephonyManager) getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}
/**
* Listener for call states
* Listens for different call states
*/
private class CallStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
// Doing something with incomingNumber
}
}
在清单中:
<service
android:name="com.services.IncomingService"
android:enabled="true"
android:priority="999" >
</service>
SPCM 杀死我们的服务的日志:
Force stopping com.special.app appid=10499 user=0: SPCM kill lowestscore package!
03-18 22:48:11.280 3562-3562/? I/ActivityManager: Killing 2279:com.special.app/u0a499 (adj 8): stop com.special.app cause SPCM kill lowestscore package!
03-18 22:48:11.280 3562-3562/? W/ActivityManager: Scheduling restart of crashed service com.special.app/com.services.IncomingService in 1000ms
03-18 22:48:11.280 3562-3562/? I/ActivityManager: Force stopping service ServiceRecord{27d2c408 u0 com.special.app/com.services.IncomingService}
即使 ActivityManager 日志指出它正在重新安排我们的服务的重启,它实际上从未被重启过。
我们已经看到有关其他应用程序(Facebook、TrueCaller 等)的相同 SPCM 日志,但它们的服务以某种方式设法重新启动。
综上所述,我们的问题是:
- 如何防止 SPCM 将我们的应用程序定位为最低分包?
- 如果我们被攻击了,如何确保我们的服务在被杀死后能够成功重启?
- 还有其他可以帮助我们的想法吗?