harmony 鸿蒙方舟字节码文件格式

  • 2025-06-12
  • 浏览 (4)

方舟字节码文件格式

本文详细介绍了方舟字节码文件的格式,旨在帮助开发者深入了解构成字节码文件的各个部分,从而指导开发者进行字节码的分析和修改工作。

约束

本文内容基于方舟字节码版本号12.0.6.0(版本号为方舟编译器内部保留字段,开发者无需关注,仅供准确对照之用)。

字节码文件数据类型

方舟字节码使用了多种基础和复合数据类型,以下为常见类型的定义和说明。

整型

名称 说明
uint8_t 8-bit无符号整数。
uint16_t 16-bit无符号整数,采用小端字节序。
uint32_t 32-bit无符号整数,采用小端字节序。
uleb128 leb128编码的无符号整数。
sleb128 leb128编码的有符号整数。

字符串

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
utf16_length uleb128 值为len << 1 \|is_ascii,其中len是字符串在UTF-16编码中的大小,is_ascii标记该字符串是否仅包含ASCII字符。
data uint8_t[] 以’\0’结尾的MUTF-8编码字符序列。

TaggedValue

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
tag uint8_t 表示数据种类的标记。
data uint8_t[] 根据不同的标记,data是不同类型的数据或者为空。

TypeDescriptor

TypeDescriptor是类(Class)名称的格式,由'L''_'ClassName';'组成:L_ClassName;。其中,ClassName是类的全名,名字中的'.'会被替换为'/'

字节码文件布局

字节码文件起始于Header结构。文件中的所有结构均可以从Header出发,直接或间接地访问到。字节码文件中结构的引用方式包括偏移量和索引。偏移量是一个32位长度的值,表示当前结构的起始位置在字节码文件中相对于文件头的偏移,从0开始计算。索引是一个16位长度的值,表示当前结构在索引区域中的位置,此机制将在IndexSection章节描述。

字节码文件中所有的多字节值均采用小端字节序。

Header

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
magic uint8_t[8] 文件头魔数,值必须是'P' 'A' 'N' 'D' 'A' '\0' '\0' '\0'
checksum uint32_t 字节码文件除文件头魔数和本校验字段之外的内容的adler32校验和。
version uint8_t[4] 字节码文件的版本号(Version)。
file_size uint32_t 字节码文件的大小,以字节为单位。
foreign_off uint32_t 偏移量,指向外部区域。外部区域中仅包含类型为ForeignClassForeignMethod的元素。foreign_off指向该区域的第一个元素。
foreign_size uint32_t 外部区域的大小,以字节为单位。
num_classes uint32_t ClassIndex结构中元素的数量,即文件中定义的Class的数量。
class_idx_off uint32_t 偏移量,指向ClassIndex
num_lnps uint32_t LineNumberProgramIndex结构中元素的数量,即文件中定义的Line number program的数量。
lnp_idx_off uint32_t 偏移量,指向LineNumberProgramIndex
reserved uint32_t 方舟字节码文件内部使用的保留字段。
reserved uint32_t 方舟字节码文件内部使用的保留字段。
num_index_regions uint32_t IndexSection结构中元素的数量,即文件中IndexHeader的数量。
index_section_off uint32_t 偏移量,指向IndexSection

Version

字节码版本号由4个部分组成,格式为:主版本号.次版本号.特性版本号.编译版本号

名称 格式 说明
主版本号 uint8_t 标识整体架构调整引入的字节码文件格式变更。
次版本号 uint8_t 标识局部架构调整或者重大特性调整引入的字节码文件格式变更。
特性版本号 uint8_t 标识中小特性引入的字节码文件格式变更。
编译版本号 uint8_t 标识缺陷修复引入的字节码文件格式变更。

ForeignClass

描述字节码文件中的外部类。外部类在其他文件中声明,并在当前字节码文件中被引用。

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
name String 外部类的名称,命名遵循TypeDescriptor语法。

ForeignMethod

描述字节码文件中的外部方法。外部方法在其他文件中声明,并在当前字节码文件中被引用。

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
class_idx uint16_t 一个指向该方法所从属的类的索引,指向一个在ClassRegionIndex中的位置,该位置的值是一个指向ClassForeignClass的偏移量。
reserved uint16_t 方舟字节码文件内部使用的保留字段。
name_off uint32_t 一个偏移量,指向字符串,表示方法名称。
index_data uleb128 方法的MethodIndexData数据。

