Использование serviceloader на android

Я очень новичок в разработке java и android и узнаю, что я пытаюсь начать с приложения для сбора статистики и информации, таких как munin. Я пытаюсь загрузить "плагины" в своем приложении. Эти плагины уже находятся в приложении, но я не хочу, чтобы они вызывали их все отдельно, но могли выполнять итерацию по ним. Я пытался использовать serviceloader, но никогда не мог получить META-INF/services в свой apk. Поэтому мне интересно, можно ли использовать serviceloader на android Благодаря
EDIT: Я спрашиваю о java.util.ServiceLoader, я думаю, что это нужно, но я не могу понять, как получить папку моих сервисов в META-INF на apk

Ответы

Ответ 2

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

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

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

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

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

Ответ 4

Я выяснил решение, которое может работать в некоторых ситуациях. Вместо 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

ОБНОВЛЕНИЕ

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

Ответ 5

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