私はJavaとAndroidの開発に非常に慣れていないため、muninのように統計と情報を収集するアプリケーションから始めようとしています。アプリケーションに「プラグイン」をロードできるようにしようとしています。これらのプラグインは既にアプリケーションに含まれていますが、すべてを個別に呼び出す必要はなく、反復処理できるようにしたいと考えています。serviceloader を使用しようとしましたが、META-INF/services を APK に入れることができませんでした。Androidでserviceloaderを使用できるかどうか疑問に思っていますありがとう
編集:java.util.ServiceLoaderについて質問していますが、そうすべきだと思いますが、サービスフォルダーをMETA-INFに取得する方法がわかりませんAPK
5 に答える
この問題に対する未解決のバグ レポートがあります。https://code.google.com/p/android/issues/detail?id=59658を参照してください
META-INFフォルダーは、ApkBuilder によって APK から意図的に除外されています。ApkBuilder.java の唯一のコメントは「他のフォルダー (/META-INF など) を除外する必要がある」ですが、他に説明はありません。
ant で META-INF を追加した後でも、META-INF/services/* ファイルの内容を置き換えたり、名前を変更したりすることを拒否する Proguard を使用したい場合は、まだ問題が発生します (それは別の話です。作成者は保持したいと考えています)。プロガードにとらわれない)。
ただし、maven を使用している場合は、両方の問題を解決しようとするhttps://github.com/pa314159/maven-android-plugin (「変更された」という名前のブランチ) を確認することをお勧めします。これは、自分の Android プロジェクト用に 1 か月前に変更した元の「android-maven-plugin」からのフォークです。
また、Proguard-4.7 のパッチも提供します。
これがお役に立てば幸いです。フィードバックは大歓迎です。
いくつかの状況でうまくいくかもしれない解決策を見つけました。の代わりに、 NetBeans に付属ServiceLoader
のクラス/ライブラリを使用しています。これは のスーパーセットです。NetBeans 自体は必要なく、Eclipse でも問題なく動作するようです。アプリケーションで使用している機能を Lookup の同等のものに置き換え、org-openide-util-lookup ライブラリを追加する必要があります。次に、次のようなことができます。org.openide.util.Lookup
ServiceLoader
ServiceLoader
Lookup lookup = new ProxyLookup(Lookup.getDefault(),
Lookups.metaInfServices(myClass.getClassLoader(), "services/"));
ServiceLoader
ファイルを META-INF/services/ から services/ に移動します。
ProxyLookup
のため、これは変更されていない標準の Java 環境で引き続き機能することに注意してください(つまり、そのような場合は引き続き META-INF/services を参照します)。
ライブラリのドキュメントへのリンクは次のとおりです: http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/Lookups.html
アップデート
これで数日間作業した後、うまく機能しているようです.環境(標準のJavaとAndroid)間を移動し、それぞれの場所で適切に動作します. 主な欠点は、ファイルを /services ディレクトリに手動でコピーする必要があることです。
可能です。http://developer.android.com/reference/java/util/ServiceLoader.htmlを確認することをお勧めします
ServiceLoader は Java 言語のもので、Android にはあまり関係ありません。使用しないことをお勧めします。ロードする .apk 内のクラスのリストを見つけたいだけの場合、これを行うにはさまざまな方法があります。それらをリストする res/xml の XML ファイルに配置する、リフレクション、注釈を使用するなどです。