Chromium Keyed Service
发布于 2018-08-19
Chromium的Profile
继承自BrowserContext
,代表着一个browser的上下文,很多浏览器很多业务类的代码都与此有着紧密的联系。以前很多业务类都写到Profile
里面,导致Profile
的代码越来越膨胀而难以维护。另外一个更严重的问题是:业务类之间的依赖关系越来越难以手动管理了,导致浏览器退出时,因为逻辑类生命周期的管理不当而引发崩溃。
为此Chromium引入了Profile Architecture 架构。把那些业务类都拆分一个个独立的KeyedService
,它是由KeyedServiceFactory
管理生命周期。而KeyedService
之间的依赖关系则通过BrowserContextDependencyManager
去管理。
以SigninErrorController
为例介绍一下Chromium的Keyed Service机制。
SigninErrorControllerFactory
是一个继承自KeyedServiceFactory
的单例,它负责管理SigninErrorController
生命周期。当它创建时,可以通过DependsOn
方法来设定与其他业务类的依赖关系。具体维护依赖关系则是BrowserContextDependencyManager
。它维护这依赖关系图,业务类销毁时,则生成相应的依赖关系,在PerformInterlockedTwoPhaseShutdown
里面分两阶段来销毁KeyedService
:
- ShutdownFactoriesInOrder,它会根据依赖关系调用到对应的
KeyedService
的Shutdown
方法 - ShutdownFactoriesInOrder,它会根据依赖关系调用到对应的
KeyedService
的析构函数