“客户都不怕,你们怕什么”——汽车软件静态分析价值的反思

原创 水轻言 2024-11-04 07:11
原话是这样的,“老板和我们说终端客户不怕死,整车厂不怕死,你们怕什么”。

这是前段时间,和在某Tier 1的功能安全专家聊内部对功能安全的态度时,听到的一句略带无奈的话,有调侃下的偏见,但也反映了当今汽车行业的一个倾向——看得见的好才是好。

整车大跃进下,大量的开发验证工作必然要被裁剪掉,擅长“权衡之术”的我们非常自然地将诸如功能安全、网络安全、ASPICE这种追求规矩严谨但价值解释成本较高的东西给权衡掉

毕竟,“很先进”的敏捷最主要的目标就是交付价值。

今天我们聊的静态代码分析也属于这类。



1
静态分析就是MISRA吗?

面对这个问题,我们知道二者在实际工作中结合得比较紧密,但估计总隐隐约约觉得这种理解有些片面。概念的界定很重要。


首先,顾名思义,很容易理解“静态分析就是不运行程序的情况下对代码进行评估的过程”这个定义。


其次,我们再把它聚焦在汽车软件的语境里。先看下汽车电子与软件三大重要标准里的一些描述。


  • ASPICE 4.1:

软件单元验证措施的例子包括静态分析、代码评审和单元测试。其中,静态分析可以根据MISRA规则集和其他编码标准进行。


  • ISO 26262:

软件单元验证方法包含走查、结对编程、检查、半形式验证、形式验证、控制流分析、数据流分析、静态代码分析、基于抽象解释的静态分析、基于需求的测试、接口测试、故障注入测试、资源使用评估、在模型和代码之间背靠背对比测试(如果适用)。


静态分析是一个集合术语,包括诸如搜索源代码文本或模型以查找与已知故障匹配的模式或符合建模或编码指南的分析。


基于抽象解释的静态分析是扩展静态分析的集合术语,包括诸如通过添加语义信息来扩展编译器分析树之类的分析,这些语义信息可以检查是否违反了定义的规则(例如,数据类型问题、未初始化的变量);包括控制流图生成和数据流分析(例如,捕获与竞争条件和死锁、指针误用相关的故障)、或甚至元编译及抽象代码/模型解释。


  • ISO/SAE 21434

对于网络安全所适用的设计、建模或编程语言,若语言本身未涵盖相关标准,则应通过设计、建模和编码指南,或由开发环境来补充这些标准。


例如,在“C”编程语言中进行安全编码时,应使用MISRA C或CERT C。


尽管国外标准翻译成中文后,语法排布上总有些拗口,但总结以上,我们还是可以得出汽车软件语境里共识的三个信息:


  • 静态分析是软件单元验证的一种或一部分,处于汽车软件测试的最下一层级


  • 静态分析是基于包括MISRA C但不限于此的内置规则集(比如,MISRA C++/AC、AUTOSAR C++、CERT C/C++、HIS)进行代码成分分析与质量判断的过程,会使用到控制流分析、数据流分析、抽象语法等技术手段。


  • 静态分析在对安全性与可靠性要求较高、以C/C++为基础的汽车嵌入式软件中,尤其是功能安全与网络安全机制较多的产品或代码部分,更具价值。而通常认为,Java语言相比较C/C++,没有那么多未定义或未明确的行为,不存在类似MISRA这类普遍接受的安全类标准,对Java的静态分析主要集中在攻防相关的代码漏洞上。


狭义或按照当前项目实操来看,在汽车嵌入式软件开发中,静态代码分析多数是基于MISRA C/C++这一套规则进行自动化扫描后的评估与修改。



2
不做会怎么样?

在初步了解它是什么后,接下来,我们就经常会被问到如标题这个问题,我知道大概怎么回事了,但不做行不行?尤其是近两年不景气的光景下。


说实话,并不好回答,这就是我前面所讲的价值解释成本高。我不敢说,俄罗斯轮盘赌中的第一枪没响,第二枪会不会响,因为很多软件问题并不具备必然的因果律。


而且,当项目经理或总监拿着已经有很多打穿的枪窟窿要我填时,我很难有理由说服对方甚至自己,把血淋淋的枪窟窿先放下,去预防吧。


所以,我们不妨先稍稍搁置争议,换一种思路,如果不做静态分析,我们要做什么呢?


