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