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?

questionAnswers(2)

yourAnswerToTheQuestion