注意:

通过ForeignMethod的偏移量,可以找到适当的IndexHeader以解析class_idx

ClassIndex

ClassIndex结构的作用是通过名称快速地定位到Class的定义。

  • 对齐方式:4个字节。
  • 格式:
名称 格式 说明
offsets uint32_t[] 一个数组,数组中每个元素的值是一个指向Class的偏移量。数组中的元素根据类的名称进行排序,名称遵循TypeDescriptor语法。数组长度由Header中的num_classes指定。

Class

在字节码文件中,一个类可以表示方舟字节码的一个源代码文件或者一种内置的Annotation。当表示源代码文件时,类的方法对应源代码文件中的函数,类的字段对应源文件中的内部信息;当表示内置的Annotation时,类中不包含字段与方法。源代码文件中的一个类在字节码文件中表示为一个对应其构造函数的方法。

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
name String Class的名称,命名遵循TypeDescriptor语法。
reserved uint32_t 方舟字节码文件内部使用的保留字段。
access_flags uleb128 Class的访问标志,是ClassAccessFlag的组合。
num_fields uleb128 Class的字段的数量。
num_methods uleb128 Class的方法的数量。
class_data TaggedValue[] 不定长度的数组,数组中每个元素都是TaggedValue类型,元素的标记是ClassTag类型,数组中的元素按照标记递增排序(0x00标记除外)。
fields Field[] Class的字段的数组,数组中每一个元素都是Field类型。数组长度由num_fields指定。
methods Method[] Class的方法的数组,数组中每一个元素都是Method类型。数组长度由num_methods指定。

ClassAccessFlag

名称 说明
ACC_PUBLIC 0x0001 默认属性,方舟字节码中的Class均具备此标志。
ACC_ANNOTATION 0x2000 声明该类为Annotation类型。

ClassTag

  • 对齐方式:单字节对齐。
  • 格式:
名称 数量 格式 说明
NOTHING 0x00 1 none 拥有此标记的TaggedValue,是其所在class_data的最后一项。
SOURCE_LANG 0x02 0-1 uint8_t 拥有此标记的TaggedValuedata是0,表示源码语言是ArkTS/TS/JS。
SOURCE_FILE 0x07 0-1 uint32_t 拥有此标记的TaggedValuedata是一个偏移量,指向字符串,表示源文件的名称。

注意:

ClassTag是class_data中元素(TaggedValue)所具备的标记,表头中的“数量”指的是在某一个Classclass_data中拥有此标记的元素出现的次数。

Field

描述字节码文件中的字段。

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
class_idx uint16_t 一个指向该字段从属的类的索引,指向一个在ClassRegionIndex中的位置,该位置的值是Type类型,是一个指向Class的偏移量。
type_idx uint16_t 一个指向定义该字段的类型的索引,指向一个在ClassRegionIndex中的位置,该位置的值是Type类型。
name_off uint32_t 一个偏移量,指向字符串,表示字段的名称。
reserved uleb128 方舟字节码文件内部使用的保留字段。
field_data TaggedValue[] 不定长度的数组,数组中每个元素都是TaggedValue类型,元素的标记是FieldTag类型,数组中的元素按照标记递增排序(0x00标记除外)。

注意:

通过Field的偏移量,可以找到适当的IndexHeader以解析class_idxtype_idx

FieldTag

  • 对齐方式:单字节对齐。
  • 格式:
名称 数量 格式 说明
NOTHING 0x00 1 none 拥有此标记的TaggedValue,是其所在field_data的最后一项。
INT_VALUE 0x01 0-1 sleb128 拥有此标记的TaggedValuedata的类型为booleanbytecharshortint
VALUE 0x02 0-1 uint32_t 拥有此标记的TaggedValuedata的类型为Value formats中的FLOATID

注意:

FieldTag是field_data中元素(TaggedValue)所具备的标记,表头中的“数量”指的是在某一个Fieldfield_data中拥有此标记的元素出现的次数。

Method

