การระบุภาษา

หน้านี้จะระบุภาษาที่ใช้นิยามอินเทอร์เฟซสำหรับบริการยานยนต์ (VSIDL) โดยใช้รูปแบบ Backus-Naur Form (EBNF) แบบขยายของ ISO/IEC 14977 และ protobuf หน้านี้จะเน้นที่ไวยากรณ์แบบไม่ขึ้นกับบริบทของภาษาและความหมายขององค์ประกอบภาษา

ลำดับชั้นของภาษา

ตาม Meta Object Facility (MOF) คอมไพเลอร์ VSIDL (VSIDLC) จะใช้ ภาษาที่แสดงในรูปที่ 1

ภาษา VSIDLC

รูปที่ 1 ภาษา VSIDLC

VSIDLC อิงตามภาษา บัฟเฟอร์โปรโตคอล (protobuf) เป็นหลัก protobuf ใช้เพื่อระบุประเภทข้อมูลที่จะแลกเปลี่ยนโดยใช้การเรียกใช้การเผยแพร่และสมัครรับข้อมูลและการเรียกใช้ Remote Procedure Calls (RPCs) จากมุมมองทางเทคนิค โมเดล VSIDL คือไฟล์ TextProto ซึ่งมีการกำหนดไวยากรณ์ของ VSIDL ในไฟล์ protobuf (syntax.proto) ทั้งไฟล์ protobuf สำหรับระบุประเภทข้อมูลและโมเดล VSIDL ใช้เพื่อสร้างโค้ด Rust โค้ดที่สร้างขึ้นจะมีโครงสร้างเป็นหลักซึ่งใช้โครงสร้างข้อมูลสำหรับข้อความที่แลกเปลี่ยนและฟังก์ชัน Rust ที่ใช้ฟังก์ชันสำหรับการสร้างหน่วยบริการใน Rust โดยไม่ต้องเรียกหน่วยบริการเหล่านี้โดยอัตโนมัติ โค้ด Rust ที่สร้างขึ้นนี้มาพร้อมกับโค้ด Rust ที่กำหนดเองซึ่งใช้โค้ดที่สร้างขึ้นเพื่อสร้างอินสแตนซ์หน่วยบริการและใช้ตรรกะทางธุรกิจของแอปพลิเคชัน

ไวยากรณ์นามธรรม

รูปที่ 2 แสดงประเภทข้อความหลักใน VSIDL

ประเภทข้อความหลักใน VSIDL

รูปที่ 2 ประเภทข้อความหลักใน VSIDL

รายการ VSIDL

ส่วนนี้จะอธิบายประเภทข้อความรายการ VSIDL

ไวยากรณ์ EBNF

start VsidlEntry =
  "package" , ":" , String , ";" ,
  { "service_bundle" , ServiceBundle } ,
  { "extension" , ":" , Any } ,
  { "some_ip_mapping" , ":" , SomeIpMapping } ,
  { "vhal_mapping" , ":" , VhalMapping }
;

คำจำกัดความของ Proto

// The root message for VSIDL files
message VsidlEntry {
  // Required. Package name for entities mentioned in the file.
  string package = 1;
  // Enables custom extensions beyond the standard VSIDL model.
  repeated google.protobuf.Any extension = 3;

  // SOMEIP mapping rules
  repeated sdv.someip.v1.SomeIpMapping some_ip_mapping = 4;
  // VHAL mapping rules
  repeated VhalMapping vhal_mapping = 5;
  // List of SDV service bundles defined in the file.
  repeated ServiceBundle service_bundle = 6;
}

ตัวอย่างการใช้งาน

package: "com.android.sdv.sample.vsidl"

service_bundle {
  name: "Manager"

  publisher {
    message: "TirePressure"
    topic: "front-left"
    topic: "front-right"
    capacity: 10
  }
}

คำอธิบาย

ข้อความ VsidlEntry ทำหน้าที่เป็นคอนเทนเนอร์รูทสำหรับไฟล์ VSIDL (นามสกุล .vsidl) ข้อความนี้จะห่อหุ้มคำจำกัดความและการกำหนดค่าทั้งหมดในไฟล์ VSIDL ไฟล์เดียว VsidlEntry เป็นองค์ประกอบระดับบนสุดที่ผูกทุกอย่างเข้าด้วยกัน

