2016-03-18 4 views
3

В последнее время мы приобрели новый Galaxy S6 с Android 5.1.1, и у нас возникли проблемы с новым менеджером памяти Samsung SPCM, который поставляется вместе с ним. Он агрессивно закрывает фоновый сервис нашего приложения, который, хотя и установлен на START_STICKY, не перезапускается.Работа с Samsung SPCM killer

Кроме того, услуга занимает не более 5 МБ ОЗУ, но все же мы как-то получаем наименьший балл алгоритма 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 утверждает его перенастраивает перезагрузку для нашего сервиса, он никогда не перезапускается.

Мы видели те же журналы SPCM, что и другие приложения (Facebook, TrueCaller и т. Д.), Но их службы каким-то образом перезапускаются.

Так, чтобы подвести итог, наши вопросы:

  1. Как предотвратить SPCM от ориентации нашего приложения в пакете lowestscore?
  2. Если мы были нацелены, как убедиться, что наш сервис будет успешно перезапущен после того, как вас убили?
  3. Любые другие идеи, которые могут нам помочь?
+0

У меня такая же проблема. Вы это исправили? – kakopappa

+0

Нам удалось, но попытались многое, мы не совсем уверены в том, что помогло :) Среди вещей было: Снижение потребления памяти нашего приложения. Мы предполагаем, что SPCM не нацеливает нас больше. Удачи тебе! – Nom1fan

ответ

0

Удостоверьтесь, что ActivityManager is not targeting your service too.

AFAIK нет другого способа обеспечить выживание, чем постоянное уведомление, это то, что заявляет разработчик. Что касается Facebook и TrueCaller, у меня нет ответов. Возможно, они используют другие связанные процессы для восстановления сервисов.

Что касается устройств, которые я раньше видел, это Galaxy Tab S SM-T805 с 5.0.2. Многие 5.1.1 устройства Samsung имеют SPCM. Сначала мы воспроизвели проблему на S6, и я могу подтвердить, что она все еще присутствует в версии 6.0.1.

Что касается документации, this Samsung forums topic подходит как можно дальше.

Для тестирования и воспроизведения шагов, которые я советую:

  1. Убедитесь, что устройство на самом деле имеет SPCM adb shell getprop | grep spcm.
  2. Отключите его от любых источников питания.
  3. Установите Tinycore для наблюдения за использованием ОЗУ (включите постоянное уведомление для него).
  4. Загрузите большое количество головоломок, чтобы повысить эффективность ваших услуг. Или попробуйте Developer Toolbelt, он должен быть быстрее, чем заполнять его вручную, но я его не тестировал.
  5. Отключите экран и дайте устройству 15 минут.
  6. adb shell logcat -v threadtime | grep spcm, чтобы подтвердить, что процессы были убиты.
  7. Промыть и повторить до успешного завершения.
0

Я буду стараться, чтобы помочь вам ответить на ваш 3-й вопрос:

Я столкнулся тот же вопрос, и лучший обходной путь я нашел, чтобы использовать AlarmManager начать свою службу. Поэтому я устанавливаю AlarmManager для запуска каждые 30 минут и запуска моего обслуживания. Если он все еще запущен, onStartCommand будет вызван снова, иначе служба будет воссоздана. Я сделал некоторые корректировки в своем коде, чтобы разобраться с новыми вызовами onStartCommand каждые 30 минут, и он работает так, как я ожидал. Недостатком является разряд батареи, так как мой сервис всегда работает, и Android никогда не входит в спящий режим (все еще работает над ним). Другой подход заключается в том, чтобы настроить службу на переднем плане, но в моем случае я не хочу этого делать.

Вы можете попробовать отключить SPCM, откройте build.prop и измените следующую строку (требуется корень):

sys.config.spcm_enable=true 

к:

sys.config.spcm_enable=false 

Посмотрите here и here.

Надеюсь, это поможет.