この質問は移動しました https://softwarerecs.stackexchange.com/questions/27841/plugins-architecture-for-an-Android-app
オープンソースアプリ のプラグインシステムを実装したいと思います。これは、少数のユーザーだけが必要とする多くの機能を備えた、非常に大きくなったためです。 userAがfeature7とfeature24を必要とし、userBがfeature39とfeature24を必要としているため、異なるアプリをリリースすることは良い解決策ではありません。
プラグインアーキテクチャの良い例はどこにありますか?
プラグインでできることは次のとおりです。
たとえば、プラグインの1つが特定の画面にボタンを追加する必要があり、このボタンをクリックすると、アプリのデータベースの値が増加します。私の知る限り、これはコンテンツプロバイダーとインテントでは実行できません。
コアアプリのコードがどこにでもある大量のフックで複雑になるのを避けたいです。
プラグインの形式は、SDカード上のファイル、アプリ、またはその他のものです。
私は、Robo-guiceのように機能するフレームワークと、その主要なIoC機能の一部を実行しました。 (ビュー/サービスなどをロードする定型コードを削減...)
しかし、問題の解決策であると私が思う中核となるのは、「[res]」と「<layouts>.xml
」ファイルを含む個別のAPK「プラグイン」ファイルをロードする機能です。 <layouts>.xml
ファイルは、そのAPK内のクラスによって個別に拡張できます。つまり、(独自の<layout>.xml
を拡張する)CustomViewを元の/親アプリにロードできます。これはすべて、親アプリAPKがプラグインAPKでUIがどのように拡張されたかを知らなくても実行されます。
意味の例:マッピングアプリがある場合、フレームワークは「アドオン機能」プラグインの「契約」に一致するインストール済みAPKを動的にスキャンし、それに固有のUIをフローティングパネルとしてアプリのビューにロードします。
Androidのプラグインフレームワークは実行可能です。これは、Androidがこれを達成するために必要な組み込みAPIのすべてではないにしてもほとんどを持っているためです。
これらは、Android向けのプラグイン開発のこの分野におけるお友達です。
DexClassLoader
(正しいClassNotFoundException
btwを使用しないと、ClassLoader
が面倒になります)プラグインアーキテクチャの良い例はどこにありますか?
GoogleのRoman Nurikが彼のオープンソースアプリ ダッシュクロック にNiceプラグインフレームワークを実装しました。プラグイン自体は [〜#〜] api [〜#〜] の DashClockExtension クラスを拡張するサービスであり、独自のリソースを持つ完全に独立したAPKファイルとしてインストールされます。 AIDLを介して通信プロトコルを定義することは非常に多くの作業ですが、それは素晴らしく、クリーンで、非常にうまく機能します。
プラグインの1つは特定の画面にボタンを追加する必要があり、このボタンをクリックするとアプリのデータベースの値が増加します。
プラグインで変更できるメインレイアウトの部分は、コアアプリで事前に定義し、通信プロトコルを介して公開する必要があります。プラグインが任意のレイアウトを膨らませてメインアプリに送信し、それが独自のレイアウトの事前に割り当てられた領域内に配置できるようにする必要があります。
モジュール性を高めるだけの場合は、 PicoContainer 、 Guice または Spring などの依存関係注入コンテナを使用することをお勧めします。
軽量のプラグインアーキテクチャが必要な場合は、 Java Plugin Framework(JPF) を選択してください。
モジュールで実装できる拡張ポイントを定義できます。プラグインフレームワークの主な役割は、これらのモジュールを(jarとして)バンドルできる方法を提供することです。これらのモジュールは、コアアプリケーションによって動的に検出され、拡張ポイントの実装として提供されます。