Purpose:

  • กำหนดโครงสร้างโดยรวมของไฟล์ VSIDL
  • ระบุเนมสเปซของแพ็กเกจสำหรับเอนทิตีทั้งหมดภายในไฟล์
  • มีคอลเล็กชันคำจำกัดความของแพ็กเกจบริการ
  • อนุญาตให้ใช้ส่วนขยายที่กำหนดเองกับโมเดล VSIDL
  • รวมกฎการแมปสำหรับ SOME/IP และ VHAL

ข้อจำกัด

  • ชื่อแพ็กเกจ (E211): ชื่อแพ็กเกจต้องมีความยาวไม่เกิน 127 อักขระ
  • ไฟล์ที่ไม่ได้อ้างอิง (E10B): ต้องอ้างอิงไฟล์ทั้งหมดในแคตตาล็อกในไฟล์กลุ่ม Android.bp

แพ็กเกจบริการ

ส่วนนี้จะอธิบายประเภทข้อความแพ็กเกจบริการ

ไวยากรณ์ EBNF

ServiceBundle = "{" , { ServiceBundleElement } , "}" ;

ServiceBundleElement =
  "name" , ":" , String |
  "publisher" , Publisher |
  "subscriber" , Subscriber |
  "server" , Server |
  "client" , Client |
  "extension" , ":" , Any |
  "diagnostics_declaration" , DiagnosticsDeclaration |
  "build_cfg" , BuildConfiguration |
  "register_reflection_metadata" , Boolean
;

คำจำกัดความของ Proto

// Defines an SDV service
message ServiceBundle {
  // Required. Name of the service bundle (without the package name).
  string name = 1;
  // List of publications the service bundle provides.
  repeated Publisher publisher = 2;
  // List of publications a service bundle subscribes to.
  repeated Subscriber subscriber = 3;
  // RPC services offered by a service bundle.
  repeated Server server = 4;
  // RPC services consumed by a service bundle.
  repeated Client client = 5;
  // Enables custom extensions beyond the standard VSIDL model.
  repeated google.protobuf.Any extension = 7;

  // Diagnostics declarations
  sdv.diagnostics.v1.DiagnosticsDeclaration diagnostics_declaration = 8;

  // Build Configuration
  optional BuildConfiguration build_cfg = 9;

  // Register metadata for service units provided by this service bundle.
  // Setting this to true will increase the memory footprint
  // and network load significantly.
  bool register_reflection_metadata = 10;
}

ตัวอย่างการใช้งาน

service_bundle {
    name: "SeatController"

    publisher {
      message: "SeatHeating"
      topic: "driver-seat"
      capacity: 10
    }
}

คำอธิบาย

แพ็กเกจบริการจะกำหนดการจัดกลุ่มเชิงตรรกะของบริการ ผู้เผยแพร่โฆษณา ผู้ติดตาม เซิร์ฟเวอร์ RPC และไคลเอ็นต์ RPC ที่เกี่ยวข้อง แพ็กเกจบริการทำหน้าที่เป็นคอนเทนเนอร์สำหรับฟังก์ชันการทำงานที่เฉพาะเจาะจงและการโต้ตอบของฟังก์ชันการทำงานเหล่านั้น

