Афоризм
Я все отдам. Но где мне это взять?
Наталья Резник
Последние статьи

 • Домашние финансы
Приложение учета домашних финансов
 • Сохранение значений
Сохранение и восстановление значений компонентов
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • Android и OSGi
Старт OSGi-фреймворка Felix в android устройстве
 • Загрузка драйвера
Динамическая загрузка JDBC-драйвера
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
 • уроки JaBricks
Учебные примеры изучения платформы Jabricks
 • бандл 'О программе'
Модуль представления инфо о программе
 • бандл form-currencies
Модуль управления справочником валют
 • бандлы JaBricks
Бандлы приложения JaBricks
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  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-библиотеки как модуля необходимо выполнить следующие шаги :

  • создать в проекте/модуле поддиректорию p13osgi/libs и разместить в ней фреймворк org.apache.felix.framework-6.0.3.jar;
  • в IDE Android Studio открыть диалоговое окно «Create New Module» (File/Module/New) и выбрать тип «Import JAR/.AAR Package», нажать «»Next и перейти к следующему шагу;
  • в следующем диалоговом окне (см. скриншот) выберете файл и нажмите «Finish».

После того, как 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, где также рассматривается структура файла.

  Рейтинг@Mail.ru