Ответ 1
Существует открытый отчет об ошибке по этой проблеме. См. https://code.google.com/p/android/issues/detail?id=59658
Я очень новичок в разработке java и android и узнаю, что я пытаюсь начать с приложения для сбора статистики и информации, таких как munin. Я пытаюсь загрузить "плагины" в своем приложении. Эти плагины уже находятся в приложении, но я не хочу, чтобы они вызывали их все отдельно, но могли выполнять итерацию по ним. Я пытался использовать serviceloader, но никогда не мог получить META-INF/services в свой apk. Поэтому мне интересно, можно ли использовать serviceloader на android
Благодаря
EDIT: Я спрашиваю о java.util.ServiceLoader, я думаю, что это нужно, но я не могу понять, как получить папку моих сервисов в META-INF на apk
Существует открытый отчет об ошибке по этой проблеме. См. https://code.google.com/p/android/issues/detail?id=59658
Папка 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
Надеюсь, что это поможет, любая обратная связь приветствуется.
Это возможно. Вы можете проверить http://developer.android.com/reference/java/util/ServiceLoader.html
Я выяснил решение, которое может работать в некоторых ситуациях. Вместо 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.
ServiceLoader - это материал с языка Java, который не имеет особого отношения к Android. Я рекомендую не использовать его. Если вы просто хотите найти список классов внутри вашего .apk для загрузки, есть всевозможные способы сделать это - поместите в XMl файл в res/xml, который их перечисляет, используйте отражение, аннотации и т.д.