本主题说明如何将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 API类android.util.Log
.
由于这些变化,bundle可以在他们的原型和实现中使用android类.然而,他们将无法与图形用户界面,内容提供商和系统服务等相关,因为他们缺乏对它的强制性参考.
Knopflerfish应用程序的变化
实际上,tools/android/apk下的应用程序能够在android上执行OSGi框架,但前提是捆绑包只调用java类.作为Knopflerfish框架的一部分的捆绑包就是这种情况,但是想要调用android API的自定义捆绑包是什么?以下是在框架中进行的更改,以启用解析android类的bundle.
首先,android包必须是框架包的一部分,以便可以解析它们.这是OSGi属性的目的org.osgi.framework.system.packages.extra
在创建框架之前将属性设置为要导出的android包列表,然后进行设置.请注意,野生炭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,"
+ …
Run Code Online (Sandbox Code Playgroud) 我对组件变为活动时调用哪个函数Activate函数或绑定函数的顺序感到困惑.在我看来,首先会调用activate函数函数,因为Bind函数用于绑定服务.但是,正如我们所知,所有目标服务首先进入组件上下文,然后组件被激活.
请清除我的怀疑.