描述字节码文件中的方法。

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
class_idx uint16_t 一个指向该方法所从属的类的索引,指向一个在ClassRegionIndex中的位置,该位置的值是Type类型,是一个指向Class的偏移量。
reserved uint16_t 方舟字节码文件内部使用的保留字段。
name_off uint32_t 一个偏移量,指向字符串,表示方法名称。
index_data uleb128 方法的MethodIndexData数据。
method_data TaggedValue[] 不定长度的数组,数组中每个元素都是TaggedValue类型,元素的标记是MethodTag类型,数组中的元素按照标记递增排序(0x00标记除外)。

注意:

通过Method的偏移量,可以找到适当的IndexHeader以解析class_idx

MethodIndexData

MethodIndexData是一个无符号32位整数,划分为3个部分。

名称 格式 说明
0 - 15 header_index uint16_t 指向一个在IndexSection中的位置,该位置的值是IndexHeader。通过IndexHeader可以找到该方法引用的所有方法(Method)、字符串或字面量数组(LiteralArray)的偏移量。
16 - 23 function_kind uint8_t 表示方法的函数类型(FunctionKind)。
24 - 31 reserved uint8_t 方舟字节码文件内部使用的保留字段。

FunctionKind

名称 说明
FUNCTION 0x1 普通函数。
NC_FUNCTION 0x2 普通箭头函数。
GENERATOR_FUNCTION 0x3 生成器函数。
ASYNC_FUNCTION 0x4 异步函数。
ASYNC_GENERATOR_FUNCTION 0x5 异步生成器函数。
ASYNC_NC_FUNCTION 0x6 异步箭头函数。
CONCURRENT_FUNCTION 0x7 并发函数。

MethodTag

名称 数量 格式 说明
NOTHING 0x00 1 none 拥有此标记的TaggedValue,是其所在method_data的最后一项。
CODE 0x01 0-1 uint32_t 拥有此标记的TaggedValuedata是一个偏移量,指向Code,表示方法的代码段。
SOURCE_LANG 0x02 0-1 uint8_t 拥有此标记的TaggedValuedata是0,表示源码语言是ArkTS/TS/JS。
DEBUG_INFO 0x05 0-1 uint32_t 拥有此标记的TaggedValuedata是一个偏移量,指向DebugInfo,表示方法的调试信息。
ANNOTATION 0x06 >=0 uint32_t 拥有此标记的TaggedValuedata是一个偏移量,指向Annotation, 表示方法的注解。

注意:

MethodTag是method_data中元素(TaggedValue)所具备的标记,表头中的“数量”指的是在某一个Methodmethod_data中拥有此标记的元素出现的次数。

Code

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
num_vregs uleb128 寄存器的数量,存放入参和默认参数的寄存器不计算在内。
num_args uleb128 入参和默认参数的总数量。
code_size uleb128 所有指令的总大小,以字节为单位。
tries_size uleb128 try_blocks数组的长度,即TryBlock的数量。
instructions uint8_t[] 所有指令的数组。
try_blocks TryBlock[] 一个数组,数组中每一个元素都是TryBlock类型。

TryBlock

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
start_pc uleb128 TryBlock的第一条指令距离其所在Codeinstructions的起始位置的偏移量。
length uleb128 TryBlock的大小,以字节为单位。
num_catches uleb128 与TryBlock关联的CatchBlock的数量,值为1。
catch_blocks CatchBlock[] 与TryBlock关联的CatchBlock的数组,数组中有且仅有一个可以捕获所有类型的异常的CatchBlock。

CatchBlock

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
type_idx uleb128 值是0,表示此CatchBlock块捕获了所有类型的异常。
handler_pc uleb128 异常处理逻辑的第一条指令的程序计数器。
code_size uleb128 此CatchBlock的大小,以字节为单位。

Annotation

描述一个注解结构。

  • 对齐方式:单字节对齐
  • 格式:
名称 格式 说明
class_idx uint16_t 一个指向当前Annotation所从属的类的索引,指向一个在ClassRegionIndex中的位置,该位置的值是Type类型,是一个指向Class的偏移量。
count uint16_t elements数组的长度。
elements AnnotationElement[] 一个数组,数组的每个元素都是AnnotationElement类型。
element_types uint8_t[] 一个数组,数组的每个元素都是AnnotationElementTag类型,用于描述一个AnnotationElement。每个元素在element_types数组中的位置和其对应的AnnotationElement在elements数组中的位置一致。

