Lidando com o assassino Samsung SPCM
Ultimamente, adquirimos um novo Galaxy S6 com o Android 5.1.1 e estamos tendo alguns problemas com o novo gerenciador de memória Samsung SPCM que vem com ele. Ele está fechando agressivamente o serviço em segundo plano do aplicativo, que, embora esteja definido como START_STICKY, não está sendo reiniciado.
Além disso, o serviço ocupa não mais de 5 MB de RAM, mas ainda assim, de alguma forma, acabamos com a pontuação mais baixa do algoritmo SPCM e somos escolhidos para serem mortos.
Este é o nosso serviço:
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
}
}
E no manifesto:
<service
android:name="com.services.IncomingService"
android:enabled="true"
android:priority="999" >
</service>
Um log do SPCM matando nossos serviços:
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}
Embora o log do ActivityManager declare que está reagendando uma reinicialização para o nosso serviço, ele nunca é realmente reiniciado.
Vimos os mesmos logs do SPCM em relação a outros aplicativos (Facebook, TrueCaller etc.), mas seus serviços de alguma forma conseguem reiniciar.
Então, para resumir, nossas perguntas são:
Como impedir que o SPCM direcione nosso aplicativo como pacote com menor pontuação?Se tivermos sido alvejados, como garantir que nosso serviço seja reiniciado com êxito após ser morto?Alguma outra idéia que possa nos ajudar?