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 3APL 2APL 1
API Level SignatureYNN
API Level PrivilegeYYN
API Level NormalYYY

凡是不能访问的 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。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/626056.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

接口、会话控制

文章目录 接口介绍RESTful APIjson-server接口测试工具apipost公共参数和文档功能 会话控制cookie介绍和使用运行流程浏览器中操作Cookieexpress中cookie操作 Sessionsession运行流程:session中间件配置session 和 cookie 的区别CSRF跨站请求伪造 tokenJWT介绍与演示…

JavaScript的综合案例

案例要求&#xff1a; 实现一个表单验证 1.当输入框失去焦点时&#xff0c;验证输入的内容是否符合要求 2.当点击注册按钮时&#xff0c;判断所有输入框的内容是否都符合要求&#xff0c;如果不符合要求阻止表单提交 简单的页面实现 <!DOCTYPE html> <html lang&…

【IDE】com.intellij.debugger.engine.evaluation.EvaluateException

目录标题 报错重现代码分析解决方式 报错重现 Error during generated code invocation com.intellij.debugger.engine.evaluation.EvaluateException: Method threw java.lang.NullPointerException exception.代码分析 //ls来自上下文 ls.stream().map(m->m.getRewardTy…

tarjan学习

1.割点&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y是一个割点&#xff0c;x是y的一个子节点&#xff0c;当没有点x时&#xff0c;y无法访问其他点 2.割边&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y不经过这条边无法到达x&#xff0c…

深入了解 npm:Node.js 包管理工具详解

文章目录 一、npm 基本概念1.1 什么是 npm&#xff1f;1.2 package.json 文件 二、npm 常用命令2.1 初始化项目2.2 安装依赖2.2.1 安装单个包2.2.2 全局安装包2.2.3 安装开发依赖 2.3 移除依赖2.4 更新依赖2.5 查看已安装的包2.6 发布包 三、npm 高级用法3.1 使用 npm scripts3…

嵌入式学习-M4的基本定时器

基本介绍 框图分析 时钟选择 计数器结构 开启重装载值寄存器的影子寄存器的工作时序图 未开启重装载值寄存器的影子寄存器的工作时序图 更新事件以及中断 相关寄存器 相关库函数

RK3566(泰山派):GP7101背光驱动

RK3566&#xff08;泰山派&#xff09;&#xff1a;GP7101背光驱动 文章目录 RK3566&#xff08;泰山派&#xff09;&#xff1a;GP7101背光驱动GP7101背光驱动电路配置i2c1设备树创建驱动编写Makefilegp7101_bl.c驱动触摸I2C驱动框架。驱动中的结构体probe函数devm_backlight_…

探索数据结构:堆的具体实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 堆的概念 堆(Heap)是计算机科学中一类特殊的数据结构。堆通常是一个…

SpringBoot项目的项目部署全过程

一、前端 安装nginx 1.将提前准备好的nginx的安装包上传到Linux中/opt目录下(我用的是Xftp) 2.解压 2.1:在xshell中解压该文件: tar -zxvf nginx-1.20.1.tar.gz 2.2:进入解压后的目录 cd nginx-1.20.1/ 2.3:安装需要的依赖 yum -y install zlib zlib-devel openssl openssl-de…

Keil编程不同驱动文件引用同一个常量的处理方法

基础不牢&#xff0c;地动山摇&#xff0c;最近单片机编程又遇到一个基础问题。 我在头文件中定义了一个常量同时给两个驱动文件使用&#xff0c;封装的时候编译没问题&#xff0c;但是在main函数中引用驱动函数的时候就出现了重定义的问题&#xff0c;如下如所示。 解决方法很…

8.基于鱼鹰优化算法(OOA)优化VMD参数(OOA-VMD)

代码原理 鱼鹰优化算法&#xff08;Osprey Optimization Algorithm, OOA&#xff09;是一种基于仿生学原理的启发式优化算法&#xff0c;它模拟了鱼鹰觅食的行为&#xff0c;通过调整搜索空间中的个体位置来优化目标函数。 鱼鹰优化算法可参考&#xff1a;鱼鹰优化算法(Ospre…

Network Compression

听课&#xff08;李宏毅老师的&#xff09;笔记&#xff0c;方便梳理框架&#xff0c;以作复习之用。本节课主要讲了Network Compression&#xff0c;包括为什么要压缩&#xff0c;压缩的主要手段&#xff08;pruning,knowledge distillation,parameter quantization,architect…

C# 下载安装,使用OfficeOpenXml

下载安装OfficeOpenXml模块 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Text.RegularEx…

【大道至简】官方兼容到android13+的获取系统屏幕高度, statusbar,navBar

android在屏幕高度和app高度&#xff0c;statusbar, navigationbar的高度处理上&#xff0c;迭代了好多版本。 android11&#xff0c; android12都有新的api和过时的api标记。 涉及的api类似如下&#xff1a; windowManager&#xff0c;defaultDisplay, Context.display, Deco…

uniapp开发安卓app使用文字转语音技术

在 UniApp 开发安卓应用时&#xff0c;要实现文字转语音&#xff08;Text-to-Speech, TTS&#xff09;技术&#xff0c;你可以利用 UniApp 的跨平台能力结合原生模块或第三方服务来实现。以下是一些建议的步骤和方法&#xff1a; 1. 使用 UniApp 原生模块&#xff08;如果支持…

怎么得到所有大写字母/小写字母组成的字符串

有时候&#xff0c;可能需要获取a~z、A~Z组成的26个字母的字符串&#xff0c;这篇文章介绍一种简单的方法。 只需要几句简单到不能再简单的代码&#xff01;你不会还在傻傻地一个个字母敲吧~ /*** author heyunlin* version 1.0*/ public class Example {/*** 小写字母*/priv…

通信指挥类装备(多链路聚合设备)-应急通信指挥解决方案

现场通信指挥系统是一种功能全面的便携式音视频融合指挥通信平台&#xff0c;可实现现场应急救援指挥、多种通信手段融合、现场通信组网等功能&#xff0c;是现场指挥系统的延伸。 多链路聚合设备&#xff0c;是一款通信指挥类装备&#xff0c;具有 4G/5G&#xff0c;专网&…

ResNeXt

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 前面已经学习了resnet家族已经inception卷积网络&#xff0c;还简单了解了SE注意力机制&#xff0c;今天学习resnet和inception的组合ResNeXt。 …

Nodejs笔记2

模块化 模块化初体验 模块暴露数据 导入模块 fs 写绝对路径 require写相对路径不会受到影响 ./../不能省略 js 和json文件后缀可以省略 如果存在 命名相同的js和json文件&#xff0c;优先导入js文件 导入文件夹时的情况 require导入模块的基本流程 commonJS模块…

Nginx的正向代理与反向代理

你好呀&#xff0c;我是赵兴晨&#xff0c;文科程序员。 今天&#xff0c;我们将一起了解什么是Nginx的正向代理&#xff1f;什么是Nginx的反向代理&#xff1f;并实际动手实践。 以下内容都是满满的干货&#xff0c;绝对不容错过。我建议先收藏这篇文章&#xff0c;然后找一…