很显然,是运行程序的动态测试,尤其是价值体现最直观的基于功能需求的测试


但是,各位同仁们,大家扪心自问下,我们已经这样做了这么六七年了,Bug属实发现了不少,但是不是常常处于亡羊补牢的事后救火中。


还会出现,为了补枪窟窿,不停地挨枪,不断引入新问题,而且有大量的问题是偶发性的,无法复现,也永远无法得到修复,但人、钱、时间都已经并会继续花掉,原本想节省的时间和成本并没有省下来。


面对这个现状,我们想想还有什么办法没?质量左移、CICDCT、DevOps、代码级验证、白盒测试通常是可考虑的方案,而静态分析又是其中不可或缺的手段。


回到本节的问题,不做静态分析或者违反了编码规则确实不一定会给软件带来Bug,实际软件乃至实车上是否出现Bug取决于违规的性质、程度以及软件其他部分如何与违规代码交互


比如,有些违规可能只是导致代码的可读性降低或维护性变差,而并不会直接引发Bug,但一些涉及内存管理、类型转换或指针操作类违规,则很有可能导致严重的运行时错误或安全漏洞


还有个观点是,编码整体上呈现出不断犯同样的错误的现象,比如,已经存在了40年的缓存区溢出依然是当今安全漏洞的核心成员。


提高软件质量最有效的办法就是研究过去的错误,并在未来规避。


我们不能盲目地认为自己的程序员比那些制定、迭代行业标准(最佳实践)的人群更加聪明,也不能没心肝地觉得身处当今卷生卷死环境下的程序员不会犯无数程序员犯过的错误,更不能在大众传媒“颠覆性创新”这样的词汇里把一切过去的当作落后的。


实际上,软件工程几乎所有的方法论都认为:开发人员应该在早期(比如,Code Review之前)对代码进行静态检查与分析,从而将一些一般性缺陷控制在软件发布之前。


此外,在汽车软件越来越多、逐渐走向车联万物的过程中,网络安全的重要性在逐年提升(或许还需要一件大的热点事件来刺激),而黑客攻击的落脚点就是代码,代码漏洞修复的重要性不言而喻。


写到这里,或许感受到了静态分析的好的一方面,但趋利避害的大家确实都很聪明,质疑或不愿意做的背后一定有更丰富的理由,我们继续探讨。




3
为什么不喜欢做?

除了价值解释成本高这个表象之外,在汽车软件领域的实践中,还有哪些不受欢迎的点?

我们将落地过程中的问题,总结如下。

3.1 门槛高

静态分析在实践上的要求起点相对较高,除了会用工具外,不但需要安全及产品方面的知识,还需要更多的关于软件开发的知识,诸如对编译原理、数理逻辑或对应的编程语言等方面的理解。

但现实中,懂安全的多数不是从程序员走过来的,而程序员又很多是脱离产品,甚至脱离行业的。

这就会让静态分析在开展、沟通、解释、说服、理解过程中充满障碍。


3.2 误报率高

静态分析是基于逻辑推理的,再加上架构逻辑与功能定义越来越复杂,静态分析对代码上下文、运行时环境及跨模块交互行为理解的局限性更加突出。

一般我们很难仅仅通过对代码的静态分析就还原出程序的所有行为(这在计算复杂性理论里也已经有过证明)。

其中,误报率高是静态分析受人诟病的最大问题之一

3.3 解决成本高

门槛高、误报率高都会带来额外成本,这里我们聚焦在识别出潜在问题后的处理解决上。

首先,每次静态分析动辄会扫出几千几万条违反规则项,其中存在着很多误报或可偏差的内容,海量数据的一条条分析自然耗时耗力。

其次,在汽车行业花时间花钱做一件事情,需要更全盘和更纵深的考虑,需要考虑客户、考虑整车、考虑造车等等远非程序员care的东西,但这些角色会直接评判你的工作意义。

此时,结果表达(汇报)就意义非凡了,因为这些职能角色多数不会理解“循环计数器不应有实质上的浮点类型”是为何物。然而,现有的工具在结果表达上普遍不够亲民易懂。

最后,种种原因下,静态代码类问题常常没有嵌入到常规的缺陷解决流程或ALM工具中,这导致问题的跟踪、解决都比较耗体力。



4
一些优化的方法

针对以上问题,我们可以尝试以下的一些方法:


