การระบุภาษา

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

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

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

ภาษา VSIDLC

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

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

ระบบจะใช้ทั้งไฟล์ protobuf สำหรับระบุประเภทข้อมูลและโมเดล VSIDL เพื่อสร้างโค้ด 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 เป็นองค์ประกอบระดับบนสุด ที่เชื่อมโยงทุกอย่างเข้าด้วยกัน

วัตถุประสงค์

  • กำหนดโครงสร้างโดยรวมของไฟล์ 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):
    • ภายในแพ็กเกจบริการเดียว บริการ RPC แต่ละรายการจะแสดงได้โดยคำจำกัดความของเซิร์ฟเวอร์อย่างมาก 1 รายการ
    • ภายในแพ็กเกจบริการเดียว สิ่งพิมพ์ MULTI_PUB แต่ละประเภทจะเผยแพร่ได้โดยคำจำกัดความของผู้เผยแพร่เนื้อหาไม่เกิน 1 รายการ
    • ภายในแพ็กเกจบริการเดียว ชื่อหน่วยบริการที่ผู้ใช้กำหนดทั้งหมด (สำหรับผู้เผยแพร่โฆษณาหรือเซิร์ฟเวอร์) ต้องไม่ซ้ำกัน
    • ภายในแพ็กเกจบริการเดียว ชื่อหน่วยบริการทั้งหมด (ไม่ว่าจะกำหนดโดยผู้ใช้หรือสร้างขึ้นโดยอัตโนมัติ) ต้องไม่ซ้ำกัน
  • รูปแบบการตั้งชื่อเป้าหมายการสร้าง (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)

  • Topic: ตัวระบุที่ไม่ซ้ำกันสำหรับหัวข้อของสื่อเผยแพร่ โดยต้องใช้ตัวพิมพ์เล็กและคั่นด้วยขีดกลาง (เช่น 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): หัวข้อต้องเป็นตัวพิมพ์เล็กและใช้ขีดกลาง และมีความยาวไม่เกิน 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): ภายในแพ็กเกจบริการเดียว RPC service ที่เฉพาะเจาะจงจะแสดงได้โดยคำจำกัดความของเซิร์ฟเวอร์อย่างมาก 1 รายการ
  • การตั้งชื่อแชแนล (E20E): แชแนล RPC ต้องเป็นตัวพิมพ์เล็กและใช้ขีดกลาง
  • Channel mandatory (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, การสตรีมฝั่งไคลเอ็นต์ และการสตรีมฝั่งเซิร์ฟเวอร์ ทั้งนี้ขึ้นอยู่กับคำจำกัดความของบริการ

ข้อจำกัด

  • คำจำกัดความของบริการ (E60A): ไคลเอ็นต์ RPC ต้องระบุ service ที่สอดคล้องกับคำจำกัดความ service ของ protobuf ที่มีอยู่
  • แหล่งที่มาของบริการที่ไม่ซ้ำกัน (E60B): คำจำกัดความ service ของ protobuf ที่อ้างอิงโดย service ของไคลเอ็นต์ RPC ต้องได้รับการกำหนดอย่างไม่ซ้ำกัน (ไม่ได้กำหนดหลายครั้ง) ในไฟล์ protobuf ทั้งหมด
  • Channel mandatory (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 ที่ผู้ใช้กำหนดต้องไม่ซ้ำกันในระบบบิลด์ และต้องไม่ขัดแย้งกับชื่อเป้าหมายที่สร้างขึ้นโดยอัตโนมัติซึ่งได้มาจากคำจำกัดความของแพ็กเกจบริการอื่นๆ