サービスをアプリケーションプロセスから分離する

Androidのサービス(Service)はマニフェスト要素におけるandroid:process属性の記述により、サービスが実行されるプロセスをアプリケーションから分離することができる。

  • android:process の記述無し (デフォルト)

サービスはアプリケーションに割り当てられたプロセス上で、他のActivityと共に実行される。
  • android:process = ":servicename" とコロン":"で始まる名前を指定した場合

サービスはアプリケーションのプロセスからプライベートに生成された、新たなプロセス上で実行される
  • android:process = "servicename" と英子文字で始まる名前を指定した場合※

サービスはアプリケーションのプロセスからグローバルに生成された、新たなプロセス上で実行される

実際に記述して実行してみれば分るが、別プロセスで実行するようにした場合はアプリケーションのプロセスを終了してもサービスのプロセスはシステムに常駐し続けるのが分るはずだ。

プロセスを分離した場合の「プライベート」か「グローバル」かの違いが今ひとつよく分っていないのだが、リファレンスによると

If the name assigned to this attribute begins with a colon (':'), a new process, private to the application, is created when it's needed and the service runs in that process. If the process name begins with a lowercase character, the service will run in a global process of that name, provided that it has permission to do so. This allows components in different applications to share a process, reducing resource usage. 
service > android:process - Android Developers

とあるので、資源の共有が可能なのがグローバル、それが不可能なのがプライベートなのだろう。(この辺詳しい解説が見あたらない。組込みLinux関連だろうか)

以前に書いたTagsoupを利用したWebスクレイピングを実行するサービスなど、他の複数のアプリケーションと共有したいサービスは、当然グローバルプロセスとして起動すべきだろう。

プロセスを分離することによりシステムリソースの節約になり、サービスを起動する際のCPUサイクルを軽減することが出来るため、良いことずくめなのだが、分離することにより新たな問題が発生することもあるので注意が必要だ。その辺はまた別な機会に。


※アプリケーション全体にパッケージの指定がある場合、小文字で開始するといっても最初の一文字は"."ピリオドである必要がある。