Использование serviceloader на Android - PullRequest
11 голосов
/ 23 апреля 2011

Я очень новичок в разработке на Java и Android, и чтобы узнать, я пытаюсь начать с приложения для сбора статистики и информации, как это делает munin.Я пытаюсь быть в состоянии загрузить «плагины» в моем приложении.Эти плагины уже есть в приложении, но я не хочу вызывать их все по отдельности, но могу перебирать их.Я пытался использовать serviceloader, но никогда не мог получить META-INF / services в мой apk.Так что мне интересно, возможно ли использовать serviceloader на Android? СпасибоINF на апк

Ответы [ 5 ]

5 голосов
/ 12 ноября 2013

Существует открытый отчет об ошибке по этой проблеме. Смотри https://code.google.com/p/android/issues/detail?id=59658

4 голосов
/ 02 февраля 2012

Папка META-INF намеренно исключена из APK ApkBuilder;единственный комментарий в ApkBuilder.java - «нам нужно исключить какую-то другую папку (например, / META-INF)» * , но другого объяснения нет.

Даже после добавления META-INF с помощьюМуравей, у вас все еще будут проблемы, если вы захотите использовать Proguard, который отказывается заменить содержимое файлов META-INF / services / * или переименовать их (это еще одна история, автор хочет сохранить независимость от Proguard).

Однако люди, использующие maven, могут захотеть проверить https://github.com/pa314159/maven-android-plugin (ветвь с именем «измененный»), которая пытается решить обе проблемы.Это вилка из оригинального «android-maven-plugin», который я модифицировал месяц назад для своих собственных проектов Android.

Он также предоставляет патч для Proguard-4.7

Надеюсь, это поможет,Любые отзывы приветствуются.

3 голосов
/ 17 декабря 2013

Я нашел решение, которое может работать в некоторых ситуациях. Вместо ServiceLoader я использую класс / библиотеку org.openide.util.Lookup, поставляемую с NetBeans - это расширенный набор ServiceLoader. Он не требует самого NetBeans и, похоже, работает нормально с Eclipse. Необходимо заменить все функции ServiceLoader, которые вы используете в своем приложении, на эквиваленты Lookup и добавить библиотеку org-openide-util-lookup. Затем вы можете просто сделать что-то вроде этого:

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

UPDATE

После работы с этим в течение нескольких дней он, кажется, работает хорошо - я перемещаюсь между средами (стандартными Java и Android), и он работает правильно в каждом месте. Основным недостатком является необходимость вручную копировать файлы в каталог / services.

2 голосов
/ 23 апреля 2011

Это возможно. Вы можете проверить http://developer.android.com/reference/java/util/ServiceLoader.html

0 голосов
/ 23 апреля 2011

ServiceLoader - это материал из языка Java, который не очень актуален для Android. Я рекомендую не использовать его. Если вы просто хотите найти список классов в вашем .apk для загрузки, есть разные способы сделать это - поместить в файл XMl файл res / xml, в котором перечислены их, использовать отражение, аннотации и т. Д.

...