Подтвердить что ты не робот

Полная поддержка Android для пакетов OSGi

В этом разделе объясняется, как можно преобразовать инфраструктуру OSGI для работы на Android. Затем он дает советы по конвертации пакетов андроидов в виде пакетов OSGI, способных вызывать API android.

На нынешнем этапе единственное, чего не могут сделать эти пакеты Android OSGI, - это манипулировать действиями и использовать ресурсы и активы. Я постоянно работаю над этим ограничением. Я надеюсь получить хорошие новости по этому вопросу.

Мне было сложнее использовать объект проекта "Создать плагин" в Eclipse, чем преобразовать стандартные пакеты андроидов в пакеты OSGI, поэтому я не буду много говорить об этом.

Вы можете отслеживать мои достижения в разделе журнала в конце этого сообщения.

Я имею в виду Knopflerfish проекты, потому что это было основой для моей работы. Модификации должны выполняться в проектах и ​​проектах OSD для OSDi Knopflerfish, но на самом деле применимы к другим платформам OSGI. Нет необходимости в модификации самой структуры OSGi, мы обновим только проекты KfServiceLib и KfBasicApp в каталоге tool дистрибутива Knopflerfish.

Добавить базовую поддержку android для пакетов

Особенности и ограничения

Это первый уровень настройки рамки для Android. Эти изменения все равно не будут иметь ничего общего с контекстом или вызывающим потоком, но они позволяют использовать ограниченный набор классов API Android, например android.util.Log.

Благодаря этим изменениям, пакеты смогут использовать классы Android в своих прототипах и в их реализации. Тем не менее, они не будут иметь ничего общего с графическим интерфейсом пользователя, поставщиками контента и системными службами и т.д., Потому что им не хватает обязательных ссылок для него.

Изменения в приложениях Knopflerfish

Как они есть, приложения под инструментами /android/apk могут выполнять OSGi-фрейм на android, но только в том случае, если пакеты имеют только классы java. Это случай для пакетов, которые являются частью структуры Knopflerfish, но что из пользовательских пакетов, требующих вызова API android? Ниже перечислены изменения, которые необходимо внести в структуру, чтобы позволить пакетам разрешать классы андроида.

Во-первых, пакеты android должны быть частью пакетов фреймов, чтобы их можно было разрешить. Это цель свойства OSGi org.osgi.framework.system.packages.extra

Установите свойство в список пакетов android для экспорта, прежде чем создавать фреймворк, и вы настроены. Обратите внимание, что дикий char android.*, кажется, не имеет никакого эффекта: мы должны сообщать каждому пакету один за другим, как показано ниже.

Чтобы добавить к KfServiceLib в файл src/org/knopflerfish/android/service/KfApk.java

static final String ANDROID_FRAMEWORK_PACKAGES = (
            "android,"
            + "android.app,"
            + "android.content,"
            + "android.database,"
            + "android.database.sqlite,"
            + "android.graphics,"
            + "android.graphics.drawable,"
            + "android.graphics.glutils,"
            + "android.hardware,"
            + "android.location,"
            + "android.media,"
            + "android.net,"
            + "android.net.wifi,"
            + "android.opengl,"
            + "android.os,"
            + "android.provider,"
            + "android.sax,"
            + "android.speech.recognition,"
            + "android.telephony,"
            + "android.telephony.gsm,"
            + "android.text,"
            + "android.text.method,"
            + "android.text.style,"
            + "android.text.util,"
            + "android.util,"
            + "android.view,"
            + "android.view.animation,"
            + "android.webkit,"
            + "android.widget");

Затем мы устанавливаем дополнительные пакеты в KfApk.newFramework()

  config.put(Constants.FRAMEWORK_STORAGE, fwDir);

  // Export android packages so they can be referenced by bundles
  config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
    ANDROID_FRAMEWORK_PACKAGES);

Примечание: если вы можете, лучше установить дополнительную конфигурацию с файлом, а не с кодом в программе.

Импорт пакетов Android в пакеты

Даже если пакеты android были добавлены к системным пакетам, объявленным инфраструктурой, пакет еще должен импортировать их для разрешения, как и любой другой импортированный пакет.

Пример:

Импорт-пакет: org.osgi.framework, android.content, android.widget, android.util

Примечание: вы можете использовать кнопку "auto" плагина Knopflerfish Eclipse для автоматического обновления импорта, как и должно быть.

Передайте контекст в пакеты

Другие изменения в приложениях Knopflerfish

После этих изменений вы сможете запускать пулы, запуская свои действия самостоятельно или получать доступ к ресурсам контекста. Затем весь набор классов API Android должен быть полностью доступен для пакетов. Но для достижения этого существуют ограничения, связанные с кодированием пакетов. Все, что нам нужно, это ссылка на приложения Context, поэтому мы собираемся подталкивать ее в рамки!

Чтобы добавить в org.knopflerfish.android.service.Knopflerfish.onStartCommand()

