问题标签 [knopflerfish]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 对 OSGi 捆绑包的完整 Android 支持
本主题说明如何转换 OSGI 框架以在 android 上运行。然后它给出了将 android 包转换为能够调用 android API 的 OSGI 包的提示。
在当前阶段,这些 Android OSGI 捆绑包唯一不能做的就是操纵活动并使用资源和资产。我一直在努力解决这个限制。我希望有关于这个问题的好消息。
我发现在 Eclipse 中使用 Create Plugin 项目工具比将标准 android 包转换为 OSGI 包更难,所以我不会多谈。
您可以在此消息末尾的日志部分跟踪我的成就。
我指的是Knopflerfish项目,因为它是我工作的基础。这些修改旨在在Knopflerfish OSGi android 项目上执行,但实际上适用于其他 OSGI 框架。不需要修改 OSGi 框架本身,我们只会更新项目KfServiceLib
和Knopflerfish 发行版KfBasicApp
的tool
目录。
为捆绑包添加基本的 android 支持
特点和限制
这是android框架的第一级定制。这些更改与上下文或调用线程无关,但它们允许使用一组有限的 android API 类,如android.util.Log
.
由于这些变化,bundle 将能够在其原型和实现中使用 android 类。然而,它们将无法与图形用户界面、内容提供者和系统服务等相关,因为它们缺乏对它的强制性引用。
Knopflerfish 应用程序的变化
实际上,tools/android/apk 下的应用程序能够在 android 上执行 OSGi 框架,但前提是捆绑包仅调用 java 类。作为 Knopflerfish 框架一部分的包就是这种情况,但是想要调用 android API 的自定义包呢?以下是在框架中进行的更改,以使捆绑包能够解析 android 类。
首先,android 包必须是框架包的一部分,这样它们才能被解析。这是 OSGi 属性的目的org.osgi.framework.system.packages.extra
在创建框架之前将属性设置为要导出的 android 包列表,然后您就设置好了。请注意,wild charandroid.*
似乎没有任何作用:我们必须像下面这样一个一个地告诉每个包。
添加到KfServiceLib
文件 src/org/knopflerfish/android/service/KfApk.java
然后我们将额外的包设置在KfApk.newFramework()
备注:如果可以的话,最好用文件而不是程序中的代码来设置额外的配置。
以包的形式导入 android 包
即使 android 包被添加到框架声明的系统包中,bundle 仍然必须导入它们才能解析,就像任何其他导入的包一样。
例子:
导入包:org.osgi.framework、android.content、android.widget、android.util
备注:您可以使用 Knopflerfish Eclipse 插件的“自动”按钮自动更新导入,就像它们应该的那样。
将上下文传递给捆绑包
Knopflerfish 应用程序的更多变化
在这些更改之后,您应该能够运行捆绑包自行启动活动或访问上下文的资源。整套 android API 类应该对 bundle 完全可用。但是有一些限制适用于捆绑编码来实现这一点。我们所需要的只是应用程序上下文的引用,所以我们将把它推送到框架中!
添加到org.knopflerfish.android.service.Knopflerfish.onStartCommand()
我们正在传递应用程序的上下文,并且只有这个,因为它是应用程序整个生命周期中唯一存在的上下文。它将在应用程序启动后立即设置,这意味着在安装或系统启动之后。捆绑包可以在此上下文上保持强引用,这很好。
捆绑包如何使用上下文
一个包Context
从BundleContext
传递给它的激活器中获取:
由于包在与 UI 线程不同的线程中运行,因此 UI 操作只能在 UI 线程上“推送”时执行。为此,明智的做法是设计一个可重用的实用程序方法,如下所示:
此方法应该是实用程序包中服务的一部分,因为它应该由许多不同的 android 包以相同的方式访问。
例如,这个包在开始时显示“Hello”:
使用捆绑软件等应用程序的廉价方法
我将把转换为 OSGI bundle 的 APK 简称为bundle APK。
- 创建一个常规的 APK,这要归功于 Eclipse Android Project
- 将参考库条目添加到OSGi 框架的项目构建路径(在我的例子中是 framework.jar)
- 编辑描述包的包清单文件
bundle.manifest
(参见下面的示例)。此文件实际上不是 APK 的一部分,但将在自定义构建步骤中使用 - 假设您的应用程序包是
com.acme.helloworld
(此值通过 AndroidManifest.xml 中的 manifest:package 设置),您的 OSGI 包的 Activator 类必须放在包中com.acme.helloworld
,并且您必须Bundle-SymbolicName: com.acme.helloworld
在包清单中设置。如果不满足这些条件中的任何一个,则将导致java.lang.NoClassDefFoundError
运行时运行。
提醒一下,您的捆绑清单文件应如下所示:
- 使用Android 工具 > 导出未签名的 Android 包
- 将
bundle.manifest
生成的未签名 APK 复制为META-INF/MANIFEST.MF
- 使用您想要的任何证书对 APK 进行签名。在这里,您已准备好捆绑包 APK
- 像往常一样安装捆绑包 APK。需要安装才能解决这些活动。没有这个,活动将无法解决,并且捆绑包将失败
- 让 OSGi 框架加载并启动捆绑 APK(相同的 APK 文件)
要从捆绑包 APK 启动 Activity,请使用以下代码。
日志
最初的
在我努力的这一点上,android捆绑了:
- 可以调用android SDK类,只要它们不需要AndroidManifest.xml中的资源或声明,
- 可以访问应用程序的
android.content.Context
,可用于在 OSGi 框架之外启动活动。
捆绑包不能:
- 请求安卓权限,
- 从布局构建活动甚至根本不启动它们,
- 定义静态广播接收器,在 中声明
AndroidManifest.xml
,尽管由代码实例化的接收器应该没问题。
这是我迄今为止所经历的限制,我试图克服这些限制以及我寻求帮助的目标。
我的目标是:
- 支持内部资源,尤其是布局,
- 如果 XML 构建器不可能,则能够通过代码创建和启动内部活动。
到目前为止,我通过试验取得了哪些成就:
- 通过混合构建器、导出未签名的二进制文件并
bundle.manifest
在使用jarsigner
. 结果是 APK 由 OSGi 框架加载并达到已解决的状态,但由于我的激活器类而无法启动java.lang.NoClassDefFoundError
,即使该类是 classes.dex 的一部分并且路径上没有明显错误. 使项目成为具有 android 依赖项的 OSGi 包可以访问激活器,但不能访问 JAR 中的 android 资源。令人费解。 - 验证本指南“可以做”部分中描述的所有功能。
编辑 2013-09-03
我找到了一种启动 android 捆绑包拥有的活动的方法。见相应章节。
编辑 2013-09-10:通用 OSGI 框架容器
几天后,我使 Knopflerfish 程序成为通用的,可以运行我想要的任何 OSGi 框架。例如,我目前正在以相同的方式运行 Knopflerfish 或 Felix。仍然需要特定的框架配置。
这意味着主题不再仅仅是 Knopflerfish,即使所需的程序是由 Knopflerfish 发布的。
2013-09-27:状态和框架整体比较
由于优先级的变化,我不得不把这个项目搁置一段时间。但是,到目前为止,我评估了以下解决方案:
- Knopflerfish OSGi [开源],
- Felix 和 FelixDroid [开源],
- ProSyst mBS SDK(基于 Equinox,商业用途)
总而言之,它们在 GUI 支持方面都没有一个明显的优势:它们都不能以 android 方式处理资产或资源(字符串、布局、图像),但您仍然可以将它们作为 OSGi 资源使用OSGi API,但您将无法像往常一样在 android 中使用它们。
我个人喜欢 Knopflerfish 的管理控制台 servlet,但它的 GUI 支持一无所获。Felix + FelixDroid 为免费的 OSGi 解决方案提供了良好的平衡,而 mBS SDK 支持大量不同的 VM 目标,并定义了一个基于意图的应用程序框架,可能更适合专业开发人员的口味。
虽然 Knopflerfish 和 Felix 的使用方式几乎相同,但 mBS SDK 在许多方面都非常不同。Knopflerfish 和 Felix 是可互换的:我编写了一个容器程序,其中选择 OSGi 框架只是选择不同的手工制作的 JAR 依赖项!
在 GUI 方面,Knopflerfish 几乎一无所获。您需要阅读我的指南才能获得更多支持。FelixDroid 的主要思想是好的,它实际上是在 mBS SDK 中实现的类似的东西,但是没有将实现作为一个包有点浪费。更重要的是,mBS SDK 通过定义一个由特定意图启动的 OSGi 应用程序框架,做得更好。两者都以相同的方式将视图集成到主要活动中。
mBS SDK 的另一个惊人区别是您不需要添加 android 框架依赖项,也不需要在包中为它们添加 Import-Package 指令。在依赖 Knopflerfish 或 Felix 一段时间后肯定会感到不安。它还完全集成在 Eclipse 中,为开发人员提供了许多方便的任务:PC 到目标 OSGi 框架监控(Kf 和 Felix 仅提供目标管理控制台)和快速部署。这些坑本质上是不是免费的,容器应用程序几乎不可能定制。
android - Android 中的 Knoflerfish - 捆绑启动失败
我按照本教程将 OSGi 嵌入到我的 Android 应用程序中。然而,在安装和启动一个包之后,它的状态变成了 RESOLVED (4),而不是 ACTIVE (32),因为它必须是。当我尝试再次启动时,它会引发异常:
此捆绑包是来自Knopflerfish 示例源的示例捆绑包。安装在 Knopflerfish destop (framework.jar) 中时效果很好
已经想到了dex,但是合并jar文件和它的dex文件没有用,还是不行。
这里有什么问题?非常感谢!
java - Android 上 Knopflerfish 上的 Pax Web
我计划从OSGi
带有 Web 服务的 Android 开始,其中我将能够在 Android 浏览器上运行 Java Server Pages (jsp) 和 Java Servlet。
我的第一步是Knopflerfish
在 Android 上安装。我从 knopflerfish 遵循了本教程:http ://www.knopflerfish.org/releases/5.0.0/docs/android_dalvik_tutorial.html
Knopflerfish 做得很好,我在 Android 手机的浏览器上看到了 localhost:8080。
我的第二步是安装Pax Web
在也安装在 Android 上的 Knopflerfish 上。我也从这里遵循了他们的教程:http ://www.knopflerfish.org/kf_pax_web_tutorial.html
教程说:
卸载 KF HTTP 包
第一步是停止 HTTP 根包并卸载 JSDK 和 HTTP-server 包,因为 PaxWeb 将接管此功能。通常,您很可能还想卸载 HTTP-root-bundle,但在本教程中,我们将保留它的安装状态。确保在进行下一步之前刷新包。
然后:
安装 PaxWeb
第二步是从 PaxWeb 安装并启动以下包。
- pax-web-jsp-1.0.2.jar(安装)
- pax-web-jetty-bundle-1.0.2.jar(安装和启动)
- pax-web-extender-war-0.8.0.jar(安装和启动)
捆绑包Pax Web
已成功安装。
问题
Pax Web
无法启动捆绑包。
当我尝试启动HTTP-root-IMP
它是一个 Knopflerfish 包时,它在控制台上给了我这个错误消息。
另一个是我Pax Web
将从 Knopflerfish 的教程中启动捆绑包。在这里,我尝试开始pax-web-jetty-bundle-1.0.2.jar (OPS4J Pax Web - Jetty Bundle)
:
最后,当我尝试运行pax-web-extender-war-0.8.0.jar (OPS4J Pax Web - Extender - War)
此错误消息时,也会出现:
我也尝试启动pax-web-jsp-1.0.2.jar (OPS4J Pax Web - Jsp Support)
显示此错误消息:
根据我从错误消息中了解到的情况,捆绑包正在寻找这些包。有什么办法可以解决这个问题,并能够使用 OSGi 框架在 Android 上成功运行 Java Web 应用程序?
osgi - OSGI 捆绑延迟激活
我对这个(OSGI)真的很陌生,试图做一些简单的例子。我不能让懒惰的行动起作用。我知道有一些 Blueprint impl 可以解决此类问题,但在继续使用之前,我认为学习一些基础知识会很好。
好的,我已经更改了代码,但仍然没有运气。
外部应用程序,安装包,启动框架,然后只启动 DataServiceClient 包。无法访问任何捆绑类。
这是 DataServiceClient 的开始:
这是“DataService”包中的 DummyService 类。
这是“DataService”包的开始:
我得到的输出:
但是我希望看到:
来自http://www.osgi.org/Design/LazyStart的一个小例子
延迟激活
延迟激活是一种生命周期策略,它要求必须在第一次成功请求从该包加载类时激活包。
但是,由于它不起作用,我想我完全误解了延迟激活的概念,或者我做错了什么。
除非我为 DataService 包显式调用 start ,否则它似乎不会为 DataService 包调用 Activator.start 。这就是我没有得到atm的东西。
谢谢你的时间
java - 如何正确使用 BundleSignerCondition 并管理密钥以基于捆绑签名创建安全的 OSGI 环境?
所以这是我的问题:我正在尝试基于捆绑签名创建一个安全的 OSGI (knopflerfish 5.0.0) 环境。我有一个使用条件权限管理服务并使用策略文件更新策略表的管理包。基于捆绑包位置的权限一切正常:位于«沙箱»文件夹中的所有捆绑包都具有受限权限,其他捆绑包具有所有权限。但我也想授予具有特定签名的捆绑包的所有权限,不管它们的位置如何。所以这是我的政策文件:
所以理论上,沙盒文件夹中的包不能使用 System.exit(),除了由 Orange 签名的具有所有权限的包。我创建了 2 个相同的包,一个未签名,另一个由 jarsigner 使用此专有名称(使用 keytool 创建)签名:
X.509, CN=Martinelli Bastien, OU=test, O=Orange, L=Meylan, ST=RA, C=FR (key)
但是当我尝试调用 System.exit() 时,这两个包会引发安全异常。
我试图更改我的 BundleSignerCondition 中的过滤器但没有效果。现在我认为这是关于 knopflerfish 中默认密钥库的配置或类似的东西。
你知道它有什么问题吗?
osgi - OSGi 初始供应实施
我正在寻找纲要规范的初始配置部分的实现。
我看到 Apache Felix 没有提供。Knopflerfish 提供了一个专业版。我看到 Equinox 提供了一种实现,但我想知道是否可以将它与运行在 Apache Felix 之上的 OSGi 应用程序集成。
我也想知道为什么 Apache Felix 不提供这样的实现?社区已经采用了初始配置的替代方案吗?
谢谢,米凯尔
java - OSGI 容器标识 Equinox / knopflerfish 以及 Equinox osgi jar 和 core osgi jar 之间的关系
问题1:-
我正在做一个大量使用 OSGI 的项目。我是 OSGI 的新手。在我的项目中,我看到了 Equinox 和 knopflerfish / 和/或 knopflerfish 包的 JARS。
问题2:-
如何在 Equinox 和 Knoplerfish 中确定 OSGI 在我的项目中使用哪个容器?我假设 OSGI 不能同时使用这两个容器。
问题3:-
此链接提到 Equinox 框架需要 org.eclipse.osgi_<version>.jar
实现 OSGI 核心。这是否意味着它不需要osgi.core-6.0.0
来自OSGI 网站的核心 OSGI jar 。
org.eclipse.osgi_<version>.jar
幕后的Equinox jar是否使用核心OSGI jar osgi.core-6.0.0
?
Equinox jarorg.eclipse.osgi_<version>.jar
是核心 OSGI jar 的包装器osgi.core-6.0.0
吗?
org.eclipse.osgi_<version>.jar
equinox jar和核心OSGI jar之间是否有任何关系,依赖关系osgi.core-6.0.0
或者这两个jar是否相互独立?
问题4:-
假设我正在使用 Equinox 容器。我需要将我的项目更新到最新的 OSGI 版本。要将项目更新到最新的 OSGI jar,我用最新的 jar 替换哪个 JAR。
我是从 [OSGI website]替换core OSGI jar
到最新的(OSGI 的最新版本)还是将 Equinox jar 更新到它的最新版本?osgi.core-6.0.0
org.eclipse.osgi_<version>.jar
java - 使用服务器端 Knopflerfish 部署应用程序
我用java编写了一个简单的Web应用程序。单击时 index.jsp 页面中有一个按钮,这是一个来自 jar 文件的方法,称为 which print something。index.jsp 是这样的:
我的 IndexServlet 是这样的:
我想用 Apache Tomcat 运行程序并在程序运行时更改 Test.jar,我想更改 Test.jar 中的 getMessage() 方法。如何使用 Knopflerfish OSGi 做到这一点?我的意思是用另一个 jar 文件 Test.jar 替换 Test.jar,但新 Test.jar 文件中的 getMessage() 会打印其他内容。
有一篇文章OSGi Web application development with Server-Side Equinox但它不在 knopflerfish 中。
osgi - 是否有必要在 OSGi 中删除服务引用?
我正在使用 OSGi 框架 Knopflerfish,因为我现在可以通过注册服务来调用捆绑包来执行某些操作,我是否需要删除该服务?
因为我找不到任何删除服务的方法。通过检查 BundleContext 中长度为“getAllService()”和 ServiceTracker.getServices() 的服务,我可以看到服务的总数在增加,即使我调用了“ungetService(ServiceReference)”。
那么是否有必要删除服务或“ungetService”就足够了?如果有必要,我该如何删除该服务?
java - NoClassDefFoundError:com/sun/xml/internal/bind/DatatypeConverterImpl 使用 knopfletfish
我是 ogsi 的新手,当我在 knopfletfish 框架中运行包时,我收到此错误:
我不知道为什么会发生这种情况,我已经引用了所有的 jabxb jar,也许很重要的一点是因为我将 jdk8 更改为 jdk7 以便与另一个 jdk7 捆绑包一起使用。
这是标记异常的类: