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。
码牛课堂也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线。大家可以进行参考学习:https://qr21.cn/FV7h05
①全方位,更合理的学习路径:
路线图包括ArkTS基础语法、鸿蒙应用APP开发、鸿蒙能力集APP开发、次开发多端部署开发、物联网开发等九大模块,六大实战项目贯穿始终,由浅入深,层层递进,深入理解鸿蒙开发原理!②多层次,更多的鸿蒙原生应用:
路线图将包含完全基于鸿蒙内核开发的应用,比如一次开发多端部署、自由流转、元服务、端云一体化等,多方位的学习内容让学生能够高效掌握鸿蒙开发,少走弯路,真正理解并应用鸿蒙的核心技术和理念。③实战化,更贴合企业需求的技术点:
学习路线图中的每一个技术点都能够紧贴企业需求,经过多次真实实践,每一个知识点、每一个项目,都是码牛课堂鸿蒙研发团队精心打磨和深度解析的成果,注重对学生的细致教学,每一步都确保学生能够真正理解和掌握。
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:https://qr21.cn/FV7h05
如何快速入门:
- 基本概念
- 构建第一个ArkTS应用
- ……
开发基础知识:https://qr21.cn/FV7h05
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ……
基于ArkTS 开发:https://qr21.cn/FV7h05
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- ……
鸿蒙开发面试真题(含参考答案):https://qr21.cn/FV7h05
大厂鸿蒙面试题::https://qr18.cn/F781PH
鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向
相关文章:

OpenHarmony 实战开发——3.1 Release + Linux 原厂内核Launcher起不来问题分析报告
1、关键字 Launcher 无法启动;原厂内核;Access Token ID; 2、问题描述 芯片:rk3566;rk3399 内核版本:Linux 4.19,是 RK 芯片原厂发布的 rk356x 4.19 稳定版内核 OH 版本:OpenHa…...

小猫咪邮件在线发送系统源码,支持添加附件
一款免登录发送邮件,支持发送附件,后台可添加邮箱,前台可选择发送邮箱 网站数据采取本地保存,所以使用前请给网站修改权限,否则很多功能将无法使用 安装教程: 1.上传服务器或者主机 2.登录后台,添加发送…...

Django REST framework(DRF)是什么?
Django REST framework(DRF)是什么? Django REST framework(简称DRF)是一个强大且灵活的工具包,用于构建Web API。它是基于Django(一个高级Python Web框架)构建的,提供了…...

用hMailServer+roundcubemail+宝塔安装配置一个自己的邮箱服务
用hMailServerroundcubemail安装配置一个自己的邮箱服务 1、准备工具与资料: 云服务器一台 基础配置就行 2核4G。域名一个 以下用lizipro.cn示例。hMailServer安装包roundcubemail安装包异常处理插件补丁: libmysql.zip 2、hMailServer服务安装&#…...

ctfshow 框架复现
文章目录 web 466web 467web 468web469web 470web 471web 472web 473web 474web 475web 476 web 466 Laravel5.4版本 ,提交数据需要base64编码 代码审计学习—Laravel5.4 - 先知社区 (aliyun.com) 用第二条链子 反序列化格式 /admin/序列化串base64<?php na…...

【Linux-IMX6ULL-DDR3简介测试-RGBLCD控制原理】
目录 1. DDR3 简介1.1 前要基本概念RAM & ROM 2. DDR3测试及初始化3. RGBLCD简介及控制原理3.1 RGBLCD简介3.2.1 RGB LCD时序3.2.2 像素时钟(800*400分辨率)3.2.2 显存(800*400分辨率) 3.3 RGBLCD的控制3.3.1 DOTCLK 硬件接口…...

贪心算法-----柠檬水找零
今日题目:leetcode860 题目链接:点击跳转题目 分析: 顾客只会给三种面值:5、10、20,先分类讨论 当收到5美元时:不用找零,面值5张数1当收到10美元时:找零5美元,面值5张数…...

MySQL技能树学习
在MySQL中,DDL(数据定义语言)用于定义数据库对象(如表、索引、视图等),DML(数据操纵语言)用于操作数据库中的数据(如插入、更新、删除数据),DQL&a…...

java 动态代理详解
cglib 动态代理 介绍 CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB 是一…...

Web路径专题
文章目录 Web路径专题什么是路径?绝对路径相对路径 如何使用路径?使用base标签 注意事项小结 Web路径专题 在Web开发中,路径是一个非常重要的概念。路径用来定位资源的位置,包括文件、目录、网页等。在本文中,我们将介…...

解决vue3项目打包后部署后某些静态资源图片不加载问题
目录 问题 原因 解决方案 问题 开发完项目打包并部署 然后访问时发现导航栏背景图片没加载 打开浏览器控制台发现这张图片报错404 原因 可能是因为在部署后的服务器环境中对中文文件名的支持不完善。服务器在解析 URL 时可能无法正确识别或编码中文字符,导致无…...

传感网应用开发教程--AT指令访问新大陆云平台(ESP8266模块+物联网云+TCP)
实现目标 1、熟悉AT指令 2、熟悉新大陆云平台新建项目 3、具体目标:(1)注册新大陆云平台;(2)新建一个联网方案为WIFI的项目;(3)ESP8266模块,通过AT指令访问…...