4.1 定制及优化规则集


在整个开发周期中,软件会进行多版本的迭代,所以,除了对最新行业标准的解读,更应该结合产品特点、编码习惯和经验教训,对规则进行抑制、修改和补充。比如,可以通过忽略特定文件、函数或非功能安全相关以及不变更的模块等手段来抑制误报。



4.2 调整分析敏感度平衡漏报与误报


专业的静态分析工具有很强大的自定义能力,允许客户调整分析参数,比如,敏感度阈值、分析深度等,这可一定程度上控制漏报与误报数量。


此外,一些工具还有诸如路径敏感分析、上下文敏感分析等功能,也可以帮助提升分析精度。



4.3 定制报告格式


如前所述,结果的展示非常重要。报告应清晰展示分析结果,包括问题类型、严重程度、所在模块、修复建议等,并支持导出为多种格式(如EXCEL、PDF、HTML),便于不同角色的查阅和跟踪。



4.4 集成到工具链


将静态分析工具集成到现有的开发工具链中,是实现自动化、持续质量监控的关键。通过与IDE、Jenkins、JIRA、SVN、GIT等无缝对接,并设置代码质量指标门禁,让每次代码提交都自动触发静态分析,可驱动团队及时发现并修复问题。



4.5 利用AI来解释结果


ChatGPT等AI技术的兴起,为静态分析结果的解释提供了新的可能,比如,解释静态分析发现的复杂问题,并为开发人员提供修复建议,或者对潜在车辆问题进行预测,以解释其价值。


以上都是一些不错的思路,但真实落地需要不少的专业人士一定时间的研究性质的工作,成本不会低,比如,有能力选择适合的专业静态分析工具,并可对其高级功能进行设置的人就是少数,经常需要依赖工具厂商。

所以,对工具功能的封装与友好前端的设计非常有意义,我们并不需要那么多人花费那么多学习成本在这类细分专业领域里。



5
一些关键的代码指标

无论是静态分析还是动态测试,最终的指向和落脚其实就是软件质量,而不管是从管理的可操作上,还是质量的评判上,具体、量化通常必不可少。

所以,在实操中,行业一般会抽取、总结出来一些核心的代码度量指标,然后可利用静态分析的技术或工具进行输出,以从这个侧面评价软件的质量水平。

实际上,从静态分析的视角来看,这也是其入门的尝试和进一步落地的捷径,明确可见、可量化的指标既然是管理的抓手,也就更容易得到管理上资源的支持。

本节会总结一些常用的汽车嵌入式软件的代码指标,以供参考。


5.1 每个函数的语句数


该指标是指函数内部语句的个数,是一种基础的代码复杂度度量方式。在多数语言中,我们可以使用工具自动计算语句个数。


常见语句包含以下类型:


  • 以分号(;)结尾的简单语句

  • if语句

  • for语句

  • while语句

  • do语句

  • switch语句

  • break语句

  • continue语句

  • return语句

  • goto语句


语句个数应尽量维持在10~20,最多不要超过50



5.2 return语句的数量


为了提高代码的可读性,我们最好遵循“单一出口原则”,也就是尽量保证一个函数只有一个出口点(函数结束执行的地方)。


出口点通常是return语句,所以我们也建议尽量减少其数量,比如,一个函数的return维持在1~2个之内



5.3 代码行长度


写文章要短句,是为了便于阅读。代码也是一样,太长的代码行会明显增加阅读代码的难度,很现实的问题是,需要开发人员左右滚动屏幕


在保证合理的逻辑、换行和缩进的前提下,要尽可能将长代码拆分。通常,低于160个字符的代码行可以认为是一个合理目标。



5.4 圈复杂度


圈复杂度是指通过源代码线性独立路径的个数,也是用来衡量代码复杂度。


如何计算呢?我们过以下3个代码控制流图来看。



一种计算公式为,圈复杂度M=控制流图边数E-节点N+2


故,


  • 图1:M=1-2+2=1,即无判定节点,圈复杂度为1。

  • 图2M=4-4+2=2,即一个判定节点圈复杂度为2

  • 图3:M=7-6+2=3,即两个判定节点,圈复杂度为3


除了评价本身代码判定逻辑的复杂性之外,圈复杂度还能够用来确定最少需要多少个测试用例来满足分支和路径的覆盖度。


一般经验是,圈复杂度应小于10,以达到较好的可测性



5.5 非循环路径数


这个指标也被称为NPATH,是指通过软件所有可能路径的数量。其中,循环中的循环(for, while, do-while)只访问一次。


因此,NPATH也给出了达到路径覆盖所需的测试用例的最大数量。而圈复杂度给出了测试用例的最小数量。


如下图,对应的圈复杂度和NPATH分别为3和4。NPATH建议限制在80个以内




5.6 每个函数的嵌套级别


嵌套级别用来描述函数之间调用的深度层次。


当引入控制结构(if, while…)时,就会发生嵌套,每将控制结构放置在其他控制结构内部一次,嵌套级别就会增加一次。


以下为一个嵌套级别为2的代码段示意。


if (a < K) {

    if (b > L) {

        function);

    }

}

嵌套级别建议不超过4。



5.7 调用图递归


调用图是软件工程中用于表示函数调用关系的有向图,它显示了哪个函数调用了哪个函数。


调用图内部的递归是一个函数直接或间接(通过至少一个其他函数)再次调用自身的模式。


递归是一种很好的编程技巧,但在嵌入式中有一些缺点。


要想停止递归时,必须有一个结束条件,否则,递归将导致应用程序崩溃,但是,无论是直接递归还是间接递归,确定结束条件并不容易


此外,由于递归算法需要更多的函数调用和堆栈操作,其使用会造成性能阻塞、可读性差或堆栈溢出等问题。


一般不建议使用递归



5.8 不同函数的调用次数


更多的函数调用必然带来更大的复杂性,整体最好不超过7次



5.9 参数数量


参数的数量是函数复杂性和接口复杂性的另一个指标。存在的参数越多,就越容易在调用函数时出错,比如,参数顺序错误。


如果函数参数超过了5个,可以试着把函数分成使用较少参数的逻辑部分。



5.10 goto语句


goto语句可以使程序直接跳转到同一函数中的预定义位置。


goto是一个很有争议的语句。在处理错误或跳出多层循环时,有很直接的效果,但非逻辑性的跳转会让代码很难理解、出了错误也很难追踪。


所以,通常强烈建议不要使用goto语句



5.11 注释密度


除了从语句结构上降低外,代码复杂度还有一种应对方式是代码注释。


函数功能的文本化描述就是注释,这显然有助于理解代码。特别地,代码已经长时间没有被修改,或者代码必须由原始编写人分析或修改时,这些注释更加有用。


一种算法是,注释密度是指第一个语句之后找到的注释数量与语句数量之间的比率,20%是一个可参考的下限。




6
全文小结

这是一篇有关汽车软件静态分析价值反思的文章

首先,描述了包括静态分析在内的一系列“好得不明显”的工作在行业里不受重视的现状。

然后,针对汽车软件领域这个特定语境下的静态分析概念、价值及弊端进行了总结与思考。

顺着弊端,提供了一些优化思路,但也应明确静态分析工具的专业化和由此而来的高门槛限制了这些思路的落地。

最后总结了11个典型的汽车行业代码指标,以让静态分析的工作更具体、更有指向性。



7
写在最后

我始终认为工具是平衡人性与规则、平衡敏捷与标准化的最好方法

对于静态代码分析这样一件在关键处颇有价值但还是有一点昂贵的事情,一个快速扫描的、兼顾精度的、容易二次开发的、界面友好的、易于上手的、报告简单易懂的,甚至嵌入AI大语言模型的工具非常有价值,这也是我们国产工具链的机会


关注公众号,点击公众号主页右上角“ ··· ”,设置星标,实时获取公众号“水轻言”最新文章。




了解更多

Corax是由蜚语安全自主研发的代码安全分析平台 ,不同于传统基于模式匹配的静态代码分析产品,Corax通过引入符号执行、函数摘要、污点分析、路径可达性分析、数据流分析、自然语言处理等前沿的程序分析和人工智能技术增强了自身在处理程序语义信息上的能力,Corax对于代码的建模与分析更加精准高效。能够准确快速地帮助企业解决代码质量与代码安全问题。


