Google is committed to advancing racial equity for Black communities. See how.

FIDL attributes

The following FIDL attributes are supported:


An attribute precedes a FIDL element, for example:

[MaxBytes = "64"]
struct MyType {

It's used to either modify the characteristics of the element, or provide documentation.


Attributes may include multiple values, and multiple attributes may be specified in the same element, for example:

[Discoverable, Transport = "Channel"]

Illustrates both aspects: * there are two attributes, Discoverable and Transport, and * the Transport attribute takes a value from the list enumerated below.


USAGE: [Deprecated]



USAGE: [Discoverable]

MEANING: Causes the service's name to be made available for lookup. A service with a [Discoverable] attribute can be found at run-time. That is to say, you can "request" this service, and zircon will locate it and provide access to it.


USAGE: [Doc = "string"]

MEANING: In FIDL, comments can start with two ("//") or three slashes ("///"), or they can be embodied within a [Doc] attribute. The two-slash variant does not propagate the comments to the generated target, whereas both the three-slash and [Doc] variants do.

That is:

/// Foo
struct WithThreeSlashes {


[Doc = "Foo"]
struct WithAttribute {

have the same effect — one ("///") is syntactic sugar for the other. The text of the comment is emitted into the generated code, in a manner compatible with the syntax of the target language.


USAGE: [Internal]

MEANING: This marks internal libraries, such as library zx. It should be used only by Fuchsia developers.


USAGE: [ForDeprecatedCBindings]

MEANING: This attribute is used to ensure that a protocol is compatible with the deprecated C bindings. There should be no new uses of this attribute.

protocol SimpleProtocol {
    DynamicCountOfFixedArguments(vector<uint8>:1024 inputs);


USAGE: [MaxBytes = "number"]

MEANING: This attribute is used to limit the number of bytes that can be transferred in a message. The compiler will issue an error if the number of bytes exceeds this limit.


USAGE: [MaxHandles = "number"]

MEANING: This attribute is used to limit the number of handles that can be transferred in a message. The compiler will issue an error if the number of handles exceeds this limit.


USAGE: [Selector = "selector"]

MEANING: Allows you to change the hashing basis for the method ordinal, see FTP-020.

It can be used to rename a method without breaking ABI compatibility. For example, if we wish to rename the Investigate method to Experiment in the Science interface, we can write:

protocol Science {
    [Selector = "Investigate"] Experiment();

It can also be used for union variants to keep ABI compatibility in the same way.


USAGE: [Transitional = "description"]

MEANING: Instructs bindings to generate code that will successfully build, regardless of whether the method is implemented or not. FTP-021 contains more details.


USAGE: [Transport = "tranportList"]

MEANING: Allows you to select a transport. Provide a comma-separated list of values, selected from:

  • Channel — use a Zircon channel.
  • Syscall — transport used to specify that the protocol is used to define Zircon syscalls, rather than typical IPC.

The default is Channel if none specified. If you do specify a value or values, then only those values are used (e.g., specifying [Transport="Foo"] disables Channel and uses only Foo).