if (fw != null) {
  // Register the application context as an OSGi service!
  BundleContext bundleContext = fw.getBundleContext();
  regContext = bundleContext.registerService(Context.class,
    getApplicationContext(), new Hashtable());

  sendMessage(Msg.STARTED, (Serializable) KfApk.getFrameworkProperties());
} else {
  // framework did not init/start
  sendMessage(Msg.NOT_STARTED);
  stopSelf();
  return;
}

Мы передаем контекст приложений и только этот, потому что это единственный Контекст, который будет существовать на протяжении всего срока службы приложения. Он будет установлен сразу после запуска приложения, то есть после установки или загрузки системы. Связки могут поддерживать сильную ссылку на этот контекст, это нормально.

Как пакеты используют контекст

Пакет получает Context из BundleContext, переданного его активатору:

static Context context;

public void start(BundleContext bc) throws Exception {
  ServiceReference<Context> ref = bc.getServiceReference(Context.class);
  context = bc.getService(ref);
}

Поскольку пакет работает в другом потоке, чем поток пользовательского интерфейса, операции пользовательского интерфейса могут выполняться только в том случае, если "нажимаются" на поток пользовательского интерфейса. Для этого целесообразно разработать метод многоразового использования следующим образом:

public static void runOnContext(Context context, Runnable runnable) {
    Handler handler = new Handler(context.getMainLooper());
    handler.post(runnable);
}

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

Например, этот пакет показывает "Hello" при запуске:

public void start(BundleContext bc) throws Exception {
  ServiceReference<Context> ref = bc.getServiceReference(Context.class);
  final Context context = bc.getService(ref);

  runOnContext(context, new Runnable() {
    public void run() {
      Toast.makeText(context, "Hello", Toast.LENGTH_LONG).show();
    }
  });
}

Дешевый способ использования приложений, таких как пакеты

Я буду ссылаться на APK, преобразованный в пакет OSGI, в качестве краткого пакета APK.

  • Создайте обычный APK, например, благодаря проекту Eclipse Android Project
  • Добавить запись справочной библиотеки в проект Построение пути для вашей среды OSGi (в моем случае framework.jar)
  • Отредактируйте файл манифеста пакета bundle.manifest, описывающий комплект (см. пример ниже). Этот файл не является частью APK, но будет использоваться во время пользовательских шагов сборки.
  • Скажите, что ваш пакет приложений com.acme.helloworld (это значение задано с манифестом: пакет в AndroidManifest.xml), ваш комплект OSGI класса Activator MUST будет помещен в пакет com.acme.helloworld, а вы ДОЛЖЕН установить Bundle-SymbolicName: com.acme.helloworld в манифесте связки. Если какое-либо из этих условий не выполняется, это приведет к java.lang.NoClassDefFoundError во время выполнения.

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

Manifest-Version: 1.0
Bundle-Vendor: Acme
Bundle-Version: 1.0.0
Bundle-Name: HelloWorldBundle
Bundle-ManifestVersion: 2
Bundle-Activator: com.acme.helloworld.Activator
Bundle-Description: Hello World Bundle
Import-Package: org.osgi.framework
Bundle-SymbolicName: com.acme.helloworld
Bundle-RequiredExecutionEnvironment: OSGi/Minimum-1.0
  • Используйте Android-инструменты > Экспорт Unsigned Android Package
  • Скопировать bundle.manifest в сгенерированном без знака APK как META-INF/MANIFEST.MF
  • Подпишите APK, используя любой желаемый сертификат. Здесь у вас есть готовый пакет APK
  • Установите APK как обычно. Для того, чтобы разрешить работу, требуется установка. Без этого активность не будет разрешаться, и пакет не сработает.
  • Загрузите платформу OSGi и запустите пакет APK (тот же файл APK)

Чтобы начать работу с APK пакета, используйте следующий код.

// This is the application context provided by the framework
// Context ctx = ...

Intent intent = new Intent();
String pkgName = YourActivity.class.getPackage().getName();
String clssName = YourActivity.class.getName();
intent.setClassName(pkgName, clssName);

// You may add the NEW_TASK flag
intent.addFlag(Intent.FLAG_ACTIVITY_NEW_TASK);

// Important: do not use startActivity(Context, Class) version because it will fail to resolve the activity
ctx.startActivity(intent);

Журнал

Начальное

В этот момент моих усилий собираются андроиды:

  • может вызывать классы SDK для Android до тех пор, пока они не требуют ресурсов или объявление в AndroidManifest.xml,
  • имеют доступ к приложению android.content.Context, который можно использовать для запуска действий из среды OSGi.

Связки не могут:

  • запросить разрешение для Android,
  • строить действия из макета даже не запускать их вообще,
  • определить статический широковещательный приемник, объявленный в AndroidManifest.xml, хотя получатель, созданный с помощью кода, должен быть прав.

Это для ограничений, которые я испытал до сих пор, которые я пытаюсь преодолеть, и цели моего запроса о помощи.

