โมดูล Protobuf

ระบบบิลด์รองรับการสร้างอินเทอร์เฟซ protobuf ผ่านประเภทข้อบังคับrust_protobuf

การสร้างโค้ด protobuf พื้นฐานจะดำเนินการกับที่เก็บ rust-protobuf หากต้องการดูเอกสารประกอบเกี่ยวกับการใช้งานนี้ โปรดดูหน้าโปรเจ็กต์ GitHub ที่มีตัวอย่าง protobuf ที่เกี่ยวข้อง

นอกจากนี้ ระบบยังรองรับ protobuf ของ gRPC ด้วย ซึ่งจะสร้างโดย grpc-rs crate หากต้องการดูเอกสารประกอบเกี่ยวกับการใช้งานนี้ โปรดดูเอกสารประกอบในหน้าโปรเจ็กต์ GitHub ของ gRPC ที่เกี่ยวข้อง

การใช้งานพื้นฐานของบิลด์ rust_protobuf

เนื้อหาต่อไปนี้แสดงตัวอย่างการกำหนดโมดูลโปรโตบัฟและใช้โมดูลนั้นเป็นลัง ดูรายละเอียดเพิ่มเติมเกี่ยวกับพร็อพเพอร์ตี้ที่สําคัญและวิธีการใช้งานได้ในส่วนการกําหนด rust_protobuf

หากต้องการใช้โค้ดที่ protobuf สร้างขึ้นผ่านมาโคร include!() เช่น สําหรับโค้ดของบุคคลที่สาม โปรดดูตัวอย่างในหน้าเครื่องมือสร้างแหล่งที่มา (ตัวอย่างนี้ใช้โมดูล rust_bindgen แต่วิธีการรวมแหล่งที่มาจะเหมือนกันสำหรับเครื่องมือสร้างแหล่งที่มาทั้งหมด)

กำหนดโมดูล rust_protobuf Android.bp

สมมติว่าโปรโตคอลอยู่ที่ src/protos/my.proto เมื่อเทียบกับ Android.bp ระบบจะกำหนดโมดูลดังนี้

rust_protobuf {
    name: "libmy_proto",

    // Crate name that's used to generate the rust_library variants.
    crate_name: "my_proto",

    // Relative paths to the protobuf source files
    protos: ["src/protos/my.proto"],

    // If protobufs define gRPCs, then they should go in grpc_protos
    // instead.
    // grpc_protos: ["src/protos/my.proto"],

    // 'source_stem' controls the output filename.
    // This is the filename that's used in an include! macro.
    source_stem: "my_proto_source",
}

ไลบรารีที่ใช้ลังนี้กำหนดโดยการอ้างอิงเหมือนเป็นทรัพยากร Dependency อื่นๆ ของไลบรารี

rust_binary {
    name: "hello_rust_proto",
    srcs: ["src/main.rs"],
    rustlibs: ["libmy_proto"],
}

โครงสร้าง Crate ของโมดูล rust_protobuf

ไฟล์ protobuf แต่ละไฟล์จะจัดระเบียบเป็นโมดูลของตัวเองภายในแพ็กเกจ โดยจะใช้ชื่อของไฟล์ protobuf ซึ่งหมายความว่าชื่อไฟล์ฐาน proto ทั้งหมดต้องไม่ซ้ำกัน ตัวอย่างเช่น ให้ใช้ rust_protobuf ตามที่กำหนดไว้ดังนี้

rust_protobuf {
    name: "libfoo",
    crate_name: "foo",
    protos: ["a.proto", "b.proto"],
    grpc_protos: ["c.proto"],
    source_stem: "my_proto_source",
}

โปรโตต่างๆ ภายในแพ็กเกจนี้จะเข้าถึงได้ดังนี้

// use <crate_name>::<proto_filename>
use foo::a; // protobuf interface defined in a.proto
use foo::b; // protobuf interface defined in b.proto
use foo::c; // protobuf interface defined in c.proto
use foo::c_grpc; // grpc interface defined in c.proto

พร็อพเพอร์ตี้ rust_protobuf ที่สำคัญ

พร็อพเพอร์ตี้ที่กําหนดไว้ด้านล่างนี้นอกเหนือจากพร็อพเพอร์ตี้ทั่วไปที่สําคัญที่ใช้กับข้อบังคับทั้งหมด รายการเหล่านี้มีความสำคัญอย่างยิ่งต่อโมดูล protobuf ของ Rust หรือแสดงลักษณะการทำงานที่ไม่ซ้ำกันเฉพาะสำหรับrust_protobufประเภทโมดูล

stem, name, crate_name

rust_protobuf จะสร้างตัวแปรของไลบรารี ดังนั้นพร็อพเพอร์ตี้ทั้ง 3 รายการนี้จึงมีข้อกำหนดเดียวกันกับข้อกำหนดของโมดูล rust_library ดูรายละเอียดในพร็อพเพอร์ตี้ rust_library

protos

รายการนี้คือเส้นทางแบบสัมพัทธ์ไปยังไฟล์ protobuf เพื่อสร้างอินเทอร์เฟซ protobuf ชื่อไฟล์ฐานต้องไม่ซ้ำกันระหว่าง protos กับ grpc_protos

grpc_protos

grpc_protos ประกอบด้วยรายการเส้นทางแบบสัมพัทธ์ไปยังไฟล์ protobuf ที่กำหนด grpcs เพื่อสร้างอินเทอร์เฟซ protobuf ชื่อไฟล์ฐานต้องไม่ซ้ำกันทั้งใน protos และ grpc_protos

ต้นกำเนิด

source_stem คือชื่อไฟล์สำหรับไฟล์ต้นทางที่สร้างขึ้นซึ่งรวมได้ นี่เป็นคําจํากัดความตามฟิลด์ที่จำเป็น แม้ว่าคุณจะใช้การเชื่อมโยงเป็นลัง เนื่องจากพร็อพเพอร์ตี้ stem จะควบคุมชื่อไฟล์เอาต์พุตสำหรับตัวแปรไลบรารีที่สร้างขึ้นเท่านั้น ซึ่งแตกต่างจากเครื่องมือสร้างแหล่งที่มาอื่นๆ เนื่องจากชื่อไฟล์จะมีคำนำหน้าเป็น mod_ ซึ่งทำให้ชื่อไฟล์สุดท้ายเป็น mod_<stem> วิธีนี้จะช่วยป้องกันไม่ให้ชื่อซ้ำกับแหล่งที่มาที่สร้างขึ้นจากโปรโตแต่ละรายการ

นอกจากนี้ เช่นเดียวกับโมดูลการเชื่อมโยงของ bindgen พร็อพเพอร์ตี้ไลบรารีทั้งชุดยังใช้ควบคุมการคอมไพล์ไลบรารีได้ด้วย แม้ว่าจะไม่ค่อยจําเป็นต้องกําหนดหรือเปลี่ยนแปลง