ข้อจำกัด

  • ข้อกำหนดเกี่ยวกับชื่อแพ็กเกจ (E209, E20A, E20B, E20C):
    • แพ็กเกจบริการต้องมีชื่อที่ป้อน
    • ชื่อต้องขึ้นต้นด้วยอักขระเริ่มต้นตัวระบุ Unicode ที่ถูกต้อง (โดยปกติจะเป็นตัวอักษร)
    • อักขระที่ตามมาในชื่อต้องเป็นอักขระต่อเนื่องตัวระบุ Unicode ที่ถูกต้อง (โดยปกติจะเป็นตัวอักษรหรือตัวเลข)
    • ชื่อต้องไม่ใช่คีย์เวิร์ดที่สงวนไว้ใน Rust, Java หรือ C++
  • ความไม่ซ้ำกันของแพ็กเกจทั่วโลก (E309): แพ็กเกจบริการทุกแพ็กเกจต้องมีชื่อที่สมบูรณ์ในตัวเองที่ไม่ซ้ำกัน (อิงตามแพ็กเกจและชื่อ)
  • ความไม่ซ้ำกันภายใน (E100, E300, E302, E303, E308):
    • ภายในแพ็กเกจบริการเดียว คำจำกัดความของเซิร์ฟเวอร์อย่างน้อย 1 รายการสามารถให้บริการ RPC แต่ละรายการได้
    • ภายในแพ็กเกจบริการเดียว คำจำกัดความของผู้เผยแพร่โฆษณาอย่างน้อย 1 รายการสามารถเผยแพร่ประเภทการเผยแพร่ MULTI_PUB แต่ละประเภทได้
    • ภายในแพ็กเกจบริการเดียว ชื่อหน่วยบริการที่ผู้ใช้กำหนดทั้งหมด (สำหรับผู้เผยแพร่โฆษณาหรือเซิร์ฟเวอร์) ต้องไม่ซ้ำกัน
    • ภายในแพ็กเกจบริการเดียว ชื่อหน่วยบริการทั้งหมด (ไม่ว่าผู้ใช้จะกำหนดหรือสร้างขึ้นโดยอัตโนมัติ) ต้องไม่ซ้ำกัน
  • รูปแบบการตั้งชื่อเป้าหมายบิวด์ (E205, E206, E207, E208): หากมีการระบุชื่อเป้าหมายบิวด์ที่กำหนดเอง (build_cfg.target_name) ชื่อดังกล่าวต้องเป็นไปตามรูปแบบ Snake Case (ตัวอักษรพิมพ์เล็ก ตัวเลข และขีดล่างเดี่ยว โดยไม่ขึ้นต้นหรือลงท้ายด้วยขีดล่าง)
  • ความไม่ซ้ำกันของชื่อเป้าหมายบิวด์ (E301): ชื่อเป้าหมายบิวด์ที่ผู้ใช้กำหนดต้องไม่ซ้ำกับชื่อเป้าหมายที่สร้างขึ้นโดยอัตโนมัติสำหรับแพ็กเกจบริการอื่นๆ

ผู้เผยแพร่โฆษณา

ส่วนนี้จะอธิบายประเภทข้อความผู้เผยแพร่โฆษณา

ไวยากรณ์ EBNF

Publisher = "{" , { PublisherElement } , "}" ;

PublisherElement =
  "message" , ":" , String |
  "topic" , ":" , String |
  "capacity" , ":" , Integer |
  "service_unit_name" , ":" , String
;

คำจำกัดความของ Proto

// Represents a publisher within a service bundle.
message Publisher {
  // Name of the service unit. Name may only use characters from [a-z0-9\-]+,
  // must start with [a-z], may not end with a hyphen,
  // and may not contain consecutive hyphens.
  string service_unit_name = 3;
  // Required. The type of data being published.
  string message = 4;
  // Required. The number of messages a publication queue can hold.
  // Must be an even number >= 2.
  int64 capacity = 6;
  // Required. Unique identifier for the publication topic.
  // Must be in lowercase dash-case.
  repeated string topic = 7;
}

ตัวอย่างการใช้งาน

publisher {
  message: "SeatHeating"
  topic: "driver-heating"
  capacity: 10
}

คำอธิบาย

ประเภทข้อความ Publisher จะกำหนดแหล่งข้อมูลที่ ServiceBundle ให้บริการ ประเภทข้อความนี้จะระบุประเภทข้อมูลที่จะเผยแพร่ รวมถึงหัวข้อและความจุที่เฉพาะเจาะจงของข้อมูลนั้น

หัวข้อ

