加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

OpenHarmony 源码分析之账号子系统

发布时间:2022-01-10 15:59:44 所属栏目:系统 来源:互联网
导读:1 简介 在标准系统上,账号子系统主要提供分布式帐号登录状态管理能力,支持在端侧对接厂商云帐号应用,提供云帐号登录状态查询和更新的管理能力 1.1 OpenHarmony架构图 OpenHarmony 源码解析之账号子系统-鸿蒙HarmonyOS技术社区 1.2 账号子系统架构图 Open
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_中。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读