当前位置: 首页 > 工具软件 > Oscar > 使用案例 >

Oscar启动分析

柯良骏
2023-12-01
1、Oscar首先查找与oscar.jar在同一目录下的System.properties文件,装载所有的系统属性。
 可以通过设置oscar.system.properties属性来改变system.properties文件的路径。
 
 2、查找CACHE_PROFILE_PROP的值确定profile名称属性;
 查找CACHE_PROFILE_DIR_PROP的值确定profile目录属性。
 
 3、Oscar其他属性的设定【option】
 
 4、实例化Oscar
  1)创建一份传入的配置属性的拷贝
   m_configPropMap = new HashMap();
         for (Enumeration e = props.propertyNames(); e.hasMoreElements(); )
         {
             String name = (String) e.nextElement();
             m_configPropMap.put(name, props.getProperty(name));
         }
        
         2)实例化缓存bundle的cache实例【分析】,如果CACHE_CLASS_PROP系统属性未指定,则实例化DefaultBundleCache。
         这一过程中出现异常时,如果Oscar独立启动,则停止JVM。
                
  3)初始化Oscar实例
  /***********************************************
  ** ImportSearchPolicy searchPolicy = new OSGiImportSearchPolicy(this);
     ** m_mgr = new ModuleManager(searchPolicy, new OSGiURLPolicy(this));
  ** 
     ** m_mgr.addModuleListener((OSGiSelectionPolicy) searchPolicy.getSelectionPolicy());
  **
     ** searchPolicy.addValidationListener(new ValidationListener()
     */
  构造ImportSearchPolicy实例【分析】。ImportSearchPolicy实现了ModuleLoader的查找策略以支持模块间相互Import和Export类及资源。
  构造OSGiURLPolicy实例【分析】
  使用指定的Search策略和URL策略构造ModuleManager【分析】
  在ModuleManager上注册OSGi selection policy实例为module监听,以便于在modules卸载时清洗package export cache。
  在ImportSearchPolicy实例上注册validation监听,以便于当modules被validated(如resolved)后更新bundle的state。
  
  构造支持SynchronousBundleListener的DispatchQueue的实例【分析】
  构造Installed Bundle Map实例
  ** m_dispatchQueue = new OscarDispatchQueue();
     ** m_installedBundleMap = new HashMap();
  
  构造framework properties实例(CaseInsensitiveMap)
  ** m_frameworkPropMap = new CaseInsensitiveMap();
 
  初始化Osgi Properties(initializeOsgiProperties【分析】)
  初始化Bundle Properties(initializeOsgiProperties)【分析】
  ** initializeOsgiProperties();
     ** initializeOsgiProperties();
    
  /**********************************
   ** BundleInfo info = new BundleInfo(
      **            new SystemBundleArchive(), null);
   **    systembundle = new SystemBundle(this, info, activatorList);
   **    systembundle.getInfo().addModule(
   **       m_mgr.addModule(
   **           "0", systembundle.getAttributes(),
   **            systembundle.getResourceSources(),
   **            systembundle.getLibrarySources()));
   **    m_installedBundleMap.put(
   **    systembundle.getInfo().getLocation(), systembundle);
   **   
   **    searchPolicy.validate(systembundle.getInfo().getCurrentModule());
      */          
  创建System Bundle实例:
   为System Bundle构造简单的bundle info实例【TODO:分析bundleinfo的构造】
   实例化system bundle【TODO:分析systembundle的构造】
   将system bundle放入installed bundle map中
   调用ImportSearchPolicy实例来validate System Bundle使其状态置为RESOLVED。【分析】
   启动System Bundle【分析】
   
  重新装载并缓存bundles
   BundleArchive[] archives = m_cache.getArchives();
   如果因为crash或file lock而未将标记为UNINSTALLED的bundle完全卸载,则在此处理
   /** if (archives[i].getPersistentState() == Bundle.UNINSTALLED)
          ** {
          **    m_cache.remove(archives[i]);
          ** }
          */
      否则install BundleArchives中的所有bundle【分析installBundle方法】
        /**  else
         **  {
         **      // Install the cached bundle.
         **      bundle = (BundleImpl) installBundle(
         **          archives[i].getId(), archives[i].getLocation(), null);
         ** }
   */       
      获取框架的默认start level
        
      从auto-install 和 auto-start properties设定中加载bundles;
      processAutoProperties();【分析】
 
      设定framework的active start level,如果必要可能会重新启动bundles。
      setStartLevel(startLevel);【分析】
     
      Oscar进入启动状态
      m_oscarStatus = RUNNING_STATUS;
 
      设定system bundle 的 state 为 ACTIVE.
      systembundle.getInfo().setState(Bundle.ACTIVE);
 
      为 system bundle 触发 started event.
      fireBundleEvent(BundleEvent.STARTED, systembundle);
 
      发送一个framework event 指明 Oscar 已经 started.
      fireFrameworkEvent(FrameworkEvent.STARTED, getBundle(0), null);
 类似资料: