| 编辑推荐: |
文章主要介绍了一款用Python开发的、可高效解析和查询AUTOSAR ARXML配置文件(支持FEE/NVM模块导出及多种格式输出)的命令行工具及其源码获取方式,希望对你的学习有帮助。
本文来自于嵌入式软件实战派,由火龙果软件Alice编辑,推荐。 |
|
ARXML,你肯定知道,它的全称是 AUTOSAR XML,是 AUTOSAR标准中定义的一种特殊的 XML 文件格式。
我们在做AUTOSAR开发时,在配置工具上的操作配置,实际上的结果是更改到ARXML上,然后再根据ARXML生成相应的代码等。
可以简单地理解,这玩意在汽车电子系统中是灵魂般存在。既然它这么重要这么牛逼,肯定是不简单的。
但是,你不想掰开它,看看里面有什么吗?
好奇的,不仅仅只有你,我也非常想知道它里面长啥样。
ARXML本质是XML格式,但是当你用文本打开它时,看着就想发昏,简直就不是给人看的。
工欲善其事必先利其器。于是,我就探索如何解开这个ARXML的工具。
我们是用V厂的DaVinci工具的,直接打开Configurator或者Developer就可以查看配置信息。但是这两个玩意,笨重了不说,还每次都要连接license,有时候我只是想查看一点点配置参数而已,就像用牛刀杀鸡一般。 用着极其不爽!
当然,V厂还有个配套的叫什么XML Editor的玩意,看起来也挺好,比DaVinci轻量一点点,但是也要license一直供着,但凡断开license一会,这个软件就自动退出了。 用着极其不爽!
后来,我在VSCODE的插件市场里面找到一个叫ARXML的插件,它只能将ARXML以树形结构展开,还不能看里面的参数,而且这个树形结构内容还不能复制出来哈。 用着极其不爽!
找不到趁手的武器,我还不能造一件么!不是说Python除了生孩子外,什么事都可以做的吗。于是,我就用它写了一个命令行脚本。
现在做到了这些功能:
- 通过ARXML的 ARPATH方式精确查询
- 将ARXML内容以树形结构形式输出到界面上,还能导出html、csv、json、md和dot等格式文档
- 个性化地导出Fee的配置内容
- 个性化地导出 NVM 的配置内容
以下是这个软件的详细介绍哈!
🚀 核心亮点
1. SAX解析,性能卓越
传统 DOM解析 会将整个XML加载到内存,对于几十MB的ARXML文件极易导致内存溢出。本工具采用 SAX事件驱动 ,流式读取,即使处理超大文件也游刃有余。同时通过精心设计的节点栈和帧栈,完美还原了元素的树状结构,确保每个节点都能正确挂载。
2. 清晰的树形展示
支持将ARXML结构以树形形式输出到控制台,或导出为 JSON、HTML、Markdown、CSV、 Graphviz DOT 等多种格式。
- 控制台输出:层级分明,附带节点类型和ARPATH,一目了然。
- HTML导出:生成可折叠的交互式树,鼠标悬停显示文件位置、UUID等详细信息,方便团队分享。
- DOT导出:可转换为可视化拓扑图,直观展示模块间的引用关系。
3. ARPATH快速定位
每个节点都有唯一的ARPATH(例如 /ActiveEcuC/NvM/NvMCommon ),工具支持 精确或模糊查询 ,瞬间定位到目标节点,并打印其所有子节点。再也不用在文本编辑器中“Ctrl+F”几十次了。
4. 交互式Shell
输入 arxml interactive your.arxml 即可进入交互模式,像操作命令行一样连续输入ARPATH查询,边查边看,适合探索性分析。
5. 模块化提取器
针对常见的基础软件模块(如FEE、NVM),工具内置了专门的提取器,一键生成 结构化的 CSV 表格 ,可直接用于Excel分析或脚本处理。
- FEE 提取 :支持导出Partition配置、Block配置或合并导出,自动识别 FeePartitionConfiguration 和 FeeBlockConfiguration 容器,提取关键参数(布局、对齐、扇区大小等)。
- NVM提取 :支持导出Common参数(NvMCommon、NvMCommonVendorParams)、各个NVM块(NvMBlockDescriptor)配置,并自动解析NVM块关联的Fee块名称。
6. 子命令设计,上手即用
遵循“一个命令,多种功能”的理念,所有操作均通过子命令完成,无需记忆复杂参数组合:
arxml tree
arxml arpath
arxml interactive
arxml fee
arxml nvm
|
每个子命令都有详尽的帮助信息( cli <cmd> -h ),并支持多个文件同时解析。
🛠️ 典型使用场景
场景一:快速了解一个陌生ARXML文件的内容
arxml tree sample.arxml --depth 3
|
输出效果:
文件: sample.arxml
└── AUTOSAR (AUTOSAR) [/]
└── ActiveEcuC (AR-PACKAGE) [/ActiveEcuC]
└── NvM (ECUC-MODULE-CONFIGURATION-VALUES) [/ActiveEcuC/NvM]
├── NvMConfigBlock (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMConfigBlock]
├── NvMCommon (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMCommon]
├── NvMCommonVendorParams (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMCommonVendorParams]
├── NvMBlockDescriptor (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor]
├── NvMBlockDescriptor_001 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor_001]
├── NvMBlockDescriptor_002 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor_002]
├── NvMBlockDescriptor_003 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor_003]
├── NvMBlockDescriptor_004 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor_004]
├── NvMBlockDescriptor_005 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor_005]
├── NvMBlockDescriptor_006 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor_006]
├── NvMBlockDescriptor_007 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor_007]
├── NvMBlockDescriptor_008 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor_008]
├── NvMBlockDescriptor_009 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/NvMBlockDescriptor_009]
├── StartApplication_NvMBlock1 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/StartApplication_NvMBlock1]
└── StartApplication_NvMBlock2 (ECUC-CONTAINER-VALUE) [/ActiveEcuC/NvM/StartApplication_NvMBlock2]
|
场景二:导出带交互界面的HTML树,供同事评审
arxml tree sample.arxml --output tree.html --format html
|
生成的HTML文件可在浏览器中打开,点击节点可展开/折叠,鼠标悬停显示元数据,方便非技术人员查阅。 效果大概如下
场景三:提取NVM模块所有块配置
arxml nvm nvm.arxml --nvm-blocks --output nvm_blocks.csv
|
输出的CSV包含每个块的名称、关联的Fee块名称、块大小、CRC类型、优先级等所有配置参数。
场景四:同时处理多个文件,合并提取FEE配置
arxml fee fee1.arxml fee2.arxml --fee --output fee_all.csv
|
工具会将所有文件中的FEE配置合并到一个CSV文件中,并自动去重(基于ARPATH)。
场景五:交互式探索,寻找特定参数
arxml interactive sample.arxml
arpath> /ActiveEcuC/NvM/NvMCommon
|
立即显示 NvMCommon 容器的所有参数及子节点,无需翻阅原始XML。
--- 结果 1 ---
名称: NvMCommon
ARPATH: /ActiveEcuC/NvM/NvMCommon
元素类型: ECUC-CONTAINER-VALUE
文件: sample.arxml
位置: 行 125, 列 12
子节点数: 18
UUID: 66e205d7-7b2d-49bc-a1bb-d8cb7a63d0a7
定义: /MICROSAR/NvM/NvMCommon
子节点:
NvMApiConfigClass -> /ActiveEcuC/NvM/NvMCommon/NvMApiConfigClass
NvMBswMMultiBlockJobStatusInformation -> /ActiveEcuC/NvM/NvMCommon/NvMBswMMultiBlockJobStatusInformation
NvMCompiledConfigId -> /ActiveEcuC/NvM/NvMCommon/NvMCompiledConfigId
NvMCrcNumOfBytes -> /ActiveEcuC/NvM/NvMCommon/NvMCrcNumOfBytes
NvMDatasetSelectionBits -> /ActiveEcuC/NvM/NvMCommon/NvMDatasetSelectionBits
NvMDevErrorDetect -> /ActiveEcuC/NvM/NvMCommon/NvMDevErrorDetect
NvMDrvModeSwitch -> /ActiveEcuC/NvM/NvMCommon/NvMDrvModeSwitch
NvMDynamicConfiguration -> /ActiveEcuC/NvM/NvMCommon/NvMDynamicConfiguration
NvMJobPrioritization -> /ActiveEcuC/NvM/NvMCommon/NvMJobPrioritization
NvMPollingMode -> /ActiveEcuC/NvM/NvMCommon/NvMPollingMode
NvMSetRamBlockStatusApi -> /ActiveEcuC/NvM/NvMCommon/NvMSetRamBlockStatusApi
NvMSizeStandardJobQueue -> /ActiveEcuC/NvM/NvMCommon/NvMSizeStandardJobQueue
NvMVersionInfoApi -> /ActiveEcuC/NvM/NvMCommon/NvMVersionInfoApi
NvMMaxNoOfWriteRetries -> /ActiveEcuC/NvM/NvMCommon/NvMMaxNoOfWriteRetries
NvMMainFunctionPeriod -> /ActiveEcuC/NvM/NvMCommon/NvMMainFunctionPeriod
NvMUseBlockIdCheck -> /ActiveEcuC/NvM/NvMCommon/NvMUseBlockIdCheck
NvMRepairRedundantBlocksApi -> /ActiveEcuC/NvM/NvMCommon/NvMRepairRedundantBlocksApi
NvMSafeBswChecks -> /ActiveEcuC/NvM/NvMCommon/NvMSafeBswChecks
|
🔧 技术内幕:为什么它又快又准?
SAX + 自定义状态机
我们放弃了DOM,采用SAX逐元素解析,通过 element_stack 和 node_stack 两个栈精确跟踪元素和节点的层次关系,确保即使在复杂的嵌套结构中也能正确构建节点树。
DEFINITION-REF 智能捕获
对于参数值节点(如 ECUC-NUMERICAL-PARAM-VALUE ),工具会捕获其 DEFINITION-REF 中的最后一部分作为节点名称(例如 NvMBlockSize ),而非使用冗长的原始元素名,大大增强了可读性。
ARPATH索引
所有节点在解析完成后自动生成ARPATH并建立索引,支持快速查找。索引支持路径变体(如 /A/B/C 、 B/C 、 C ),查询时无需完全匹配。
可扩展的提取器框架
新增模块只需继承 BaseExtractor ,实现 run 和 add_arguments 方法,并在 EXTRACTORS 字典中注册,即可无缝集成到命令行中。目前已支持FEE和NVM,后续可根据需求快速扩展WDG、ECUM、Can等模块。
🎯 未来展望
- 更多模块提取器 :WDG、ECUM、Can、Lin等常见BSW模块的配置提取。
- 图形化界面 :基于Electron或PyQt打造桌面应用,让非技术人员也能轻松浏览。
- 差异对比 :支持两个ARXML文件的差异比较,自动生成变更报告。
- 在线演示 :提供Web版Demo,无需安装即可体验核心功能。
👥 谁在用?
- AUTOSAR配置工程师 :快速验证配置正确性,批量导出配置参数。
- 软件集成工程师 :对比不同版本的ARXML文件,确保配置一致性。
- 测试人员 :从配置中提取测试用例所需的数据。
- 项目经理 :通过导出的HTML树直观了解配置范围。
🎉 结语
ARXML文件不应该成为开发路上的绊脚石。这款工具虽然小巧,却凝聚了我们对AUTOSAR配置管理的深刻理解。无论您是新手还是资深专家,它都能帮助您 更快、更准、更轻松 地处理ARXML文件。 现在就试试吧! 如果您有任何问题或建议,欢迎通过issue或邮件与我们交流。您的反馈是我们前进的动力。
以下是 arxml 命令行工具的使用方法速查表。所有子命令均支持 -v ( --verbose )选项输出详细解析信息。
| 子命令 | 用途 | 常用参数 | 示例 |
| tree |
以树形结构输出文件内容 |
--depth / -d :限制显示深度 --output / -o :导出到文件 --format / -f :导出格式(json/html/md/csv/dot) |
arxml tree sample.arxml arxml tree sample.arxml -d 3 arxml tree sample.arxml -o tree.html -f html |
| arpath |
根据 ARPATH 查询节点(支持模糊匹配) |
--arpath :要查询的路径(必须) |
arxml arpath --arpath /NvM/NvMCommon sample.arxml arxml arpath --arpath NvMBlockDescriptor sample.arxml |
| interactive |
进入交互式查询模式,连续输入 ARPATH 进行检索 |
无额外参数 |
arxml interactive sample.arxml 进入后输入 /NvM/NvMCommon 等路径即可 |
| fee |
提取 FEE 模块配置(Partition / Block) |
--fee-partitions :仅提取 Partition --fee-blocks :仅提取 Block --fee :合并提取(默认) --output / -o :输出文件 |
arxml fee fee.arxml --fee-partitions -o partitions.csv arxml fee fee.arxml --fee-blocks -o blocks.csv arxml fee fee.arxml --fee -o fee_all.csv |
| nvm |
提取 NVM 模块配置(Common / Blocks) |
--nvm-common :仅提取通用参数 --nvm-blocks :仅提取块配置 --nvm :合并提取(默认) --output / -o :输出文件 |
arxml nvm nvm.arxml --nvm-common -o nvm_common.csv arxml nvm nvm.arxml --nvm-blocks -o nvm_blocks.csv arxml nvm nvm.arxml --nvm -o nvm_all.csv |
全局选项 : -v / --verbose 可加在任意子命令前,输出详细解析过程(例如 arxml -v tree sample.arxml )。
温馨提示:
1. 源码允许做二次开发,做你喜欢的研究
2. 源码不允许用于再次售卖等商业行为(本人极其讨厌这种行为)
3. 本人精力有限,不承诺提供源码的支持服务,但欢迎提bug,提建议
4. nvm/fee子命令我只测过DaVinci生成的nvm/fee相关ARXML文件,暂不确定其他厂商做的ARXML是否兼容
二次开发小tips:
- 进行nvm/fee/nvm数据统计,甚至绘制存储分布图
- 对SWC进行解析,提取相关接口,甚至生成swc源码
- 提取CAN/LIN等信号关联关系
- ……
源码工具下载
|