积分582 / 贡献0

提问0答案被采纳0文章52

[经验分享] OpenHarmony 3.1 Release + Linux 原厂内核Launcher起不来问题分析报告 原创

Laval社区小助手 显示全部楼层 发表于 2023-11-1 09:30:26

详情:OpenHarmony 3.1 Release + Linux 原厂内核Launcher起不来问题分析报告

1、关键字

Launcher无法启动;原厂内核;Access Token ID;

2、问题描述

芯片:rk3566;rk3399

内核版本:Linux 4.19,是RK芯片原厂发布的rk356x 4.19稳定版内核

OH版本:OpenHarmony 3.1 Release

问题现象:将OpenHarmony kernel修改移植到rk3566上,对接OpenHarmony 3.1 Release版本,Launcher起不来,移植停留在开机动画界面。

移植步骤:

1)、导入rk356x芯片厂家内核到构建系统中。

2)、收到合入hdf patch

3)、移植accesstoken id驱动

4)、dts文件适配开发板

5)、defconfig使用的是Linux 5.10 rk3568的config文件

3、问题原因

3.1 正常机制

应用能够正常安装

3.1.1 应用安装相关过程

应用安装时会使用分布式数据库KvStore更新metaData,KvStore会调用阮总先接口获取LocalDeviceId。

对应代码调用关系:

KvStoreDataService::UpdateMetaData()

-->kv_store,DeviceKvStoreImpl::GetLocalDeviceId()

--> kv_store,KvStoreUtils::GetProviderInstance().GetLocalDevice()

-->SoftBus IPC接口,SoftBusAdapter::GetLocalDevice()

-->SoftBus IPC接口,GetLocalNodeDeviceInfo()

-->SoftBus Server,GetLocalNodeDeviceInfo()

3.1.2 软总线SA初始化相关过程

SoftBusServer::OnStart() // 软总线SA启动函数

foundation\communication\dsoftbus\core\frame\standard\init\src\softbus_server.cpp softbus_server.cpp

----> InitSoftBusServer() // 调用软总线初始化

foundation\communication\dsoftbus\core\frame\common\src\softbus_server_frame.c

----> AuthInit() // 调用认证管理模块初始化

foundation\communication\dsoftbus\core\authentication\src\auth_manager.c auth_manager.c

----> HichainServiceInit() // 调用Hichain初始化

foundation\communication\dsoftbus\core\authentication\src\auth_manager.c auth_manager.c

---->GetGmInstance()->regDataChangeListener

// 调用安全子系统设备互信认证部件的接口获取设备群组管理实例,然后注册数据变化Listener

foundation\communication\dsoftbus\core\authentication\src\auth_manager.c auth_manager.c

---->IpcGmRegDataChangeListener() //即调用中的IpcGmRegDataChangeListener函数

base\security\deviceauth\frameworks\src\ipc_sdk.c

---->DoBinderCall()

base\security\deviceauth\frameworks\src\standard\ipc_adapt.cpp

----> ProxyDevAuthData::ActCall

base\security\deviceauth\frameworks\src\standard\ipc_dev_auth_proxy.cpp

----> ProxyDevAuth::DoCallRequest()

base\security\deviceauth\frameworks\src\standard\ipc_dev_auth_proxy.cpp

----> ServiceDevAuth::OnRemoteRequest //IPC调用到服务端

base\security\deviceauth\frameworks\src\standard\ipc_dev_auth_stub.cpp

----> Security::AccessToken::CheckPermission() //调用AccessTokenKit检验调用者权限

base\security\deviceauth\services\frameworks\src\permission_adapter\permission_adapter.cpp

3.2 异常机制

Access Token补丁没有合入全面,导致软总线SA初始化失败,导致服务异常、分布式数据库GetLocalDevice失败,进一步导致应用安装失败

4 解决方案

补齐kernel/fork.c中关于Access Token的修改,补齐后验证应用可以正常起来。

5 定位过程

5.1 应用安装失败的原因

软总线SA初始化失败,导致服务异常或者Crash,导致分布式数据库GetLocalDevice失败,进一步导致应用安装失败。

关键异常打印如下:

dsoftbus_standard: [LNN]init softbus failed

SoftBusAdapter::GetLocalDevice: GetLocalNodeDeviceInfo error

KvStoreDataService::UpdateMetaData: failed to get local device id KvStoreDataService::GetSingleKvStore: failed to write meta

BundleMgrService: [distributed_data_storage.cpp(GetKvStore):237] return error

