410013796724260
• Webmoney
R335386147728
Z369087728698
Android и OSGI-фреймворк FelixВопросу использования OSGI-фреймворка в java-приложениях на сайте уделено достаточно внимания. Целый раздел, насыщенный различными примерами, посвящен описанию данной технологии. Кроме этого, в разделе описания платформы Jabricks Вы можете найти примеры использования данной технологии и скачать как фреймворк Felix, так и готовые OSGI-бандлы для платформы Jabricks. Поэтому в данной статье я не буду касаться самой OSGi технологии, а приведу только пример использования OSGI-фреймворка в Android-приложении. В качестве OSGI-фреймворка используем в нашем примере Felix (org.apache.felix.framework-6.0.3.jar). Данный фреймворк используется в приложении JaBricks. Создание модуляСоздадим модуль/пример p13osgi; процесс создания модуля описан здесь. На следующем скриншоте представлена структура модуля, который будем использовать в качестве примера andriod-приложения с OSGi-фреймворком. В структуру модуля изменений никаких вносить не будет. Подключение фреймворка выполним в активности MainActivity. Для того, чтобы IDE Android Studio могла увидеть фреймворк и не «ругалась» в интерфейсе я подключил jar-файл/библиотеку org.apache.felix.framework-6.0.3.jar как модуль. На скриншоте данный модуль/фреймворк представлен в первой позиции. Подключение фреймворкаДля подключения jar-библиотеки как модуля необходимо выполнить следующие шаги :
После того, как Android Studio создаст модуль org.apache.felix.framework-6.0.3, классы библиотеки будут доступны в редакторе IDE. Листинг активности MainActivityНиже представлен листинг активности MainActivity. Чтобы не загромождать описание класса код метода launchFramework(), выполняющего загрузку фреймворка, рассмотрен отдельно. Добавленные в листинг комментарии делают код класса более понятным. Дополнительные разъяснения, на мой взгдяд, будут лишними. На что следует обратить внимание в листинге? На класс Bundle. Согласно OSGi-технологии каждый модуль (jar-файл), включая и фреймворк, рассматриваются в приложении как бандл, обязательно содержащий активатор с методами start/stop. Основой создаваемых при инициализации OSGi бандлов (jar-файлов) является класс org.osgi.framework.Bundle, имеющий активатор типа org.osgi.framework.BundleActivator. Каждый активатор при старте получает контекст org.osgi.framework.BundleContext, используя который модуль может достучаться до остальных бандлов фреймворка. Все эти классы располагаются в модуле org.apache.felix.framework-6.0.3.jar. В листинге активности мы видим, что методу создания onCreate в качестве параметра передается бандл типа android.os.Bundle; но это другой бандл, ничего не имеющий общего с OSGi. import java.io.File; import java.io.IOException; import java.util.Map; import java.util.HashMap; import android.util.Log; import android.os.Bundle; import android.widget.TextView; import org.apache.felix.framework.Felix; import org.osgi.framework.BundleContext; import android.support.v7.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { TextView label = null; // Метка интерфейса Felix m_felix = null; // Фреймворк Felix String LOG_TAG_Felix = "Felix"; // Тег сообщений @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // создание GUI setContentView(R.layout.activity_main); // Определение метки label = findViewById(R.id.label); label.setText(""); // логирование старта logMessage("Start example"); // Старт фреймворка launchFramework(); } public void logMessage(final String info) { Log.d("Felix", info); if (label != null) label.setText(label.getText() + info + "\n"); } private void launchFramework() { // исходный код представлен ниже } } В методе активности logMessage выполняется протоколирование записей с использованием Logcat. Каждое протоколируемое сообщение дополнительно выводится на экран устройства. Подключение и старт фреймворка FelixВ методе старта фреймворка launchFramework() сначала выполняется подготовка набора данных configMap типа Map<String, String>. Конструктору Felix подготовленный набор данных. Если объект фреймворка m_felix создан без каких-либо исключений, то выполняется старт фреймворка. После этого выполняется вывод в консоль и на экран устройства списка загруженных бандлов в виде наименований их SymbolicName и версии. В нашем случае список включает только один бандл – это фреймворк, который в списке всегда первый. private void launchFramework() { String cacheDir = null; try { cacheDir = File.createTempFile("bundles-cache", ".tmp").getParent(); } catch (IOException e) { Log.d(LOG_TAG_Felix, "Unable to create temp file", e); return; } // Определение свойств Map<String, String> configMap; configMap = new HashMap<String, String>(); configMap.put("org.osgi.framework.storage", cacheDir); configMap.put("felix.embedded.execution", "true"); try { logMessage("Create framework Felix"); m_felix = new Felix(configMap); logMessage("Framework Felix created"); logMessage("Start Felix"); m_felix.start(); logMessage("Felix is started"); BundleContext context; org.osgi.framework.Bundle[] bundles; context = m_felix.getBundleContext(); bundles = context.getBundles(); logMessage("Bundles list : "); for (org.osgi.framework.Bundle b : bundles) logMessage("\t" + b.getSymbolicName() + "-" + b.getVersion().toString()); } catch (Throwable ex) { Log.d(LOG_TAG_Felix, "Could not create framework ...", ex); } } Старт примераПосле старта примера Android Studio представит в интерфейсе выбранное устройство, на экран которого будут выведены сообщения и «символическое» наименование фреймворка и его версия. ПротоколированиеВ системе протоколирования зарегистрированы следующие сообщения. 2020-04-06 23:41:35.662 3626-3626/com.android.test.p13osgi \ D/Felix: Start application 2020-04-06 23:41:35.663 3626-3626/com.android.test.p13osgi \ D/Felix: Create framework Felix 2020-04-06 23:41:35.801 3626-3626/com.android.test.p13osgi \ D/Felix: Framework Felix created 2020-04-06 23:41:35.802 3626-3626/com.android.test.p13osgi \ D/Felix: Start Felix 2020-04-06 23:41:36.178 3626-3626/com.android.test.p13osgi \ D/Felix: Felix is started 2020-04-06 23:41:36.178 3626-3626/com.android.test.p13osgi \ D/Felix: Bundles list : 2020-04-06 23:41:36.178 3626-3626/com.android.test.p13osgi \ D/Felix: org.apache.felix.framework-6.0.3 Создание apk-файлаДанный пример используется на странице Создания apk-файла в Android Studio, где также рассматривается структура файла. |