3

Я искал способ внедрения плагинового приложения для Android и нашел this great article, описывая сервисный подход к плагинам.Архитектура плагина с помощью сервисных альтернатив

Мои цели в попытке этот сервис на основе плагина архитектуры были:

  1. Избегайте статического подключения дополнительного модуля («плагин») к основному приложению.
  2. Избегайте распространения исходного кода основного приложения или библиотеки.
  3. При необходимости передайте основное приложение/библиотеку через Proguard, защищая ключевые части.

сервис-ориентированный подход соответствует цели # 1 очень хорошо, но когда дело доходит до цели # 2 и # 3, я нахожусь в бесконечном цикле (т.е. «чеканка мой хвост»):

Демонстрационная версия плагина на основе сервисов, реализованная в статье, отлично работает, потому что ... она возвращает встроенные типы (см. IBinaryOp.aidl).

Но в моем приложении реального мира, мне нужно вернуть свои классы, некоторые из которых являются сложными и включают в себя «коммерческие секреты».

Является ли это курицей & Яйцо, в какой ситуации, независимо от того, что я делаю, мне всегда придется выставлять некоторые из моих основных классов?

Или эта проблема разрешима? (? Обходной путь действительно)

Один из способов я рассматриваю для решения этого является использование интерфейсов для моих классов-к-быть возвращены, с помощью самой службы и так:

  1. В плагин (написанный другими) по-прежнему должен знать о моем пространстве имен и, следовательно, мне понадобится JAR в библиотечном проекте в времени сборки, но он не будет иметь никакого доступа к исходному коду реализации.
  2. Я могу разделить мой текущий монолитный библиотечный проект на 2 JAR: один, содержащий только интерфейсы, а другой даже не выпущенный как JAR, а скорее часть APK моего приложения.

Я думаю в правильном направлении? Или вы заметили некоторые заблуждения?

Есть ли более эффективные способы решения этой проблемы?

Есть ли там демо-проекты, которые уже успешно справились с этой задачей (т. Е. Все 3 цели, описанные выше) и могут использоваться как справочник или учебник?

ответ

4

Есть ли более эффективные способы решения этой проблемы?

Вы должны отправить AIDL в исходной форме. Это является интерфейсом. Вам не нужно тогда отдельно иметь еще один слой интерфейсов. Реализация классов Java, упомянутых в AIDL, может быть в JAR.

Это говорит о том, что дикие лошади не могли заставить меня делать то, что вы делаете, из-за управления версиями.

Если вы не планируете удерживать своих сторонников под прицелом, вы не можете заставить их обновлять свои версии вашего JAR. Таким образом, вы либо:

  • никогда не удается изменить эти классы, или

  • Придется очень тщательно управления версиями, такие как имеющие отдельные IPC оконечных за версию, так что ваш основной код может работать с произвольным версии кода сторонних с произвольными версиями вашего JAR

есть демо-проекты, которые там уже решаемые этот вызов (т. все 3 цели, описанные выше) успешно и могут использоваться в качестве справочной или учебной программы?

Ваши цели могут быть достигнуты с помощью любого из IPC механизмов платформы Android:

  • Bound службы с помощью пользовательских классов, как вы предлагаете
  • Bound обслуживание с использованием только акции классов, как String и List и Bundle
  • Командная схема с услугами (т.е. передача команд через startService())
  • Радиовещание Intents
  • ContentProviders
  • Деятельность

Суть вашего трудность заключается в таком предположении:

Мне нужно вернуть мои собственные классы

Я бы полностью перевернуть, что вокруг , чтобы: вы должны придерживаться стандартных классов Android для фактического IPC, те, которые вы и сторонний код распознаете как и иметь возможность работать.

У вас все еще есть управление версиями, которое вам нужно сделать, но это более привычная логика «дезинфекции ваших входов», как вы это делаете с любым веб-сервисом или другим открытым API. И если вы хотите отправить какой-то «вспомогательный» код, источник или JAR, чтобы упростить использование вашего API, это здорово, потому что вы больше не зависите от конкретной версии этих классов в JAR.

Что касается «демонстрационных проектов», это полностью зависит от того, какого типа API вы пытаетесь создать.

+0

Спасибо за подробный ответ. Я буду изучать его на некоторое время, прежде чем принимать решение об оптимальном подходе в моем случае. Возвращение только классов акций потребует перепроектирования и повторной записи значительной части моей библиотеки. И спасибо за советы относительно управления версиями, вы определенно заставили меня думать ... – sfinja

Смежные вопросы