5.2 软总线SA初始化失败的原因

因为软总线SA的AccessToken tokenID不合法,在Hichain初始化时ProxyDevAuth::DoCallRequest被设备认证服务端校验权限不通过,打印tokenID is invalid,导致hichain init failed,进一步导致softbus framework init failed。

关键异常打印如下:

08-04 09:00:28.085 291 1127 I 00000/[DEVAUTH]: DoCallRequest: ProxyDevAuth, SendRequest...

08-04 09:00:28.085 263 536 I 02f01/AccessTokenKit: [GetTokenType]:GetTokenType called

08-04 09:00:28.085 263 536 E 02f01/AccessTokenKit: [GetTokenType]:tokenID is invalid

08-04 09:00:28.085 263 536 E 00000/[DEVAUTH]: CheckPermission: Invalid token type: -1

08-04 09:00:28.085 291 1127 I 00000/[DEVAUTH]: DoCallRequest: SendRequest done, ret -1

08-04 09:00:28.085 291 1127 I 00000/[DEVAUTH]: IpcGmRegDataChangeListener: process done, ret 12289

08-04 09:00:28.085 291 1127 E 015c0/dsoftbus_standard: [AUTH]auth RegDataChangeListener failed

08-04 09:00:28.085 291 1127 E 015c0/dsoftbus_standard: [AUTH]auth hichain init failed

08-04 09:00:28.085 291 1127 E 015c0/dsoftbus_standard: [COMM]softbus auth init failed.

08-04 09:00:28.085 291 1127 I 015c0/dsoftbus_standard: [AUTH]unregister auth trans callback, module = 1.

08-04 09:00:28.085 291 1127 I 015c0/dsoftbus_standard: [TRAN]PendigPackManagerDeinit init ok

08-04 09:00:28.085 291 1127 I 015c0/dsoftbus_standard: [AUTH]unregister auth trans callback, module = 0.

08-04 09:00:28.085 291 1127 I 015c0/dsoftbus_standard: [TRAN]server trans udp channel deinit success.

08-04 09:00:28.086 291 1127 E 015c0/dsoftbus_standard: [COMM]softbus framework init failed.

5.3 AccessToken TokenID不合法的原因

跑access_token_id的XTS用例,发现如下用例不过,子线程的access token id信息不对,ftoken跟父线程一致,实际应该为0。

推断创建线程时给token id初始化的值不对,可能是kernel/fork.c中kernel/fork.c的patch没打上。

让伙伴检查这段代码,确定是上述kernel/fork.c中的代码漏合导致。

6 知识分享

6.1 Access Token介绍

Access Token是3.1 release安全子系统新增的应用权限访问控制功能和权限增强特性,支持应用程序或者其他SA查询和校验应用权限、APL(Ability Privilege Level )等信息。

在OpenHarmony服务化的应用程序框架中,一切程序都是服务(元能力)。任何元能力间的访问,都需要进行访问权限控制。访问控制的机制通过采用AT访问令牌传递和令牌访问控制的策略来实现。

一个AT访问令牌由:

  • 设备标识 DevID
  • 应用身份标识APP ID
  • 子用户ID
  • 应用分身索引信息
  • SA 服务ID( SA服务名字)
  • TokenID ,表示权限令牌ID, 跨设备全局唯一。64bit。由以上字段结合场景进行组合生成,以lib形式提供生成 TokenID.

Android的应用访问权限管控手段,是面向实现的设计,比较混乱,包括Platform签名、Privilege特权应用、UID=1000特权、MDM权限证书等等,且不能应用于分布式场景。OpenHarmony的Access Token机制,有总体的设计,能够分布式传输。

OpenHarmony应用程序框架提供的API,分成Signature、Privilege和Normal三级。

API等级/APL等级 APL 3 APL 2 APL 1
API Level Signature Y N N
API Level Privilege Y Y N
API Level Normal Y Y Y

凡是不能访问的API,必须通过AACL(API ACL)机制来实现策略的关联。

6.2 Access Token内核补丁

在使用三方内核适配OpenHarmony系统时,需要打上Access Token内核补丁,补丁链接如下。

https://gitee.com/openharmony/kernel_linux_4.19/pulls/4

https://gitee.com/openharmony/kernel_linux_4.19/pulls/5

6.3 Access Token调测知识

补丁打成功后,会有相应的的字符设备/dev/access_token用于和用户态交互。

并且在每个进程或线程的pcb信息中会有tokenid信息,包括自身tokenid和首调者tokenid。

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部