OpenHarmony 源码剖析之账号子体系

欧冠赛程平台登录
你的位置:欧冠赛程平台登录 > 新闻动态 > OpenHarmony 源码剖析之账号子体系
OpenHarmony 源码剖析之账号子体系
发布日期:2022-08-07 11:24    点击次数:189

想相识更多内容,请拜访:

51CTO和华为平易近间合作共建的鸿蒙技能社区

https://harmonyos.51cto.com

1 简介

在标准体系上,账号子体系次要供应漫衍式帐号登录形态打点才能,支持在端侧对接厂商云帐号应用,供应云帐号登录形态查询和更新的打点才能

1.1 OpenHarmony架构图 OpenHarmony 源码剖析之账号子体系-鸿蒙HarmonyOS技能社区 1.2 账号子体系架构图 OpenHarmony 源码剖析之账号子体系-鸿蒙HarmonyOS技能社区 1.3 账号子体系目录构造
/base/account/os_account ├── frameworks                           │   ├── appaccount                                          # 应用账号kit代码 │   ├── ohosaccount                                         # 云账号kit代码 │   ├── co妹妹on                                              # 共通底子代码 │   │   ├── 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_中
//base\account\os_account\services\accountmgr\src\ohos_account_manager.cpp bool OhosAccountManager::OnInitialize() {     accountState_ = std::make_unique<AccountStateMachine>();          //事宜晖映     BuildEventsMapper();      //构造账号设置文件门路     std::int32_t userId = GetUserId();     std::string filePath;     filePath.append(ACCOUNT_CFG_DIR_ROOT_PATH).append(std::to_string(userId)).append(ACCOUNT_CFG_FILE_NAME);          //创立OhosAccountDataDeal工具     dataDealer_ = std::make_unique<OhosAccountDataDeal>(filePath);      std::int32_t tryTimes = 0;     while (tryTimes < MAX_RETRY_TIMES) {         tryTimes++;                  //调用ohos_account_data_deal的Init编制         ErrCode errCode = dataDealer_->Init();         if (errCode == ERR_OK) {             break;         }          // when json file corrupted, have it another try         if ((tryTimes == MAX_RETRY_TIMES)