注意:

通过Annotation的偏移量,可以找到适当的IndexHeader以解析class_idx

AnnotationElementTag

名称 标记
u1 '1'
i8 '2'
u8 '3'
i16 '4'
u16 '5'
i32 '6'
u32 '7'
i64 '8'
u64 '9'
f32 'A'
f64 'B'
string 'C'
method 'E'
annotation 'G'
literalarray '#'
unknown '0'

AnnotationElement

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
name_off uint32_t 一个偏移量,指向字符串,表示注解元素的名称。
value uint32_t 注解元素的值,若值的宽度不超过32位,则此处存储值本身。否则,此处存储的值为指向Value formats格式的偏移量。

Value formats

不同的值类型,有不同的值编码格式,包括INTEGER, LONG, FLOAT, DOUBLE, ID。

名称 格式 说明
INTEGER uint32_t 有符号的四字节整数值。
LONG uint64_t 有符号的八字节整数值。
FLOAT uint32_t 四字节位模式,向右零扩展,系统会将其解译为 IEEE754 32 位浮点值。
DOUBLE uint64_t 八字节位模式,向右零扩展,系统会将其解译为 IEEE754 64 位浮点值。
ID uint32_t 四字节位模式,表示文件中某个结构的偏移量。

LineNumberProgramIndex

行号程序索引(LineNumberProgramIndex)结构是一个数组,便于使用更紧凑的索引访问行号程序(Line number program)。

  • 对齐方式:4个字节。
  • 格式:
名称 格式 说明
offsets uint32_t[] 一个数组,数组中每个元素的值是一个偏移量,指向一个行号程序。数组长度由Header中的num_lnps指定。

DebugInfo

调试信息(DebugInfo)包含方法的程序计数器与源代码中的行列号之间的映射以及有关局部变量的信息。调试信息的格式由DWARF调试信息格式第3版(见第6.2项)的内容演变形成。基于状态机(State machine)的执行模型对行号程序(Line number program)进行解释,可得到映射和局部变量信息编码。为对不同方法的相同行号程序进行去重,程序中引用的所有常量都被移动到了常量池(Constant pool)中。

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
line_start uleb128 状态机的行号寄存器的初始值。
num_parameters uleb128 入参和默认参数的总数量。
parameters uleb128[] 存放方法入参的名称的数组,数组长度是num_parameters。每一个元素的值是字符串的偏移量或者0,如果是0,则代表对应的参数不具有名称。
constant_pool_size uleb128 常量池的大小,以字节为单位。
constant_pool uleb128[] 存放常量池数据的数组,数组长度是constant_pool_size
line_number_program_idx uleb128 一个索引,指向一个在LineNumberProgramIndex中的位置,该位置的值是一个指向Line number program的偏移量。Line number program的长度可变,以END_SEQUENCE操作码结束。

Constant pool

常量池(Constant pool)是DebugInfo中存放常量的结构。很多方法都具有相似的行号程序,其区别仅在于变量名、变量类型和文件名。为了对这类行号程序进行去重,程序中引用的所有常量都存储在常量池。在解释程序时,状态机维护一个指向常量池的指针。当状态机解释一条需要常量参数的指令时,会从内存常量池指针指向的位置读取值,然后递增指针。

State machine

状态机(State machine)的作用是产生DebugInfo信息。状态机中有以下的寄存器:

名称 初始值 说明
address 0 程序计数器(指向方法的某个指令),只能单调递增。
line DebugInfo的属性line_start的值 无符号整数,对应源码中的行号。所有的行都是从1开始编号,因此寄存器的值不能小于1。
column 0 无符号整数,对应源码中的列号。
file class_data(参见Class)中SOURCE_FILE标记的值,或者0 一个偏移量,指向字符串,表示源文件的名称。如果没有文件名信息(Class中没有SOURCE_FILE标记),那么寄存器的值是0。
source_code 0 一个偏移量,指向字符串,表示源文件的源码。如果没有源码信息,那么寄存器的值是0。
constant_pool_ptr DebugInfo中常量池的第一个字节的地址 指向当前常量值的指针。

Line number program