อินสแตนซ์ Publisher ทุกรายการมีฟิลด์ message ที่อ้างอิงถึงข้อความ proto ที่จะเผยแพร่ โดยต้องระบุหัวข้อ (แสดงด้วย topic) และความจุ (แสดงด้วย capacity)

  • หัวข้อ: ตัวระบุที่ไม่ซ้ำกันสำหรับหัวข้อการเผยแพร่ ต้องเป็นไปตามรูปแบบ Dash Case ตัวพิมพ์เล็ก (เช่น my-topic)
  • ความจุ: ระบุขนาดของคิว นั่นคือ จำนวนข้อความที่คิวเก็บได้ก่อนที่จะทิ้งข้อความที่ยังไม่อ่าน ต้องเป็นเลขคู่ที่มากกว่าหรือเท่ากับ 2

ชื่อที่ผู้ใช้กำหนด

ผู้เผยแพร่โฆษณาสามารถมีชื่อหน่วยบริการที่ผู้ใช้กำหนดซึ่งจะลบล้างชื่อหน่วยบริการที่เลือกโดยอัตโนมัติ การอนุญาตนี้ช่วยให้เลือกชื่อที่สั้นลงได้ หากผู้เผยแพร่โฆษณาใช้ชื่อหน่วยบริการที่ผู้ใช้กำหนด ผู้เผยแพร่โฆษณาอาจใช้อินสแตนซ์เดียวเพื่อให้ระบบกำหนดชื่อหน่วยบริการให้กับอินสแตนซ์เดียวเท่านั้น

# VALID: A publisher assigns a user-defined name to a single instance
publisher {
  message: "SeatHeating"
  topic: "seat-heating-status"
  service_unit_name: "heating-is-off"
}

# ERROR: user-defined names are only allowed if there's only a single instance
publisher {
  message: "SeatHeating"
  topic: "seat-heating-status"
  service_unit_name: "heating-status"
}

ข้อจำกัด

  • ตำแหน่งของผู้เผยแพร่โฆษณา (E300): ต้องกำหนดผู้เผยแพร่โฆษณาสำหรับประเภท MULTI_PUB เดียวกันในแพ็กเกจบริการแยกกัน
  • ความไม่ซ้ำกันของชื่อภายใน (E302): ภายในแพ็กเกจบริการเดียว ผู้เผยแพร่โฆษณาทั้งหมดต้องมีชื่อหน่วยบริการที่ผู้ใช้กำหนดที่ไม่ซ้ำกัน
  • ความไม่ซ้ำกันของชื่อทั่วโลก (E304): ผู้เผยแพร่สื่อเผยแพร่ที่มีประเภทสื่อเผยแพร่เดียวกันต้องมีชื่อหน่วยบริการที่ผู้ใช้กำหนดที่ไม่ซ้ำกันทั่วโลกในแพ็กเกจบริการทั้งหมด
  • การตั้งชื่อแชแนลเดียว (E306): กำหนดชื่อหน่วยบริการที่ผู้ใช้กำหนดได้เฉพาะกับผู้เผยแพร่โฆษณาที่จัดการอินสแตนซ์เดียวเท่านั้น
  • ขีดจำกัดผู้เผยแพร่โฆษณารายเดียว (E307): ข้อความ protobuf ที่ทำเครื่องหมายเป็น SINGLE_PUB จะเผยแพร่ได้โดยผู้เผยแพร่โฆษณารายเดียวเท่านั้นทั่วทั้งระบบ
  • ความไม่ซ้ำกันของชื่อหน่วยบริการ (E308): ชื่อหน่วยบริการทั้งหมด (ไม่ว่าจะสร้างขึ้นหรือผู้ใช้กำหนด) ต้องไม่ซ้ำกันภายในแพ็กเกจบริการ ชื่อที่ผู้ใช้กำหนดควรใช้เพื่อแก้ไขข้อขัดแย้งกับชื่อที่สร้างขึ้น
  • ข้อกำหนดในการระบุตัวแปร (E501): เมื่อผู้เผยแพร่โฆษณาใช้ชื่อที่ผู้ใช้กำหนดสำหรับประเภทที่มีตัวแปรหลายรายการ ผู้เผยแพร่โฆษณาต้องระบุตัวแปรที่จะเผยแพร่อย่างชัดเจน
  • การมีอยู่ของผู้เผยแพร่โฆษณาสำหรับผู้ติดตาม (E504): ผู้ติดตามที่กำหนดทุกรายต้องมีผู้เผยแพร่โฆษณาที่เกี่ยวข้องอย่างน้อย 1 รายสำหรับประเภทและตัวแปรที่ระบุ
  • ประเภทผู้เผยแพร่โฆษณาที่ถูกต้อง (E601): ผู้เผยแพร่โฆษณาต้องอ้างอิงถึงประเภทที่สอดคล้องกับข้อความ protobuf ที่มีอยู่
  • ข้อกำหนดในการใส่คำอธิบายประกอบการเผยแพร่ (E602): ประเภทข้อความ protobuf ที่ผู้เผยแพร่โฆษณาอ้างอิงต้องมีคำอธิบายประกอบ SdvPublication
  • การใช้ตัวแปรที่ถูกต้อง (E606): หากผู้เผยแพร่โฆษณาระบุตัวแปร (อินสแตนซ์) ตัวแปรนั้นต้องมีอยู่ภายใน instances_enum ที่กำหนดไว้สำหรับประเภทการเผยแพร่ใน protobuf
  • เงื่อนไขการระบุตัวแปร (E607): ผู้เผยแพร่โฆษณาสามารถระบุตัวแปร (อินสแตนซ์) ที่ชัดเจนได้ก็ต่อเมื่อประเภทการเผยแพร่กำหนด instances_enum ใน protobuf
  • การตั้งชื่อหัวข้อ (E20D, E20F): หัวข้อต้องเป็นไปตามรูปแบบ Dash Case ตัวพิมพ์เล็กและมีความยาวไม่เกิน 127 อักขระ
  • ความไม่ซ้ำกันของหัวข้อ (E314): หัวข้อต้องไม่ซ้ำกันทั่วโลกในผู้เผยแพร่โฆษณาทั้งหมด
  • ข้อกำหนดด้านความจุ (E406, E407): ความจุเป็นค่าที่บังคับและต้องเป็นเลขคู่ >= 2

