Multiple APKを使って関係ないAPKを入れる方法を調べてみた

androidでMultiple APKと言う機能が、android 2.3からサポートされています。これを使って、他にリリースしているアプリにバンドルする形で新しい別のパッケージをインストールできないかを考えていたのですが、、どうやら難しそうな感じで、思っていたようなMultipleっぷりではなかった…と言う話。

やりたいこと

既にリリースしている自社のサービスがある前提。例えば100万本くらいインストールされているアプリに対して、新サービスのパッケージAPKをMultiple APKみたいな機能を使って、まとめて100万台に対して配布したい!!と言うのがやりたいこと。思えば虫のいい話ですが。。以下の4つを案として調べてみた。

  1. androidのMultiple APK Supportを使う
  2. PACKAGE_INSTALLパーミッションを使う
  3. ADBを使う
  4. root化手法を使う

結論

残念ながら現在のandroidの仕様では、複数の関係ないAPKを同時に入れ込むようなパッケージングは技術的に難しそう。当初の予定通り、別アプリから強制的に画面遷移を伴ってインストールさせるなど、個別にインストールする方法でいくしか今は無いように思う。。残念。

と思ったんだけど、制約さえ回避出来るのであればもしかして出来るのでは、と思った。詳しくは以下。

Android Multiple APKについて

android2.3により実装された、複数APKを1つのパッケージとして扱う方法。一番有望だったが、以下の制限があるため今回の利用には適さないと思われる。
「制限:同一パッケージ名としてリリースする必要がある」

この機能は本来、デバイス機能の違いをAPK個別で吸収し切れない場合の回避策として提供されている。そのため前提として同じ機能を持つパッケージの、別バージョンとしてのみ複数apkが許可されている。今回に当てはめると、例えば旧アプリA(net.mantol.appA)にバンドルしようとすると、新アプリC(net.mantol.appC)を旧アプリAと同じパッケージ名で提供し、旧アプリBにバンドルする場合は旧アプリB(net.mantol.appB)と言うパッケージ名で新アプリCを提供する必要が出て来る。

あれ、、ここまで書いておいて何だけど、弊社の場合は以下の制限があるからこの方法は無理だと言う結論に至った。
「制限:A, B, Cのアプリは別パッケージ名として存在しており、変更不可」
これさえクリア出来れば、本来の使い方とは違いそうだけど、出来るんじゃないか。。誰かやってみたら教えて><

PACKAGE_INSTALLパーミッションを使う

androidのpermissionの1つに PACKAGE_INSTALLパーミッションと言うものがある。例えばメーカーのマーケットアプリ等は、アプリから強制的にインストールさせる機能を持っている。調べた結果、どうやらgoogle本体やメーカー各社は特殊な権限(signatureOrSystem)を持っておりそのアプリからしか上記のPACKAGE_INSTALLパーミッションは利用出来ないようになっているらしい。。メーカーの協力があればこの機能は利用出来る可能性がある。(例えばメーカーのマーケットで他のアプリを入れた場合には、新アプリもまとめてインストールするなど。)

ADBを使う

3, 4はは、もはや本来の意図的に使わないことを分かりつつ調べてますが。。ADBとは、androidの開発ツールキットに付属しているデバッグ用のツールのこと。ADBを使うことでandroid単体では出来ない操作が色々出来たりする。ADB経由でアプリのインストールを行うことはどうやら出来そうだが、そもそもUSB接続等で利用する必要があるため、ユーザに配布するパッケージの自動インストールには使えなさそう。。そりゃそうだ。

ルート化手法を使う

androidのroot権限をアプリに渡すことで、大体のことは出来るようになります。恐らく今回の場合も出来るようになりそうですが、ルート化したandroidはメーカー保証が受けられないなど、かなりブラックな方法のため今回の検討からは外さざるを得ない。。またメーカー側は制御をかけてアプリのルート化を防止する方向で動いているようである。(危険なので、そりゃそうだと思います。)

提供元不明アプリについて

今回の件と付随するが、別サーバからのインストールには「提供元不明のアプリ」の許可が必要になる。マーケット系アプリはこれを「ON」にさせていますが、セキュリティ的には危険な行為のはず。。今後変わっていくのか?世の中のandroidのうち、何%が「ON」になっているんだろう。