项目提交到空的git仓库流程
流程: # 初始化 Git 仓库 git init # 如果遇到 "detected dubious ownership" 的错误,可以添加 safe.directory 配置以解决 git config --global --add safe.directory T:/project/xxx # 将当前目录下的所有文件添加到 Git 暂存区 git add . …...

【Python】在Windows Server上部署Flask后端服务器
想要在Windows Server上部署flask应用,当然不能只下一个anaconda配完环境之后直接启动py文件,这样的话后台会有一段警告: * Serving Flask app app* Debug mode: off WARNING: This is a development server. Do not use it in a production …...

机器学习作业4——朴素贝叶斯分类器
目录 一、理论 一个例子: 二、代码 对于代码的解释: 1.fit函数: 2.predict函数: 三、实验结果 原因分析: 一、理论 朴素贝叶斯分类器基于贝叶斯定理进行分类,通过后验概率来判断将新数据归为哪一类。通过利用贝…...

BUU-[GXYCTF2019]Ping Ping Ping
考察点 命令执行 题目 解题 简单测试 ?ip应该是一个提示,那么就测试一下?ip127.0.0.1 http://0c02a46a-5ac2-45f5-99da-3d1b0b951307.node4.buuoj.cn:81/?ip127.0.0.1发现正常回显 列出文件 那么猜测一下可能会有命令执行漏洞,测试?ip127.0.…...

代码随想录Day 41|Leetcode|Python|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…...

【吴恩达机器学习-week2】多个变量的特征缩放和学习率问题
特征缩放和学习率(多变量) 目标 利用上一个实验中开发的多变量例程在具有多个特征的数据集上运行梯度下降探索学习率对梯度下降的影响通过 Z 分数归一化进行特征缩放,提高梯度下降的性能 import numpy as np np.set_printoptions(precisio…...

C#字符串的拼接
在C#中有多种拼接字符串的方式,今天小编就分享一些比较常用的。 方法1 string str "123"; str str "456"; 运行结果: "123456" 方法2 字符串与数字拼接 会将数字默认为字符串进行拼接 string str "123"; str str 1;…...

哈希表Hash table
哈希表是根据关键码的值而直接进行访问的数据结构。 数组就是⼀张哈希表。 哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示: 那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断⼀个元素是…...

jdk8新特性----Lambda表达式
一、介绍 1、简介 Java的Lambda表达式是Java 8引入的一个特性,它支持函数式编程,允许将函数作为方法的参数或返回值,从而简化了匿名内部类的使用,并提供了对并行编程的更好支持。 2、语法 Lambda表达式的使用前提是存在一…...

在STM32中用寄存器方式点亮流水灯
文章目录 实验资料一、对寄存器的理解1.通俗认识寄存器2.深入了解寄存器(1)端口配置低寄存器(配置0到7引脚的寄存器)(2)端口配置高寄存器(配置8到15引脚) 3.GPIO口的功能描述 二、配…...

TCP(TCP客户端、服务器如何通信)
一、TCP介绍 TCP的特点: 面向连接的协议:TCP是一种可靠的、面向连接的协议,在通信之前需要建立连接,以确保数据的可靠传输。这意味着在传输数据之前,发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…...

pdf 文件版面分析--PyMuPDF (python 文档解析提取)
1.介绍 PyMuPDF 和Fitz 是用于Python中处理PDF文件的相关模块。Fitz是P有MuPDF的字模块。提供一个简化和封装版本的P有MuPDF功能。 关系: PyMuPDF: 提供广泛的功能,用于操作PDF文档, 包括方便的高级函数与底层操作Fitz &#x…...

sql update 多表关联 inner join
当您需要更新一个表或者多个表中的数据,而多个表又存在关联时,可以使用 INNER JOIN 子句将多个表关联起来,并使用 SET更新。 格式如下: UPDATE table1 INNER JOIN table2 ON table1.column1 table2.column1 SET table1.column2…...

【OceanBase诊断调优】—— 租户资源统计项及其查询方法
本文主要介绍 OceanBase 数据库中租户资源统计项及其查询方法。 适用版本 OceanBase 数据库 V4.1.x、V4.2.x 版本。 CPU 资源统计项 逻辑 CPU 使用率(线程处理请求的时间占比)。 通过虚拟表 __all_virtual_sysstat 在 SYS 系统租户下,查看…...

【一键录音,轻松转换:用Python打造个性化音频记录工具】
在数字化时代,音频记录已成为日常学习、工作和娱乐不可或缺的一部分。想象一下,只需简单按下几个键,即可随时随地捕捉灵感,记录会议要点,或是珍藏孩子的童言稚语。本文将引领您步入Python编程的奇妙世界,展示如何借助几个强大的库,构建一个既简单又实用的音频录制及转换…...

Java类与对象(一)
类的定义与使用 在Java中使用关键字class定义一个类,格式如下: class 类名{// 成员变量/字段/属性//成员方法/行为 }Java中类和c语言中的结构体有点类似, 在Java中类名一般采用大驼峰(每个首字母大写)的形式…...

python中的装饰器,例子说明
在Python中,嵌套装饰器是指在一个函数上应用多个装饰器。每个装饰器都可以为函数添加一些特定的功能。以下是一个稍微复杂一些的例子,我们将创建一个记录日志和验证权限的嵌套装饰器。 ### 例子:记录日志和权限验证的嵌套装饰器 假设我们正…...

Leetcode经典题目之用队列实现栈
P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 目录 1、题目展示2、题目分析3、完整代码演示4、结语 1、题目展示 前面我们了解过如何实现队列…...