หน้านี้จะระบุภาษาที่ใช้นิยามอินเทอร์เฟซสำหรับบริการยานยนต์ (VSIDL) โดยใช้รูปแบบ Backus-Naur Form (EBNF) แบบขยายของ ISO/IEC 14977 และ protobuf หน้านี้จะเน้นที่ไวยากรณ์แบบไม่ขึ้นกับบริบทของภาษาและความหมายขององค์ประกอบภาษา
ลำดับชั้นของภาษา
ตาม Meta Object Facility (MOF) คอมไพเลอร์ VSIDL (VSIDLC) จะใช้ ภาษาที่แสดงในรูปที่ 1
รูปที่ 1 ภาษา VSIDLC
VSIDLC อิงตามภาษา บัฟเฟอร์โปรโตคอล (protobuf) เป็นหลัก protobuf ใช้เพื่อระบุประเภทข้อมูลที่จะแลกเปลี่ยนโดยใช้การเรียกใช้การเผยแพร่และสมัครรับข้อมูลและการเรียกใช้ Remote Procedure Calls (RPCs) จากมุมมองทางเทคนิค โมเดล VSIDL คือไฟล์ TextProto ซึ่งมีการกำหนดไวยากรณ์ของ VSIDL ในไฟล์ protobuf (syntax.proto) ทั้งไฟล์ protobuf สำหรับระบุประเภทข้อมูลและโมเดล VSIDL ใช้เพื่อสร้างโค้ด Rust โค้ดที่สร้างขึ้นจะมีโครงสร้างเป็นหลักซึ่งใช้โครงสร้างข้อมูลสำหรับข้อความที่แลกเปลี่ยนและฟังก์ชัน Rust ที่ใช้ฟังก์ชันสำหรับการสร้างหน่วยบริการใน Rust โดยไม่ต้องเรียกหน่วยบริการเหล่านี้โดยอัตโนมัติ โค้ด Rust ที่สร้างขึ้นนี้มาพร้อมกับโค้ด Rust ที่กำหนดเองซึ่งใช้โค้ดที่สร้างขึ้นเพื่อสร้างอินสแตนซ์หน่วยบริการและใช้ตรรกะทางธุรกิจของแอปพลิเคชัน
ไวยากรณ์นามธรรม
รูปที่ 2 แสดงประเภทข้อความหลักใน 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ที่สอดคล้องกับค่าserviceRPC protobuf ที่มีอยู่ - ขีดจำกัดเซิร์ฟเวอร์ต่อบริการ (E100): ภายในแพ็กเกจบริการเดียว คำจำกัดความของเซิร์ฟเวอร์อย่างน้อย 1 รายการสามารถให้บริการ
serviceRPC ที่เฉพาะเจาะจงได้ - การตั้งชื่อแชแนล (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ที่สอดคล้องกับคำจำกัดความserviceprotobuf ที่มีอยู่ - แหล่งที่มาของบริการที่ไม่ซ้ำกัน (E60B): คำจำกัดความ
serviceprotobuf ที่อ้างอิงโดย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ที่ผู้ใช้กำหนดต้องไม่ซ้ำกันในระบบบิวด์และต้องไม่ขัดแย้งกับชื่อเป้าหมายที่สร้างขึ้นโดยอัตโนมัติซึ่งได้มาจากคำจำกัดความของแพ็กเกจบริการอื่นๆ