На что я нацелен:

  • имеют поддержку внутренних ресурсов, особенно макетов,
  • иметь возможность создавать и запускать внутренние действия, по коду, если это невозможно для XML-конструктора.

Каковы мои достижения до сих пор, через испытания:

  • Создайте проект android как пакет OSGi и APK/android, смешав Builders, экспортировав неподписанные двоичные файлы и вручную сменив bundle.manifest в MANIFEST.MF перед тем, как подписаться с jarsigner. В результате APK загружается фреймворком OSGi и переходит к разрешенному состоянию, но не может запускаться из-за java.lang.NoClassDefFoundError в моем классе активатора, даже если класс является частью класса .dex и нет явной ошибки на пути. Создание проекта в виде пакета OSGi с зависимостями android получает доступ к активатору, но не к ресурсам android в JAR. Непонятные.
  • Подтвердите все функции, описанные в разделе "сделать" этого руководства.

Редактировать 2013-09-03

Я нашел способ начать работу, принадлежащую пакетам android. См. Соответствующую главу.

Редактировать 2013-09-10: общий контейнер для платформы OSGI

Через несколько дней я разработал универсальные программы Knopflerfish для запуска любой инфраструктуры OSGi, которую я хочу. Например, я сейчас запускаю Knopflerfish или Felix одинаково. По-прежнему существует необходимость в конкретной конфигурации конфигурации.

Это означает, что тема больше не является Knopflerfish, даже если необходимые программы были выпущены Knopflerfish.

2013-09-27: сравнение состояния и каркасов

Я должен отложить этот проект в течение некоторого времени из-за изменения приоритета. Однако до сих пор я оценивал следующие решения:

  • Knopflerfish OSGi [Open source],
  • Felix и FelixDroid [Open source],
  • ProSyst mBS SDK (использование на основе равноденствия, коммерческое использование)

Подводя итог, ни один из них не имеет четкого преимущества, когда речь заходит о поддержке графического интерфейса: ни один из них не может обрабатывать ресурсы или ресурсы (строки, макеты, изображения) на пути android, но вы все равно можете обрабатывать их как OSGi ресурс с OSGi API, но вы не сможете использовать их в андроиде, как обычно.

Мне лично нравится консоль консоли администрирования Knopflerfish, но его поддержка GUI ни к чему. Felix + FelixDroid имеет хороший баланс для бесплатного решения OSGi, тогда как mBS SDK поддерживает большое количество различных целей VM и определяет платформу приложений, основанную на намерениях, которая может пригодиться профессиональным разработчикам.

В то время как Knopflerfish и Felix используются почти одинаково, mBS SDK во многом отличается. Knopflerfish и Felix меняются: я написал контейнерную программу, в которой выбор OSGi-рамки - это только вопрос выбора другой зависимости JAR от руки!

Когда дело доходит до GUI, Knopflerfish ничего не дает. Вам нужно будет ознакомиться с моими рекомендациями, чтобы получить дополнительную поддержку. Основная идея в FelixDroid хороша, на самом деле это что-то подобное реализовано в SDK mBS, но это немного пустая трата, чтобы не реализовать реализацию как пакет. Более того, mBS SDK сделал это более красиво, определив платформу приложений OSGi, начатую конкретными намерениями. Оба интегрируют представления в основную деятельность примерно таким же образом.

Еще одна ошеломляющая разница в mBS SDK - вам не нужно добавлять зависимости платформы Android и не добавлять директивы Import-Package для них в ваших пакетах. Это, безусловно, вызывает беспокойство, когда на некоторое время полагается на Knopflerfish или Felix. Кроме того, он полностью интегрирован в Eclipse и предоставляет разработчику множество удобных задач: ПК для мониторинга OSGi-инфраструктуры (Kf и Felix предоставляют только консоль администрирования) и быстрое развертывание. Ямы, по существу, не являются свободными и что приложение-контейнер практически невозможно настроить.

4b9b3361

Ответ 1

Я нашел по чистой случайности некоторую перспективную среду Open Source (Apache License 2), которая может представлять интерес. Он называется DEMUX Framework. Не стесняйтесь оценить это решение. Я не сам, но просматриваю функции и исходный код, позвольте мне подумать, что у него хороший потенциал и аккуратная интеграция. Что касается поддержки графического интерфейса, в нем используется подход, похожий на FelixDroid. Это может стать альтернативой Open Source для SDK Prosyst mBS.

Вот как его дизайнер определяет структуру:

DEMUX Framework упрощает создание Java-разработчиков приложения для настольных, веб-и мобильных устройств из одного кода база. Он обеспечивает модульную архитектуру приложений на основе OSGI, что позволяет легко создавать надежные и расширяемые приложения.

Однако Android - это единственная мобильная ОС, поддерживаемая на этом этапе, и я желаю ему удачи для двух других (у меня были некоторые болезненные переживания в прошлом на эту тему)