1 简介
在标准系统上,账号子系统主要提供分布式帐号登录状态管理能力,支持在端侧对接厂商云帐号应用,提供云帐号登录状态查询和更新的管理能力
1.1 OpenHarmony架构图
OpenHarmony 源码解析之账号子系统-鸿蒙HarmonyOS技术社区
1.2 账号子系统架构图
OpenHarmony 源码解析之账号子系统-鸿蒙HarmonyOS技术社区
1.3 账号子系统目录结构
/base/account/os_account
├── frameworks
│ ├── appaccount # 应用账号kit代码
│ ├── ohosaccount # 云账号kit代码
│ ├── common # 共通基础代码
│ │ ├── account_error # 错误码
│ │ ├── database # 数据库基础代码
│ │ ├── log # 打印日志代码
│ │ └── perf_stat # 性能统计
├── interfaces
│ ├── innerkits
│ │ ├── appaccount # 应用账号内部接口
│ │ ├── ohosaccount # 云账号内部接口
│ └── kits
│ └── napi
│ ├── appaccount # 应用账号对外接口
│ └── distributedaccount # 分布式账号对外接口
├── sa_profile # 帐号SA配置文件定义目录
└── services
└── accountmgr # 帐号管理服务
2 账号管理服务的启动
2.1 rc启动服务
#base\account\os_account\services\accountmgr\accountmgr.rc
on post-fs-data
start accountmgr
service accountmgr /system/bin/sa_main /system/profile/accountmgr.xml
class z_core
user system
group system shell
seclabel u:r:accountmgr:s0
writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks /dev/blkio/foreground/tasks
2.1.1 rc文件结构解析
rc文件是以模块为单位的,模块分为3种类型:on、service、import
import: 导入其它的rc文件
on: 执行chown、mkdir、write、export、symlink等简单的shell指令,如:
on post-fs-data
start accountmgr
post-fs-data将一个section里的所有命令加入到一个执行队列,在未来的某个时候会顺序执行队列里的命令
service: 执行可执行程序,如:
service accountmgr /system/bin/sa_main /system/profile/accountmgr.xml
class z_core
user system
group system shell
seclabel u:r:accountmgr:s0
writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks /dev/blkio/foreground/tasks
accountmgr为可执行程序名
/system/bin/sa_main /system/profile/accountmgr.xml为可执行文件的路径
class、user、group、seclabel、writepid这些关键字所对应的行是用来描述service一些特点,不同的service有着不同的特点
service什么时候被执行?
在某个on模块的指令里会存在“class_start”,例如:
class_start core
class_start main
on nonencrypted
class_start late_start
当执行到这里是service模块就会被调用
2.2 AccountMgrService的启动流程
OpenHarmony 源码解析之账号子系统-鸿蒙HarmonyOS技术社区
2.2.1 AccountMgrService通过OnStart调用Init
AccountMgrService继承自SystemAbility,当应用启动时首先应用程序框架会调用AccountMgrService的生命周期函数OnStart();
OnStart()首先判断服务运行状态是否已经开启,如果没有开启,则调用Init()进行初始化操作
初始化操作完成并返回true给OnStart()后,服务运行状态则更新为开启状态
//base\account\os_account\services\accountmgr\src\account_mgr_service.cpp
void AccountMgrService::OnStart()
{
//判断服务运行状态是否已经开启
if (state_ == ServiceRunningState::STATE_RUNNING) {
ACCOUNT_LOGI("AccountMgrService has already started.");
return;
}
PerfStat::GetInstance().SetInstanceStartTime(GetTickCount());
ACCOUNT_LOGI("start is triggered");
//如果服务运行状态没有开启,则调用Init()进行初始化操作
if (!Init()) {
ACCOUNT_LOGE("failed to init AccountMgrService");
return;
}
//初始化操作完成并返回true给OnStart()后,服务运行状态则更新为开启状态
state_ = ServiceRunningState::STATE_RUNNING;
ACCOUNT_LOGI("AccountMgrService::OnStart start service success.");
}
2.2.2 AccountMgrService的Init()实现
Init()被调用后,依然要先判断服务运行状态是否已经开启
随后,检查DEVICE_OWNER_DIR是否存在,如果不存在就强制创建
如果服务还没有被注册,则调用Publish()来注册服务,Publish()执行成功后,标记服务已经被注册
创建OhosAccountManager对象,并调用它的OnInitialize方法
//base\account\os_account\services\accountmgr\src\account_mgr_service.cpp
bool AccountMgrService::Init()
{
//判断服务运行状态是否已经开启
if (state_ == ServiceRunningState::STATE_RUNNING) {
ACCOUNT_LOGW("Service is already running!");
return false;
}
//检查DEVICE_OWNER_DIR是否存在,如果不存在就强制创建
if (!OHOS::FileExists(DEVICE_OWNER_DIR)) {
ACCOUNT_LOGI("Device owner dir not exist, create!");
if (!OHOS::ForceCreateDirectory(DEVICE_OWNER_DIR)) {
ACCOUNT_LOGW("Create device owner dir failure!");
}
}
bool ret = false;
//如果服务还没有被注册,则调用Publish()来注册服务,Publish()执行成功后,标记服务已经被注册
if (!registerToService_) {
ret = Publish(&DelayedRefSingleton<AccountMgrService>::GetInstance());
if (!ret) {
HiviewDFX::HiSysEvent::Write(HiviewDFX::HiSysEvent::Domain::ACCOUNT, "AccountServiceStartFailed",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_TYPE", ERR_ACCOUNT_MGR_ADD_TO_SA_ERROR);
ACCOUNT_LOGE("AccountMgrService::Init Publish failed!");
return false;
}
registerToService_ = true;
}
PerfStat::GetInstance().SetInstanceInitTime(GetTickCount());
//创建OhosAccountManager对象
ohosAccountMgr_ = std::make_shared<OhosAccountManager>();
//调用OhosAccountManager的OnInitialize方法
ret = ohosAccountMgr_->OnInitialize();
if (!ret) {
ACCOUNT_LOGE("Ohos account manager initialize failed");
HiviewDFX::HiSysEvent::Write(HiviewDFX::HiSysEvent::Domain::ACCOUNT, "AccountServiceStartFailed",
HiviewDFX::HiSysEvent::EventType::FAULT, "ERROR_TYPE", ret);
return ret;
}
dumpHelper_ = std::make_unique<AccountDumpHelper>(ohosAccountMgr_);
IAccountContext::SetInstance(this);
ACCOUNT_LOGI("init end success");
return true;
}
2.2.3 OhosAccountManager的初始化
OhosAccountManager::OnInitialize首先调用BuildEventsMapper()进行事件映射,查看BuildEventsMapper()实现可发现,写死的事件有账号登入、登出、注销和Token失效,并与对应的方法绑定
组织账号配置文件路径,作为参数创建OhosAccountDataDeal对象,并调用它的Init方法,查看Init()实现可发现,Init()读取账号配置文件并保存到jsonData_中
调用AccountInfoFromJson()获取账号信息并保存到currentAccount_中。
大型站长资讯类网站!