ผู้ติดตาม

ส่วนนี้จะอธิบายประเภทข้อความผู้ติดตาม

ไวยากรณ์ EBNF

Subscriber = "{" , { SubscriberElement } , "}" ;

SubscriberElement =
  "message" , ":" , String |
  "topic" , ":" , String
;

คำจำกัดความของ Proto

// Represents a subscriber within a service bundle.
message Subscriber {
  // Required. The type of data being subscribed to.
  string message = 4;
  // Required. Specific topic(s) of the message to subscribe to.
  // Must match the publisher's topic.
  repeated string topic = 6;
}

ตัวอย่างการใช้งาน

subscriber {
  message: "SeatHeating"
  topic: "driver-seat"
}

คำอธิบาย

ข้อความ Subscriber จะกำหนดผู้รับการเผยแพร่ที่ ServiceBundle ให้บริการ ข้อความนี้จะระบุประเภทข้อมูลที่จะสมัครรับข้อมูล รวมถึงหัวข้อที่เฉพาะเจาะจงของการเผยแพร่นั้น หากมีผู้เผยแพร่โฆษณาหลายรายสำหรับหัวข้อหนึ่งๆ ผู้ติดตามจะได้รับข้อความที่เผยแพร่โดยผู้เผยแพร่โฆษณาทั้งหมด

ข้อจำกัด

  • การมีอยู่ของผู้เผยแพร่โฆษณา (E504): ผู้ติดตามที่กำหนดทุกรายต้องมีผู้เผยแพร่โฆษณาที่เกี่ยวข้องอย่างน้อย 1 รายที่เผยแพร่ประเภทการเผยแพร่และตัวแปรที่ระบุ
  • ประเภทการสมัครรับข้อมูลที่ถูกต้อง (E608): ผู้ติดตามต้องอ้างอิงถึงประเภทที่สอดคล้องกับข้อความ protobuf ที่มีอยู่ซึ่งกำหนดด้วยคำอธิบายประกอบ SdvPublication
  • การสมัครรับข้อมูลตัวแปรที่ถูกต้อง (E609): หากผู้ติดตามระบุตัวแปร (อินสแตนซ์) ตัวแปรนั้นต้องเป็นค่าที่ถูกต้องซึ่งกำหนดไว้ภายใน instances_enum ของประเภทการเผยแพร่ protobuf ที่เกี่ยวข้อง
  • หัวข้อเป็นค่าที่บังคับ (E408): หัวข้อเป็นค่าที่บังคับสำหรับผู้ติดตาม
  • การประกาศหัวข้อซ้ำ (E311): ไม่ควรประกาศหัวข้อของผู้ติดตามซ้ำในแพ็กเกจบริการเดียวกัน