一个行号程序(Line number program)由指令组成。每条指令都包含一个字节的操作码以及可选参数。根据操作码的不同,参数的值可能被编码在指令中(称为指令参数),或者需要从常量池中获取(称为常量池参数)。

操作码 指令参数 常量池参数 参数说明 说明
END_SEQUENCE 0x00 标记行号程序的结束。
ADVANCE_PC 0x01 uleb128 addr_diff addr_diffaddress寄存器的值待增加的数值。 address寄存器中的值加上addr_diff,指向下一个地址,而不生成位置条目。
ADVANCE_LINE 0x02 sleb128 line_diff line_diffline寄存器的值待增加的数值。 line寄存器中的值加上line_diff,指向下一个行位置,而不生成位置条目。
START_LOCAL 0x03 sleb128 register_num uleb128 name_idx
uleb128 type_idx
register_num:将包含局部变量的寄存器。
name_idx:一个偏移量,指向字符串,表示变量的名称。
type_idx:一个偏移量,指向字符串,表示变量的类型。
在当前地址中引入一个带有名称和类型的局部变量。将要包含这个变量的寄存器的编号被编码在指令中。如果寄存器的编号是-1,则意味着这个是累加器寄存器。name_idxtype_idx的值可能是0,如果是0,则代表着对应的信息是不存在的。
START_LOCAL_EXTENDED 0x04 sleb128 register_num uleb128 name_idx
uleb128 type_idx
uleb128 sig_idx
register_num:将包含局部变量的寄存器。
name_idx:一个偏移量,指向字符串,表示变量的名称。
type_idx:一个偏移量,指向字符串,表示变量的类型。
sig_idx:一个偏移量,指向字符串,表示变量的签名。
在当前地址中引入一个带有名称、类型和签名的局部变量。将要包含这个变量的寄存器的编号被编码在指令中。如果寄存器的编号是-1,则意味着这个是累加器寄存器。name_idxtype_idxsig_idx的值可能是0,如果是0,则代表着对应的信息是不存在的。
END_LOCAL 0x05 sleb128 register_num register_num:包含局部变量的寄存器。 在当前地址将指定寄存器中的局部变量标记为超出范围。寄存器的编号为-1,则意味着是累加器寄存器。
SET_FILE 0x09 uleb128 name_idx name_idx:一个偏移量,指向字符串,表示文件的名称。 设置file寄存器的值。name_idx的值可能是0,如果是0,则代表着对应的信息是不存在的。
SET_SOURCE_CODE 0x0a uleb128 source_idx source_idx:一个偏移量,指向字符串,表示文件的源码。 设置source_code寄存器的值。source_idx的值可能是0,如果是0,则代表着对应的信息是不存在的。
SET_COLUMN 0x0b uleb128 column_num column_num:待设置的列号。 设置column寄存器的值,并生成一个位置条目。
特殊操作码 0x0c..0xff 使 lineaddress 寄存器指向下一个地址,并生成一个位置条目。详情参阅下文中的说明。

对于值在0x0c0xff(含)之间的特殊操作码,状态机按照以下步骤将lineaddress寄存器移动一小部分,然后生成一个新的位置条目(参见DWARF调试信息格式第3版第6.2.5.1项 Special Opcodes):

步骤序号 操作 说明
1 adjusted_opcode = opcode - OPCODE_BASE 计算调整后的操作码。OPCODE_BASE的值是0x0c,是第一个特殊操作码。
2 address += adjusted_opcode / LINE_RANGE 增加address寄存器中的值。LINE_RANGE的值是15,用来计算行号信息的变化。
3 line += LINE_BASE + (adjusted_opcode % LINE_RANGE) 增加line寄存器中的值。LINE_BASE的值是-4,是最小的行号增量值;最大的行号增量值是LINE_BASE + LINE_RANGE - 1
4 生成一个新的位置条目。

注意:

特殊操作码计算方式:(line_increment - LINE_BASE) + (address_increment * LINE_RANGE) + OPCODE_BASE

IndexSection

通常情况下,字节码文件的各个结构使用32位偏移量来引用,当一个结构引用另一个结构时,需要在当前结构中记录被引用结构的32位偏移量。为了减小文件体积,字节码文件被分割成多个索引区域(Index region),每个索引区域内的结构使用16位索引。IndexSection结构描述了索引区域的集合。

  • 对齐方式:4个字节。
  • 格式:
名称 格式 说明
headers IndexHeader[] 一个数组,数组中每个元素是IndexHeader类型。数组中的元素根据区域的起始偏移量进行排序。数组长度由Header中的num_index_regions指定。

IndexHeader

每个IndexHeader结构描述一个索引区域。每个索引区域都有两类索引:指向Type的索引和指向方法、字符串或者字面量数组的索引。

  • 对齐方式:4个字节。
  • 格式:
名称 格式 说明
start_off uint32_t 该区域的起始偏移量。
end_off uint32_t 该区域的结束偏移量。
class_region_idx_size uint32_t 该区域的ClassRegionIndex中元素的数量,最大值为65536。
class_region_idx_off uint32_t 一个偏移量,指向ClassRegionIndex
method_string_literal_region_idx_size uint32_t 该区域的MethodStringLiteralRegionIndex中元素的数量,最大值为65536。
method_string_literal_region_idx_off uint32_t 一个偏移量,指向MethodStringLiteralRegionIndex
reserved uint32_t 方舟字节码文件内部使用的保留字段。
reserved uint32_t 方舟字节码文件内部使用的保留字段。
reserved uint32_t 方舟字节码文件内部使用的保留字段。
reserved uint32_t 方舟字节码文件内部使用的保留字段。

ClassRegionIndex

ClassRegionIndex结构的作用是允许通过更紧凑的索引,找到对应的Type

  • 对齐方式:4个字节。
  • 格式:
名称 格式 说明
types Type[] 一个数组,数组中每个元素都是Type类型。数组长度由IndexHeader中的class_region_idx_size指定。

Type

表示一个基本类型编码或一个指向Class的偏移量,是一个32位的值。

基本类型采用以下方式编码:

类型 编码
u1 0x00
i8 0x01
u8 0x02
i16 0x03
u16 0x04
i32 0x05
u32 0x06
f32 0x07
f64 0x08
i64 0x09
u64 0x0a
any 0x0c

MethodStringLiteralRegionIndex

MethodStringLiteralRegionIndex结构的作用是允许通过更紧凑的索引,找到对应的方法、字符串或者字面量数组。

  • 对齐方式:4个字节。
  • 格式:
名称 格式 说明
offsets uint32_t[] 一个数组,数组中每个元素的值是一个偏移量,指向方法、字符串或者字面量数组。数组长度由IndexHeader中的method_string_literal_region_idx_size指定。

LiteralArray

描述字节码文件中的字面量数组。

  • 对齐方式:单字节对齐。
  • 格式:
名称 格式 说明
num_literals uint32_t literals数组的长度。
literals Literal[] 一个数组,数组的每个元素都是Literal类型。

Literal

描述字节码文件中的字面量,根据字面量值的字节数的不同,有四种编码格式,分别是单字节编码、双字节编码、四字节编码、八字节编码。根据不同数值长度对应相适应的编译格式,优化字节码文件大小。

  • 对齐方式:每种格式都有对应的对齐规则。
  • 格式:
名称 格式 说明
单字节编码 uint8_t 单字节的值,单字节对齐,存储用于简单类型的字面量,例如BOOL字面量。
双字节编码 uint16_t 双字节的值,2个字节对齐,存储16位整型字面量。
四字节编码 uint32_t 四字节的值,4个字节对齐,存储32位数值字面量,例如INTEGER整数型字面量,或FLOAT浮点型字面量。
八字节编码 uint64_t 八字节的值,8个字节对齐,存储64位数值字面量,例如DOUBLE双精度浮点型字面量。

你可能感兴趣的鸿蒙文章

harmony 鸿蒙ArkTS(方舟编程语言)

harmony 鸿蒙在build-profile.json5中配置arkOptions

harmony 鸿蒙异步锁

harmony 鸿蒙方舟字节码函数命名规则

harmony 鸿蒙方舟字节码基本原理

harmony 鸿蒙方舟字节码概述

harmony 鸿蒙共享容器

harmony 鸿蒙异步等待

harmony 鸿蒙ArkTS跨语言交互

harmony 鸿蒙动态加载

0  赞