web-dev-qa-db-ja.com

スティッキーフォアグラウンドサービスが「プロセスが不良」エラーで再起動に失敗する

フォアグラウンドサービスを開始しました。 onStartCommandからSTART_STICKYを返すように注意しました。フォアグラウンドサービスが無期限に実行されないが、Androidと呼ばれる内部モジュールRestartProcessManagerによって定期的に終了されることを確認しました。基本的に、プロセスLRUが維持され、新しく終了したサービスそのように構成されている場合(スティッキーかどうか)は、再度スケジュールされます。

私が直面している問題は、再起動の処理方法です。 Logcatは、サービスインテントが配信されていたことを示しますが、"process is bad"のため失敗しました

他のソースを精査した後、私のサービス内にメモリリークがあると信じるようになりました。この主張を検証するために、同じアプリ内でonStartCommand中にステートメントをログに記録する以外に何もしないバニラフォアグラウンドサービスを作成しました。これも同じ問題を観察しました。

(明らかに新しいパッケージ名で)新しいプロジェクトでまったく同じことを試しましたが、サービスの再起動は完全にうまくいきました。また、studio-> logcatの下にある赤い十字ボタンをクリックして、再起動をシミュレートします(これにより、プロセスが強制終了されます)。とにかく、今回はサービスインテントが正常に配信され、サービスが再開されました。私のプロジェクトには依存関係があり、何らかの方法で混乱している可能性があると思いました。新しいプロジェクトで依存関係を複製しましたが、期待どおりに機能し続けました。

今、これはばかげたことです。バギープロジェクトのパッケージ名を変更したところ、問題は発生しなくなりました。私はこれを診断するのに2日近く費やしたので、これは修正として解決したと思いますが、私のアプリは既に公開されているため、パッケージ名を変更することはできません。

Edit-1: Oreo(one plus 5)を実行しているデバイスでこれを現在観察していることを言及する必要があります

Edit-2:サービスはアプリと同じプロセスで実行されています。そして、logcatダンプも含めました。

02-15 14:26:50.850  1395  1445 D RestartProcessManager: updateSelf :  com.ambee, size : 30
02-15 14:26:50.852  1395  1445 D RestartProcessManager: com.ambee got score 26.17240489145331 in DayDuration for duration : 525176
02-15 14:26:50.853  1395  1445 D RestartProcessManager: com.ambee got score 99.80218232889891 in DayLRU for LRU diff : 47707034
02-15 14:26:50.853  1395  1445 D RestartProcessManager: com.ambee got score 90.9090909090909 in DayLaunchTimes for launch times : 10
02-15 14:26:50.854  1395  1445 D RestartProcessManager: com.ambee : X : 2727.272727272727, Y : 785.1721467435993, Z : 2994.0654698669673
02-15 14:26:51.082  1395  1445 I ActivityManager: Killing 13839:com.ambee/u0a260 (adj 200): [BgDetect][RNK] kill com.ambee (uid 10260) usage 4
02-15 14:26:51.083  1395  1445 D ActivityManager: Process com.ambee has 1 services
02-15 14:26:51.083  1395  1445 W ActivityManager: Scheduling restart of crashed service com.ambee/.vson.LinkService in 10996ms
02-15 14:26:51.084  1395  1445 D EmbryoManager: prepare com.ambee user 0
02-15 14:26:51.099  3710  3710 D NotificationListener: onNotificationRemoved# hash: 68226270 sbn: StatusBarNotification(pkg=com.ambee user=UserHandle{0} id=903 tag=null key=0|com.ambee|903|null|10260: Notification(channel=default pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x72 color=0x00000000 actions=2 vis=PRIVATE))
02-15 14:26:54.121  1395  1444 I ActivityManager: Start proc 22570:com.ambee/u0a260 for embryo com.ambee
02-15 14:26:54.121  1395  1444 D Embryo_Uterus: Embryo created.com.ambee, pid=22570
02-15 14:26:54.796 22570 22570 D Embryo  : preload com.ambee, 10ms, hwui=true, layout=false, decor=false
02-15 14:27:02.084  1395  1445 W ActivityManager: Unable to launch app com.ambee/10260 for service Intent { cmp=com.ambee/.vson.LinkService }: process is bad
02-15 14:27:04.214  1395  1444 D Embryo_Uterus: rank:63, com.ambee, 35767806
35
farthVader

サービスのバニラバージョンについては、以下を検討してください。

1-アプリをアンインストールします2-デバイスを再起動します3-バニラサービスバージョンをログに再インストールします.

うまくいくはずです。

フォアグラウンドサービスについては、stopForegroundServiceメソッドではなく、stopSelfまたはstopServiceメソッドの使用を検討してください。 stopForegroundServiceは、サービスがフォアグラウンドになるのを停止するだけです。バックグラウンドサービスであることを妨げるものではありません。それは何度も再起動し、サービスがクラッシュするか、5秒以内にジョブが実行されない場合、OSはサービスを何度も強制終了し、最終的にサービスはOSのブラックリストに登録されます。

2
Shift Delete

KR_Androidのコメントを押し上げる: this blog および this other question によると、サービスインテントは、少なくとも2回クラッシュした後に「不良」と宣言されます。

してみてください

  • すべてのメソッドをtry { method(..); } catch(..) { log(..) }セキュリティベルトにカプセル化する
  • アプリをアンインストールして再インストールする

お知らせください。さらに掘り下げた後、回答を更新します

0
Suricat

ボックスを再起動するまで、システムがサービスを再起動しないことに不満を感じました。次に、クラッシュカウントをより迅速にクリアするためのこのトリックを見つけました。

adb Shell killall system_server
0
Allen Luce