HarmonyOS Next 方舟字节码文件格式先容

张裕  金牌会员 | 2025-2-22 20:06:53 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 670|帖子 670|积分 2010

在开辟中,可读的编程语言要编译成二进制的字节码格式才能被呆板识别。在HarmonyOS Next开辟中,arkts会编译成方舟字节码。方舟字节码长什么样呢?我们以一个demo编译出的abc文件:

二进制就是长这样,怎么去理解呢?就需要理解方舟字节码的文件格式。
字节码文件结构

上面图中看到有个可以熟悉的几个字母PANDA,什么意思呢?先了解下字节码文件结构。
字节码文件起始于Header结构。文件中的全部结构均可以从Header出发,直接或间接地访问到。字节码文件中结构的引用方式包罗偏移量和索引。偏移量是一个32位长度的值,表现当前结构的起始位置在字节码文件中相对于文件头的间隔,从0开始计算。索引是一个16位长度的值,表现当前结构在索引区域中的位置。
Header

先来看看Header结构:
名称格式说明magicuint8_t[8]文件头魔数,值必须是’P’ ‘A’ ‘N’ ‘D’ ‘A’ ‘\0’ ‘\0’ ‘\0’。checksumuint32_t字节码文件除文件头魔数和本校验字段之外的内容的adler32校验和。versionuint8_t[4]字节码文件的版本号 (Version) 。file_sizeuint32_t字节码文件的大小,以字节为单元。foreign_offuint32_t一个偏移量,指向外部区域。外部区域中仅包含范例为ForeignClass或ForeignMethod的元素。foreign_off指向该区域的第一个元素。foreign_sizeuint32_t外部区域的大小,以字节为单元。num_classesuint32_tClassIndex结构中元素的数量,即文件中定义的Class的数量。class_idx_offuint32_t一个偏移量,指向ClassIndex。num_lnpsuint32_tLineNumberProgramIndex结构中元素的数量,即文件中定义的Line number program的数量。lnp_idx_offuint32_t一个偏移量,指向LineNumberProgramIndex。reserveduint32_t方舟字节码文件内部使用的保存字段。reserveduint32_t方舟字节码文件内部使用的保存字段。num_index_regionsuint32_tIndexSection结构中元素的数量,即文件中IndexHeader的数量。index_section_offuint32_t一个偏移量,指向IndexSection。

  • magic:最开始的0x50、0x41、0x4e、0x44、0x41对应的就是PANDA的ASCII码,接下来是三个0
  • checksum:四个字节的校验位0x5d、0xe8、0xde、0xdf
  • version:自个字节的版本号0x0C、0x00、0x06、0x00

Version

字节码版本号由4个部分组成,格式为:主版本号.次版本号.特性版本号.编译版本号。
名称格式说明主版本号uint8_t标识整体架构调解引入的字节码文件格式变更。次版本号uint8_t标识局部架构调解或者庞大特性调解引入的字节码文件格式变更。特性版本号uint8_t标识中小特性引入的字节码文件格式变更。编译版本号uint8_t标识缺陷修复引入的字节码文件格式变更。 ForeignClass

形貌字节码文件中的外部类。外部类在其他文件中声明,并在当前字节码文件中被引用。
名称格式说明nameString外部类的名称,命名遵循TypeDescriptor语法。 ForeignMethod

形貌字节码文件中的外部方法。外部方法在其他文件中声明,并在当前字节码文件中被引用。
名称格式说明class_idxuint16_t一个指向该方法所附属的类的索引,指向一个在ClassRegionIndex中的位置,该位置的值是一个指向Class或ForeignClass的偏移量。reserveduint16_t方舟字节码文件内部使用的保存字段。name_offuint32_t一个偏移量,指向字符串,表现方法名称。index_datauleb128方法的MethodIndexData数据。通过ForeignMethod的偏移量,可以找到适当的IndexHeader以剖析class_idx。 别的还有Class、Class、ClassAccessFlag、ClassTag、Field、FieldTag、Method、MethodIndexData、MethodTag、Code、TryBlock、CatchBlock、Annotation、AnnotationElementTag、AnnotationElement、Value formats、LineNumberProgramIndex、DebugInfo、IndexSection、IndexHeader、ClassRegionIndex、Type、MethodStringLiteralRegionIndex、LiteralArray、Literal,这里不一一先容。
接下来先容下字节码文件数据范例。
字节码文件数据范例

整型

名称说明uint8_t8-bit无符号整数。uint16_t16-bit无符号整数,接纳小端字节序。uint32_t32-bit无符号整数,接纳小端字节序。uleb128leb128编码的无符号整数。sleb128leb128编码的有符号整数。 字符串

名称格式说明utf16_lengthuleb128值为len << 1 | is_ascii,其中len是字符串在UTF-16编码中的大小,is_ascii标志该字符串是否仅包含ASCII字符,大概的值是0或1。datauint8_t[]以’\0’末端的MUTF-8编码字符序列。 TaggedValue

名称格式说明taguint8_t表现数据种类的标志。datauint8_t[]根据不同的标志,data是不同范例的数据或者为空。 字节码文件中全部的多字节值均接纳小端字节序。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表