เซิร์ฟเวอร์ RPC

ส่วนนี้จะอธิบายประเภทข้อความเซิร์ฟเวอร์ RPC

ไวยากรณ์ EBNF

Server = "{" , { ServerElement } , "}" ;

ServerElement =
  "service" , ":" , String |
  "channel" , ":" , String |
  "service_unit_name" , ":" , String
;

คำจำกัดความของ Proto

// Represents an RPC server within a service bundle.
message Server {
  // Deprecated. Name of the service unit.
  string service_unit_name = 3 [ deprecated = true ];
  // Required. Name of the RPC service.
  string service = 4;
  // Required. Name of the RPC channel.
  // Must be in lowercase dash-case.
  string channel = 5;
}

ตัวอย่างการใช้งาน

server {
  service: "SetTemperature"
  channel: "temp-setter"
}

คำอธิบาย

ข้อความ Server จะกำหนดเซิร์ฟเวอร์ RPC ที่ ServiceBundle ให้บริการ ข้อความนี้จะระบุบริการที่เซิร์ฟเวอร์ใช้และแชแนล RPC

เซิร์ฟเวอร์ RPC จะแสดงชุดเมธอดที่ไคลเอ็นต์เรียกใช้จากระยะไกลได้ ฟิลด์ service จะระบุชื่อบริการ RPC ที่เซิร์ฟเวอร์ใช้ บริการนี้กำหนดไว้ในไฟล์ proto และใช้ในโค้ด Rust ที่กำหนดเอง บริการ RPC สามารถมีเมธอดแบบ Unary, Client-Streaming และ Server-Streaming ตามที่กำหนดไว้ในคำจำกัดความของบริการ protobuf ฟิลด์ channel จะกำหนดปลายทางการสื่อสารและเป็นค่าที่บังคับ (E409)

ข้อจำกัด

  • คำจำกัดความของบริการ (E603): เซิร์ฟเวอร์ RPC ต้องระบุค่า service ที่สอดคล้องกับค่า service RPC protobuf ที่มีอยู่
  • ขีดจำกัดเซิร์ฟเวอร์ต่อบริการ (E100): ภายในแพ็กเกจบริการเดียว คำจำกัดความของเซิร์ฟเวอร์อย่างน้อย 1 รายการสามารถให้บริการ service RPC ที่เฉพาะเจาะจงได้
  • การตั้งชื่อแชแนล (E20E): แชแนล RPC ต้องเป็นไปตามรูปแบบ Dash Case ตัวพิมพ์เล็ก
  • แชแนลเป็นค่าที่บังคับ (E409): แชแนล RPC เป็นค่าที่บังคับ
  • ความไม่ซ้ำกันของแชแนล (E40B): แชแนล RPC ต้องใช้โดยบริการเดียวเท่านั้น

ไคลเอ็นต์ RPC

ส่วนนี้จะอธิบายประเภทข้อความไคลเอ็นต์ RPC

ไวยากรณ์ EBNF

Client = "{" , { ClientElement } , "}" ;

ClientElement =
  "service" , ":" , String |
  "channel" , ":" , String
;

คำจำกัดความของ Proto

// Represents an RPC client within a service bundle.
message Client {
  // Required. Name of the RPC service.
  string service = 2;
  // Required. Name of the RPC channel.
  // Must match the server's channel and be in lowercase dash-case.
  string channel = 3;
}

ตัวอย่างการใช้งาน

client {
  service: "SetTemperature"
  channel: "temp-setter"
}

คำอธิบาย

