先日、少し調査する機会があったので可能かどうか調査してみました。
結論としては可能でした。
ただし、以下の条件を満たさねばなりません。
- 同じ証明書で署名してあること。
- 同じユーザーIDで実行されること。
- 同じプロセスIDで実行されること。
同じ証明書で署名するのは、共通のユーザーIDで実行するためです。
そして共通のユーザーIDで実行したアプリは必要であれば同一プロセス上で実行することが可能になります。
この辺の解説は公式ディベロッパーサイトのこのあたりに記載がありました。
http://developer.android.com/intl/ja/guide/topics/security/security.html#userid
このテクニックは、共通リソースを用意したりする時にも使えるみたいですね。
それでは実際にやってみましょー
同じユーザーIDを設定
AndroidManifest.xmlのmanifest内の android:sharedUserId に共通のユーザーIDを設定します。
android:sharedUserId="org.ymegane"
リファレンスによると、必ず”.”を含む必要があるようです。
同じプロセスIDを設定
同様にAndroidManifest.xmlのapplication内の android:process に共通のプロセスIDを設定します。
android:process=":shareApp"
こちらは先頭に”:”をつける必要があります。
同じ証明書で署名
これは、デバッグビルドであればeclipseが署名をしてくれるので、とりあえず試すだけなら気にする必要はありません。
と言うわけでサンプルアプリを作成してみました。
こんな感じで、先日公開した「あっぷるーむ」もちょろっとマニフェストを書き換えるだけでタブの中に取り込むことができました。
ちなみに、この時実行プロセスはどうなっているかと言うと、
きちんと同一プロセス上で実行されているようです。
同一証明書を利用すると言うことで、広く仕様を公開して手軽にプラグインどんどん追加してね!みたいな使い方は難しい場合が多いと思いますが、いろいろと使い道はありそうな気がします。
このサンプルソースは以下のリンクより公開しますのでご自由にどうぞ。
あっぷるーむの部分をコメントアウトしていますので、自由に書き換えてお試しください。