他パッケージ(他のapk)のリソースを読む

Androidアプリケーションは拡張子".apk"というパッケージにアーカイブされた後、機器のdata/appディレクトリにインストールされるが(Eclipse+ADTの場合、.apkアーカイブまではADTがビルド時、機器(エミュレータ)へのインストールは実行時に自動的に実行される)。

例えばjp.co.hoge.app.apkというアプリケーションのコンテキスト中から、jp.co.share.hogelib.apkという共有するためのパッケージからRリソースを読み込んで、文字列guidanceの値を読み込みみたいとしよう。

以下のようなコードを書きたくなる。(実際に書く)

String guidance = Resources.getSystem().getString(jp.co.share.R.string.guidance);

Eclipseでjp.co.share.hogelib側のソースコードツリーにリンクが張ってあれば、ビルド自体はできるが、実行すると上手くいかない。(NotFoundException)

Resourceクラスには、パッケージ名を指定して任意のリソースをロードするメソッドもあるが、

int handle = Resources.getSystem().getIdentifier("guidance", "string", "jp.co.share");

これも駄目だ。(return 0;)

通常のJavaアプリケーション(JFC/Swing等)の場合、セキュリティ上問題無いと判断された場合、クラスパス上のJavaパッケージからは自由にクラス/リソースをロードして利用できるが、Androidの場合はそうはいかない。前述したようにインストール単位はパッケージで分離されており、それらはZIP圧縮形式ではあるが、Javaのjarアーカイブのようにクラスパス上にある訳でも、自由にアクセスできる訳でもない。他のパッケージ(他のapk)に属しているリソースはそのままではロードできない。rawなファイルイメージでのデプロイ(機器側への配布)が可能であればまた別な方法もあるのだが、それは許可されていないし、今後も許可されないだろう。

ならば読み出すことは不可能なのだろうか? 否。