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.鸿蒙南向开发方向

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Spring的远程调用方式(如RMI、Hessian、Burlap等)

Spring框架提供了对多种远程调用技术的集成,使得开发者可以方便地在分布式系统中实现远程服务调用。以下是Spring支持的一些常见远程调用方式: 1. RMI (Remote Method Invocation) RMI是一种Java特有的远程调用技术,允许一个Java虚拟机上的…

【一站式学会Kotlin】第六节 lamda表达式、拖尾lamda表达式

一、 lamda 表达式的完整语法形式: val sum: (Int, Int) -> Int = {x: Int, y: Int -> x + y }(1)lamda表达式总是在花括号中 (2)完成的语法形式参数声明放在花括号内,(可选) (3)函数体跟在->后 (4)如果能推断出该lamda表达式的返回值类型不是Unit,那么该…

nginx文件夹内文件解释<一>

目录 linux中/etc/nginx/查询目录整体解释分目录解释Conf.d目录 linux中/etc/nginx/查询目录 [rootrelease nginx]# ls -l total 76 drwxr-xr-x 2 root root 4096 Mar 12 22:49 conf.d drwxr-xr-x 2 root root 4096 Nov 11 2022 default.d -rw-r--r-- 1 root root 1077 Nov 1…

vue中图片引入与使用几种方式

方法一&#xff1a;img 标签静态引入 朴实无华 <img src"../assets/img/logo.png" > 方法二&#xff1a;background-image 朴实无华2.0版 background-image: url("../assets/img/bg.jpg");方法三&#xff1a;require()方法 将编写代码时定义的路径…

elementui,iview等 表格单元格合并之固定列

要的效果如下 需要合并 show weak 及 Siginin这三列 上代码 <template><Table:columns"columns":span-method"handleSpan":data"data"bordersize"small"ref"table"></Table> </template> <sc…

R实验 基础(一)

实验目的&#xff1a; 了解实验报告书的书写要求&#xff1b;掌握R、RStudio的下载与安装&#xff1b;熟悉R的界面及基本操作&#xff1b;进一步熟悉R和RStudio的界面及基本操作&#xff1b;初步了解R的绘图和程序包的下载、安装和加载使用。 实验内容&#xff1a; 了解实验报…

Python sort() 和 sorted() 的区别应用实例详解

大家好&#xff0c;今天针对 Python 中 sort() 和 sorted() 之间的区别&#xff0c;来一个实例详细解读。sort — 顾名思义就是排序的意思&#xff0c;它可以接收的对象为可迭代的数据类型。今天以列表为例子演示两者的不同点、相同点&#xff0c;以及其中一些常用的高级参数使…

支付平台怎么应对DDOS攻击

支付平台怎么应对DDOS攻击?在数字化时代&#xff0c;支付平台已成为人们日常生活中不可或缺的一部分。然而&#xff0c;随着支付平台的广泛应用&#xff0c;其面临的安全威胁也日益严峻。其中&#xff0c;DDOS&#xff08;分布式拒绝服务攻击&#xff09;以其高隐蔽性、强破坏…

智慧武装三维实景电子沙盘系统

智慧武警实景三维电子沙盘系统是一个集成了先进三维建模技术、大数据分析、实时动态更新、交互操作以及高度安全可靠的综合性平台。它专为武警部队设计&#xff0c;旨在提供一个实战指挥和战术训练的基础平台支撑&#xff0c;以满足指战员在作战环境研究、标图作业、战法研究、…

Java 包装类型的缓存机制了解吗?

在 Java 中&#xff0c;基本数据类型有各自的包装类型。这些包装类型在某些情况下会使用缓存机制来提高性能。本文将详细探讨这些缓存机制的实现原理及其实际应用。 什么是包装类型的缓存机制&#xff1f; Java 的包装类型缓存机制是指在某些特定范围内&#xff0c;包装类型对…

【知识碎片】2024_05_14

本篇记录了两道关于位运算的选择题&#xff0c;和一道有点思维的代码题。 C语言碎片知识 求函数返回值&#xff0c;传入 -1 &#xff0c;则在64位机器上函数返回&#xff08; &#xff09; int func(int x) {int count 0;while (x){count;x x&(x - 1);//与运算} return c…

24/05/14总结

签到2&#xff1a; 签到界面上有时间显示&#xff0c;签到码输入框&#xff0c;开始签到&#xff0c;当倒计时结束&#xff0c;老师端和学生端都会显示签到结果&#xff0c;所以签到结果需要建表&#xff1a;&#xff08;签到了的学生和未签到的学生&#xff0c; 这次签到的时间…

详述进程的地址空间

进程的地址空间 合法的地址 (可读或可写) 代码 (main, %rip 会从此处取出待执行的指令)&#xff0c;只读数据 (static int x)&#xff0c;读写堆栈 (int y)&#xff0c;读写运行时分配的内存 (???)&#xff0c;读写动态链接库 (???) 非法的地址 NULL&#xff0c;导致 se…

蓝桥杯第2357题——限高杆(多层图+dijkstra)

问题描述 某市有 &#x1d45b; 个路口, 有 &#x1d45a; 段道路连接这些路口, 组成了该市的公路系统。其 中一段道路两端一定连接两个不同的路口。道路中间不会穿过路口。 由于各种原因, 在一部分道路的中间设置了一些限高杆, 有限高杆的路段 货车无法通过。 在该市有两个…

【微命令】git config如何配置全局的用户和邮箱?(--global user.name、user.email;git config --help)

虽然经常用&#xff0c;也经常忘记&#xff0c;特此记录。 命令 git config --global user.name "myname" git config --global user.email test163.com另外一种方式 help git config --help |grep email | grep name直接help查看

Git系列:git log 掌握版本控制的精髓

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【科普】ChatGPT-4o 是什么?和之前的ChatGPT4.0有什么区别,各有什么优劣势

文章目录 前言一、ChatGPT-4o 是什么&#xff1f;**主要特点和改进**&#xff1a; 二、ChatGPT-4o 和之前的ChatGPT4.0有什么区别&#xff0c;各有什么优劣势区别优势和劣势ChatGPT-4.0ChatGPT-4o 前言 5月13日&#xff0c;ChatGPT-4o发布&#xff0c;是人工智能的进一步发展&…

【leetcode面试经典150题】-27. 移除元素

88.合并两个有序数组 1 题目介绍1 个人解题思路1.1 解题代码1.2 思路解析 2、分析官方题解2.1 单侧双指针2.2 双侧双指针 1 题目介绍 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外…

Echarts结课之小杨总结版

Echarts结课之小杨总结版 前言基础回顾框架sale框架代码&#xff1a; user框架基础代码&#xff1a; inventory框架基础代码&#xff1a; total框架基础代码&#xff1a; 基础设置1.标题(Title)2.图例(Legend)实现 3.工具提示(Tooltip)实现 4.X轴(X Axis) 和 Y轴(Y Axis)5.数据…

「Qt Widget中文示例指南」如何实现一个快捷编辑器(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 快捷编辑器示例展示…