client จะกำหนดไคลเอ็นต์ RPC ที่ ServiceBundle ใช้ client จะระบุบริการที่ไคลเอ็นต์โต้ตอบด้วยและแชแนลที่จะเชื่อมต่อ ไคลเอ็นต์สามารถโต้ตอบกับเมธอดแบบ Unary, Client-Streaming และ Server-Streaming ได้ ทั้งนี้ขึ้นอยู่กับคำจำกัดความของบริการ

ข้อจำกัด

  • คำจำกัดความของบริการ (E60A): ไคลเอ็นต์ RPC ต้องระบุ service ที่สอดคล้องกับคำจำกัดความ service protobuf ที่มีอยู่
  • แหล่งที่มาของบริการที่ไม่ซ้ำกัน (E60B): คำจำกัดความ service protobuf ที่อ้างอิงโดย service ของไคลเอ็นต์ RPC ต้องกำหนดไว้เพียงครั้งเดียว (ไม่ได้กำหนดไว้หลายครั้ง) ในไฟล์ protobuf ทั้งหมด
  • แชแนลเป็นค่าที่บังคับ (E409): แชแนล RPC เป็นค่าที่บังคับ

การกำหนดค่าบิวด์

ส่วนนี้จะอธิบายประเภทข้อความการกำหนดค่าบิวด์

ไวยากรณ์ EBNF

BuildConfiguration = "{" , BuildConfigurationElement, "}" ;

BuildConfigurationElement =
  "target_name" , ":" , String |
  "skip_codegen" , ":" , Boolean
;

คำจำกัดความของ Proto

// Defines additional information used to configure build settings
message BuildConfiguration {
  /// Build target name
  optional string target_name = 1;
  // Do not generate code for this service bundle
  optional bool skip_codegen = 2;
}

ตัวอย่างการใช้งาน

build_cfg {
  target_name: "my_custom_target_name"
  skip_codegen: false
}

คำอธิบาย

BuildConfiguration จะกำหนดค่าพารามิเตอร์ที่ไม่เป็นมาตรฐานของ ServiceBundle สำหรับการสร้างโค้ด การกำหนดค่าบิวด์ทั้งหมดเป็นค่าที่ไม่บังคับ

  • target_name (string ที่ไม่บังคับ): ระบุชื่อเป้าหมายบิวด์ในไฟล์ Android.bp ใช้ตัวเลือกนี้เพื่อตั้งชื่อเป้าหมายให้สั้นกว่าชื่อที่เลือกโดยอัตโนมัติ
  • skip_codegen (bool ที่ไม่บังคับ): ระบุว่าจะข้ามการสร้างโค้ดสำหรับแพ็กเกจบริการนี้หรือไม่ หากตั้งค่าเป็น true ระบบจะไม่สร้างโค้ดสำหรับแพ็กเกจบริการนี้ ตัวเลือกนี้มีประโยชน์สำหรับแพ็กเกจบริการที่ใช้ด้วยตนเอง โดยค่าเริ่มต้น ระบบจะตั้งค่าเป็น false

ข้อจำกัด

  • รูปแบบชื่อเป้าหมาย (E205, E206, E207, E208): หากมีการระบุชื่อเป้าหมายบิวด์ที่กำหนดเอง (build_cfg.target_name) ชื่อดังกล่าวต้องเป็นไปตามรูปแบบ Snake Case อย่างเคร่งครัด ดังนี้
    • ต้องมีเฉพาะตัวอักษรพิมพ์เล็ก (a ถึง z) ตัวเลข (0 ถึง 9) และขีดล่าง (_)
    • ต้องไม่มีขีดล่างต่อเนื่องกัน (__)
    • ต้องไม่ขึ้นต้นด้วยขีดล่าง
    • ต้องไม่ลงท้ายด้วยขีดล่าง
  • ความไม่ซ้ำกันของชื่อเป้าหมาย (E301): build_cfg.target_name ที่ผู้ใช้กำหนดต้องไม่ซ้ำกันในระบบบิวด์และต้องไม่ขัดแย้งกับชื่อเป้าหมายที่สร้างขึ้นโดยอัตโนมัติซึ่งได้มาจากคำจำกัดความของแพ็กเกจบริการอื่นๆ