2016-03-18 3 views
3

最近、Android 5.1.1で新しいGalaxy S6を購入しました。新しいSamsung SPCMメモリマネージャーにはいくつかの問題があります。 Googleのアプリのバックグラウンドサービスを積極的に閉鎖しています。これはSTART_STICKYに設定されていても再起動されません。サムスンSPCMキラーを扱う

さらに、サービスは5MB以上のRAMを必要としませんが、何とか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. lowestscoreパッケージとして我々のアプリをターゲットからSPCMを防ぐためにどのように?
  2. 私たちがターゲットにされている場合、サービスが強制終了された後にサービスが正常に再開されるようにする方法を教えてください。
  3. 私たちを助ける他のアイデアですか?
+0

私は同じ問題があります。これを修正しましたか? – kakopappa

+0

私たちは、何が助けられたのか完全にはわからない多くのことをやってみました:)その中で、アプリのメモリ消費量を減らしていました。私たちはSPCMが私たちをもう標的にしないと考えています。あなたの幸運を祈ります! – Nom1fan

答えて

0

ActivityManager is not targeting your service tooを確認してください。

AFAIK永続的な通知よりも生存を確実にする方法は他にありません。それはSamsungの開発者のドキュメントの状態です。 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. すすぎ、成功するまで繰り返します。
0

私はあなたの第三の質問に答える手助けしようとします:

私は同じ問題に直面していると私が見つけ最適な回避策は、私のサービスを開始するAlarmManagerを使用することですが。そこで、AlarmManagerを30分ごとに実行し、サービスを開始するように設定しました。それでも実行されている場合は、onStartCommandが再度呼び出されます。それ以外の場合は、サービスが再作成されます。私は30分ごとにonStartCommandへの新しい呼び出しに対処するために自分のコードでいくつかの調整を行いました。私のサービスは常に稼働しており、Androidは決してスリープモードに入っていない(まだそれに取り組んでいる)ので、欠点はバッテリーの消耗です。もう一つのアプローチは、サービスをフォアグラウンドで実行するように設定することですが、私の場合はそれをやりたいとは思いません。あなたは、SPCMを無効にあなたのbuild.propを開き、次の行を変更しようとすることができます

は、(ルートが必要です):

sys.config.spcm_enable=true 

に:

sys.config.spcm_enable=false 

ルックherehereしてください。

希望します。

関連する問題