OpenHarmony 源码分析之账号子系统
发布时间:2022-01-10 21:59:57 所属栏目:系统 来源:互联网
导读:1 简介 在标准系统上,账号子系统主要提供分布式帐号登录状态管理能力,支持在端侧对接厂商云帐号应用,提供云帐号登录状态查询和更新的管理能力 1.1 OpenHarmony架构图 OpenHarmony 源码解析之账号子系统-鸿蒙HarmonyOS技术社区 1.2 账号子系统架构图 OpenHa
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启动服务 #baseaccountos_accountservicesaccountmgraccountmgr.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()后,服务运行状态则更新为开启状态 //baseaccountos_accountservicesaccountmgrsrcaccount_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方法 //baseaccountos_accountservicesaccountmgrsrcaccount_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_中。 (编辑:孝感站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读