水轻言 致力于汽车软件研发管理。
评论
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 80浏览
  • 【工程师故事】+半年的经历依然忧伤,带着焦虑和绝望  对于一个企业来说,赚钱才是第一位的,对于一个人来说,赚钱也是第一位的。因为企业要活下去,因为个人也要活下去。企业打不了倒闭。个人还是要吃饭的。企业倒闭了,打不了从头再来。个人失业了,面对的不仅是房贷车贷和教育,还有找工作的焦虑。企业说,一个公司倒闭了,说明不了什么,这是正常的一个现象。个人说,一个中年男人失业了,面对的压力太大了,焦虑会摧毁你的一切。企业说,是个公司倒闭了,也不是什么大的问题,只不过是这些公司经营有问题吧。
    curton 2025-01-02 23:08 228浏览
  • 前言近年来,随着汽车工业的快速发展,尤其是新能源汽车与智能汽车领域的崛起,汽车安全标准和认证要求日益严格,应用范围愈加广泛。ISO 26262和ISO 21448作为两个重要的汽车安全标准,它们在“系统安全”中扮演的角色各自不同,但又有一定交集。在智能网联汽车的高级辅助驾驶系统(ADAS)应用中,理解这两个标准的区别及其相互关系,对于保障车辆的安全性至关重要。ISO 26262:汽车功能安全的基石如图2.1所示,ISO 26262对“功能安全”的定义解释为:不存在由于电子/电气系统失效引起的危害
    广电计量 2025-01-02 17:18 195浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 124浏览
  • Matter加持:新世代串流装置如何改变智能家居体验?随着现在智能家庭快速成长,串流装置(Streaming Device,以下简称Streaming Device)除了提供更卓越的影音体验,越来越多厂商开始推出支持Matter标准的串流产品,使其能作为智能家庭中枢,连结多种智能家电。消费者可以透过Matter的功能执行多样化功能,例如:开关灯、控制窗帘、对讲机开门,以及操作所有支持Matter的智能家电。此外,再搭配语音遥控器与语音助理,打造出一个更加智能、便捷的居家生活。支持Matter协议
    百佳泰测试实验室 2025-01-03 10:29 102浏览
  • 影像质量应用于多个不同领域,无论是在娱乐、医疗或工业应用中,高质量的影像都是决策的关键基础。清晰的影像不仅能提升观看体验,还能保证关键细节的准确传达,例如:在医学影像中,它对诊断结果有着直接的影响!不仅如此,影像质量还影响了:▶ 压缩技术▶ 存储需求▶ 传输效率随着技术进步,影像质量的标准不断提高,对于研究与开发领域,理解并提升影像质量已成为不可忽视的重要课题。在图像处理的过程中,硬件与软件除了各自扮演着不可或缺的基础角色,有效地协作能够确保图像处理过程既高效又具有优异的质量。软硬件各扮演了什么
    百佳泰测试实验室 2025-01-03 10:39 83浏览
  • 国际标准IPC 标准:IPC-A-600:规定了印刷电路板制造过程中的质量要求和验收标准,涵盖材料、外观、尺寸、焊接、表面处理等方面。IPC-2221/2222:IPC-2221 提供了用于设计印刷电路板的一般原则和要求,IPC-2222 则针对高可靠性电子产品的设计提供了进一步的指导。IPC-6012:详细定义了刚性基板和柔性基板的要求,包括材料、工艺、尺寸、层次结构、特征等。IPC-4101:定义了印刷电路板的基板材料的物理和电气特性。IPC-7351:提供了元件封装的设计规范,包括封装尺寸
    Jeffreyzhang123 2025-01-02 16:50 174浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 134浏览
  • 本文继续介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。查看系统版本信息查看操作系统版本信息root@ido:/# cat /etc/*releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=20.04DISTRIB_CODENAME=focalDIS
    Industio_触觉智能 2025-01-03 11:37 97浏览
  • 从无到有:智能手机的早期探索无线电话装置的诞生:1902 年,美国人内森・斯塔布菲尔德在肯塔基州制成了第一个无线电话装置,这是人类对 “手机” 技术最早的探索。第一部移动手机问世:1938 年,美国贝尔实验室为美国军方制成了世界上第一部 “移动” 手机。民用手机的出现:1973 年 4 月 3 日,摩托罗拉工程师马丁・库珀在纽约曼哈顿街头手持世界上第一台民用手机摩托罗拉 DynaTAC 8000X 的原型机,给竞争对手 AT&T 公司的朋友打了一个电话。这款手机重 2 磅,通话时间仅能支持半小时
    Jeffreyzhang123 2025-01-02 16:41 156浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 123浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 114浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 84浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