处理三星SPCM杀手

时间:2016-03-18 21:59:20

标签: android service activity-manager

最近我们购买了一款搭载Android 5.1.1的全新Galaxy S6,我们在配备新的三星SPCM内存管理器时遇到了一些麻烦。它正在积极关闭我们的应用程序的后台服务,即使设置为START_STICKY,它也没有重新启动。

此外,该服务占用的内存不超过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日志,但他们的服务以某种方式设法重新启动。

总而言之,我们的问题是:

  1. 如何防止SPCM将我们的应用定位为lowestscore包?
  2. 如果我们成为攻击目标,如何确保我们的服务在被杀后成功重启?
  3. 任何可以帮助我们的其他想法?

2 个答案:

答案 0 :(得分:0)

确保ActivityManager is not targeting your service too

AFAIK没有其他方法来确保生存而不是持续通知,这也是三星的开发者文档所说的。至于Facebook和TrueCaller,我没有答案。可能他们利用其他相关流程来恢复服务。

对于受影响的设备,我最早看到的是带有5.0.2的Galaxy Tab S SM-T805。很多5.1.1三星设备也有SPCM。我们最初也在S6上复制了这个问题,我可以确认它在6.0.1上仍然存在。

至于文档,尽可能this Samsung forums topic

对于测试和复制步骤,我建议:

  1. 确保设备实际上具有SPCM adb shell getprop | grep spcm
  2. 从任何电源上拔下插头。
  3. 安装Tinycore以观察RAM使用情况(为其启用持久通知)。
  4. 加载大量RAM饥饿的应用程序,以降低您的服务分数。或者试试Developer Toolbelt,它应该比手工填充更快,但我还没有对其进行测试。
  5. 关闭屏幕并给设备15分钟。
  6. adb shell logcat -v threadtime | grep spcm确认进程已被杀死。
  7. 冲洗并重复直至成功。

答案 1 :(得分:0)

我会尽力帮助您回答第3个问题:

我遇到了同样的问题,我发现最好的解决方法是使用AlarmManager来启动我的服务。所以我将AlarmManager设置为每30分钟运行一次并启动我的服务。如果它仍在运行,将再次调用onStartCommand,否则将重新创建服务。我在代码中做了一些调整,每30分钟处理一次对onStartCommand的新调用,它按照我的预期运行。缺点是电池耗尽,因为我的服务一直在运行,而Android从未进入睡眠模式(仍在使用它)。另一种方法是将您的服务设置为在前台运行,但在我的情况下,我不想这样做。

您可以尝试禁用SPCM,打开build.prop并更改以下行(需要root):

sys.config.spcm_enable=true

为:

sys.config.spcm_enable=false

看看herehere

希望它有所帮助。