Created
Dec 29, 2022 06:23 AM
Tags
源码分析
osgi.core
FrameWork
“Bundle 相关”
Bundle(interface)
- Bundle 接口表示在框架中安装的一个 Bundle。每一个 Bundle 有一个由框架设置 的唯一标识。它提供以下功能:
- Bundle 操作,启动、停止、更新、卸载操作及 Bundle 状态。
- Bundle 信息,头信息、ID、Location、特征名称和上次更新时间。
- 类和资源加载,获取服务引用。
- Bundle 上下文。
public static final int UNINSTALLED = 0x00000001
已卸载状态
public static final int INSTALLED = 0x00000002
已安装状态
public static final int RESOLVED = 0x00000004
已解析状态
public static final int STARTING = 0x00000008
正在启动状态
public static final int STOPPING = 0x00000010
正在停止状态
public static final int ACTIVE = 0x00000020
激活状态
- Bundle的autostart设置影响启动策略,这个持久设置可有:
- Stopped——Bundle不可以被启动;
- Started with eager activation——启动后立即激活;
- Started with declared activation——启动后,第一个类加载时激活。
public static final int START_TRANSIENT = 0x00000001
这个值用于start函数,表示启动后立即激活,但不更改autostart设置
public static final int START_ACTIVATION_POLICY = 0x00000002
这个值用于start函数,表示使用Bundle-ActivationPolicy来启动,并设置autostart为Started with declared activation。
public static final int STOP_TRANSIENT = 0x00000001
用于stop函数,表示停止后不更改autostart设置。
public int getState()
返回Bundle当前状态。
- 使用参数启动Bundle。这个参数可以是:
- 0——启动后立即激活,并设置autostart为Started with eager activation。
- START_TRANSIENT——同0,但不更改autostart。
- START_ACTIVATION_POLICY——启动后根据Bundle-ActivationPolicy来激活Bundle,并更改autostart为Started with declared activation。
- START_ACTIVATION_POLICY | START_TRANSIENT——同(3),但不更改autostart设置。
- 如果Bundle状态时UNINSTALLED,则抛出IllegalStateException;
- 如果框架实现了可选的启动级别且当前启动级别小于Bundle启动级别,若设置START_TRANSIENT,则抛出BundleException。
public void start(int options) throws BundleException;
public void start() throws BundleException;
相当于start(0)
- 停止一个Bundle,参数options可为:
- 0——停止并设置autostart为stopped。
- STOP_TRANSIENT——停止,不更改autostart。
public void stop(int options) throws BundleException;
public void stop() throws BundleException;
相当于stop(0)
public void update() throws BundleException;
更新Bundle
public void update(InputStream in) throws BundleException;
更新Bundle
public void uninstall() throws BundleException;
卸载一个Bundle
public Dictionary getHeaders();
获取这个Bundle的头信息
public long getBundleId();
获取这个Bundle的ID
public String getLocation();
获取安装位置
public ServiceReference[] getRegisteredServices();
获取这个Bundle注册的服务
public ServiceReference[] getServicesInUse();
获取这个Bundle使用的服务
public boolean hasPermission(Object permission);
确定特定的Bundle是否获得permission
public URL getResource(String name);
获取资源
public Dictionary getHeaders(String locale);
获取本地化的头信息
public String getSymbolicName();
特征名
public Class loadClass(String name) throws ClassNotFoundException;
装载类
- 获取所有资源
public Enumeration getResources(String name) throws IOException;
public Enumeration getEntryPaths(String path);
public URL getEntry(String path);
public long getLastModified();
获取上次更新时间
public Enumeration findEntries(String path, String filePattern,boolean recurse);
查找资源
BundleActivator(interface)
- 自定义启动和停止 Bundle。当 Bundle 在 Resolved<->Active 之间转换时,调用 start 和 stop。
public void start(BundleContext context) throws Exception;
void stop(BundleContext context) throws Exception;
BundleContext(interface)
- BundleContext 用于使关联 Bundle 与系统的其它功能进行交互。它提供的功能包括:
- 获取属性。
- 检索和安装 Bundle。
- 注册和获取服务引用。
- 服务、Bundle 和框架的事件与监听器。
- 过滤器和持久存储
public String getProperty(String key);
获取系统属性
public Bundle getBundle();
返回关联的Bundle
- 安装一个Bundle
public Bundle installBundle(String location) throws BundleException;
public Bundle installBundle(String location, InputStream input) throws BundleException;
public Bundle getBundle(long id);
获取指定ID的Bundle
public Bundle[] getBundles();
获取所有安装的Bundle
- 服务监听器
public void addServiceListener(ServiceListener listener,String filter) throws InvalidSyntaxException;
public void addServiceListener(ServiceListener listener);
public void removeServiceListener(ServiceListener listener);
- Bundle监听器
public void addBundleListener(BundleListener listener);
public void removeBundleListener(BundleListener listener);
- Framework监听器
public void addFrameworkListener(FrameworkListener listener);
public void removeFrameworkListener(FrameworkListener listener);
- 注册服务
public ServiceRegistration registerService(String[] clazzes,Object service, Dictionary properties);
public ServiceRegistration registerService(String clazz,Object service, Dictionary properties);
- 获取服务
public ServiceReference[] getServiceReferences(String clazz,String filter) throws InvalidSyntaxException;
public ServiceReference[] getAllServiceReferences(String clazz,String filter) throws InvalidSyntaxException;
public ServiceReference getServiceReference(String clazz);
public Object getService(ServiceReference reference);
public boolean ungetService(ServiceReference reference);
取消使用服务
public File getDataFile(String filename);
在持久化存储中创建一个文件。如果不支持文件系统,则返回null
public Filter createFilter(String filter) throws InvalidSyntaxException;
创建过滤器
BundleEvent(class extends EventObject)
- 描述 Bundle 声明周期变更的事件。需要注意的是,这个事件是异步传输的
private final Bundle bundle;
变更的Bundle
private final int type;
声明周期变更类型
- 类型:已安装、已启动、已停止、已更新、已卸载、已解析、未解析、正在启动、正在停止、将被晚激活。
public final static int INSTALLED = 0x00000001;
public final static int STARTED = 0x00000002;
public final static int STOPPED = 0x00000004;
public final static int UPDATED = 0x00000008;
public final static int UNINSTALLED = 0x00000010;
public final static int RESOLVED = 0x00000020;
public final static int UNRESOLVED = 0x00000040;
public final static int STARTING = 0x00000080;
public final static int STOPPING = 0x00000100;
public final static int LAZY_ACTIVATION = 0x00000200;
public BundleEvent(int type, Bundle bundle)
public Bundle getBundle()
public int getType()
BundleException(class extends Exception)
- 一个 BundleException 用于指示发生了一个 Bundle 生命周期问题。
static final long serialVersionUID = 3571095144220455665L;
private final Throwable cause;
public BundleException(String msg, Throwable cause)
public BundleException(String msg)
public Throwable getNestedException()
public Throwable initCause(Throwable cause)
BundleListener(interface extends EventListener)
- 监听器
public void bundleChanged(BundleEvent event);
SynchronousBundleListener <interface extends BoundleListener>
- 同步处理,即 Bundle 的生命周期处理中必须同步的处理完监听器后,才可以执 行其它操作。
“服务相关”
ServiceReference(inteface extends Comparable)
public Object getProperty(String key);
获取服务的属性。
public String[] getPropertyKeys();
获取所有属性键.
public Bundle getBundle();
获取注册服务的Bundle
public Bundle[] getUsingBundles();
获取通过这个服务引用使用服务的Bundle。
public boolean isAssignableTo(Bundle bundle, String className);
判断注册当前服务引用对应的服务的Bundle和指定的Bundle,对于指定的类是否使用相同的包。
public int compareTo(Object reference);
比较
ServiceRegistration(interface)
- 表示一个已经被注册的服务。当 BundleContext.registerService 方法调用成功时,框架返回一个该对象。这个对象由注册服务的 Bundle 拥有且不与其它 Bundle 共享。它用于更新服务和卸载服务。
public ServiceReference getReference();
获取一个引用
public void setProperties(Dictionary properties);
设置服务属性
public void unregister();
卸载服务
ServiceFactory(interface)
- 允许在 OSGi 环境提供自定义的服务对象。当注册服务时,一个 ServiceFactory可以用于替代服务对象。可以根据需要返回真正的服务对象,类似于服务代理。
public Object getService(Bundle bundle,ServiceRegistration registration);
获取服务对象,将被缓存
public void ungetService(Bundle bundle,ServiceRegistration registration, Object service);
释放一个服务对象。
ServiceEvent(calss extends EventObject)
- 用于描述服务生命周期的变更。这个事件被同步传输。
private final ServiceReference reference;
private final int type;
public final static int REGISTERED = 0x00000001;
public final static int MODIFIED = 0x00000002;
public final static int UNREGISTERING = 0x00000004;
public ServiceEvent(int type, ServiceReference reference)
public ServiceReference getServiceReference()
public int getType()
ServiceListener(interface EventListener)
- 监听器会根据权限过滤。
public void serviceChanged(ServiceEvent event);
AllServicesListener(interface ServiceListener)
- 空
Framework相关
FrameworkUtil(class)
private FrameworkUtil() {}
public static Filter createFilter(String filter)throws InvalidSyntaxException
创建一个过滤器
FrameworkEvent(class extends EventObject)
- 框架的普通事件,它是一个异步事件。
private final Bundle bundle;
private final Throwable throwable;
private final int type;
public final static int STARTED = 0x00000001;
public final static int ERROR = 0x00000002;
public final static int PACKAGES_REFRESHED = 0x00000004;
public final static int STARTLEVEL_CHANGED = 0x00000008;
public final static int WARNING = 0x00000010;
public final static int INFO = 0x00000020;
public FrameworkEvent(int type, Object source)
创建一个框架事件
public FrameworkEvent(int type, Bundle bundle, Throwable throwable)
根据特定的Boundle创建事件
public Throwable getThrowable()
换回和事件相关的异常
public Bundle getBundle()
返回和事件相关的Boundle
public int getType()
返回事件的类型
FrameworkListener(inteface extends EventListener)
- 框架的监听器
public void frameworkEvent(FrameworkEvent event);
“其它”
- Permission 是 Java 中的一个权限类,用来表示对资源的访问权限。Permission 最重要的方法是 implies,方法签名如下:
- public abstract boolean implies(Permission permission);
- 表示当前Permission对象 (this) 是否暗含了指定 Permission 对象(permission) 的权限。
- Java 中给出一个经典实现:BasicPermission,它使用了传入的字符串作为权限的标志,并使用类似于相对路径的办法比较一个 Permission 是否暗含了另一个Permission 的权限。
PackagePermission(class extends BasicPermission)
AdminPermission (class extends BasicPermission)
ServicePermission(class extends BasicPermission)
Constants(interface )
- *
Service
StartLevel
StartLevel.java(interface)
public int getStartLevel()
public void setStartLevel(int startlevel)
public int getBundleStartLevel(Bundle bundle)
public void setBundleStartLevel(Bundle bundle, int startlevel)
为每个特定的Bundle指定level值
public int getInitialBundleStartLevel()
返回Bundle刚按装时的初始化的是level值
public void setInitialBundleStartLevel(int startlevel)
为每个刚生成的Bundle设置初始的Level值
public boolean isBundlePersistentlyStarted(Bundle bundle)
返回指定的Bundle自动启动设置是否指示该包必须启动
public boolean isBundleActivationPolicyUsed(Bundle bundle)
返回指定的Bundle的自动启动设置是否指示必须使用在Bundle的清单中声明的激活策略
permissionadmin
PermissionAdmin.java(interface)
PermissionInfo[] getPermissions(String location)
void setPermissions(String location, PermissionInfo[] permissions)
String[] getLocations()
PermissionInfo[] getDefaultPermissions()
void setDefaultPermissions(PermissionInfo[] permissions)
PermissionInfo.java(class)
String type``String name``String actions
public PermissionInfo(String type, String name, String actions)
构造器
public PermissionInfo(String encodedPermission)
public final String getEncoded()
public boolean equals(Object obj)
判断来两个PermissionInfo是否相等
public int hashCode()
返回PermissionInfo的hashCode
private static void escapeString(String str, StringBuffer output)
private static String unescapeString(char[] str, int begin, int end)
url
AbstractURLStreamHandlerService(abstract class extends URLStreamHandler(java包自带的) implements URLStreamHandlerService)
public abstract URLConnection openConnection(URL u)throws java.io.IOException
protected URLStreamHandlerSetter realHandler
@see"java.net.URLStreamHandler"
public boolean equals(URL u1, URL u2)
public InetAddress getHostAddress(URL u)
public int hashCode(URL u)
public boolean hostsEqual(URL u1, URL u2)
public String toExternalForm(URL u)
public boolean sameFile(URL u1, URL u2)
protected void setURL
protected void setURL(URL u, String proto, String host, int port,String auth, String user, String path, String query, String ref)
URLConstants(interface)
public static final String URL_HANDLER_PROTOCOL = "url.handler.protocol";
public static final String URL_CONTENT_MIMETYPE = "url.content.mimetype";