โมดูล Rust ของ Android

หลักการทั่วไปคือrust_*คําจํากัดความของข้อบังคับจะสอดคล้องกับการใช้งานและความคาดหวังอย่างใกล้ชิด cc_* ต่อไปนี้คือตัวอย่างการกําหนดค่าโมดูลสําหรับไบนารี Rust

rust_binary {
    name: "hello_rust",
    crate_name: "hello_rust",
    srcs: ["src/hello_rust.rs"],
    host_supported: true,
}

หน้านี้กล่าวถึงพร็อพเพอร์ตี้ที่พบบ่อยที่สุดสำหรับโมดูล rust_* สำหรับ เพื่อหาข้อมูลเพิ่มเติมเกี่ยวกับประเภทโมดูลที่เจาะจง และตัวอย่างการกำหนดโมดูล ดู โมดูลไบนารี โมดูลไลบรารี หรือ โมดูลทดสอบ

ประเภทโมดูลพื้นฐาน

ประเภทคำจำกัดความสำหรับข้อมูลเพิ่มเติม
rust_binaryไบนารี Rust โมดูลไบนารี เพจ
rust_libraryสร้างไลบรารี Rust และมีทั้งตัวแปร rlib และ dylib rust_library, โมดูลไลบรารี
rust_ffiสร้างไลบรารี C ของ Rust ที่โมดูล cc ใช้ได้ และให้บริการทั้งตัวแปรแบบคงที่และแบบแชร์ rust_ffi, หน้าโมดูลคลัง
rust_proc_macroสร้างไลบรารี proc-macro Rust (ซึ่งคล้ายกับปลั๊กอินคอมไพเลอร์) rust_proc_macro, หน้าโมดูลไลบรารี
rust_testสร้างไบนารีทดสอบ Rust ที่ใช้ชุดทดสอบ Rust มาตรฐาน หน้าทดสอบข้อบังคับ
rust_fuzzทำให้เกิดการใช้ประโยชน์จากไบนารี Fuzz Rust libfuzzer ตัวอย่างโมดูล rust_fuzz
rust_protobufสร้างแหล่งที่มาและสร้างไลบรารี Rust ที่ให้บริการอินเทอร์เฟซสําหรับ protobuf บางรายการ หน้าโมดูล Protobuf และเครื่องมือสร้างแหล่งที่มา
rust_bindgenสร้างซอร์สโค้ดและสร้างไลบรารี Rust ที่มีการเชื่อมโยง Rust กับไลบรารี C โมดูลการเชื่อมโยง Bindgen และหน้าเครื่องมือสร้างแหล่งที่มา

พร็อพเพอร์ตี้ทั่วไปที่สําคัญ

พร็อพเพอร์ตี้เหล่านี้เหมือนกันใน Rust ทั้งหมดของ Android โมดูล พร็อพเพอร์ตี้เพิ่มเติม (ที่ไม่ซ้ำกัน) ที่เชื่อมโยงกับแต่ละข้อบังคับของ Rust จะแสดงอยู่ในหน้าของข้อบังคับนั้น

ชื่อ

name คือชื่อโมดูลของคุณ ค่านี้ต้องไม่ซ้ำกันเช่นเดียวกับโมดูล Soong อื่นๆ ในโมดูลส่วนใหญ่ Android.bp ประเภท โดยค่าเริ่มต้น ระบบจะใช้ name เป็นชื่อไฟล์เอาต์พุต หากชื่อไฟล์เอาต์พุตต้องแตกต่างจากชื่อโมดูล ให้ใช้เมธอด stem เพื่อกําหนด

ก้าน

stem (ไม่บังคับ) ให้การควบคุมโดยตรงกับชื่อไฟล์เอาต์พุต (ยกเว้นนามสกุลไฟล์และคำต่อท้ายอื่นๆ) เช่น rust_library_rlib ไลบรารีที่มีค่าต้นกำเนิดเป็น libfoo จะสร้างไฟล์ libfoo.rlib หากคุณไม่ได้ระบุค่าสำหรับพร็อพเพอร์ตี้ stem ระบบจะใช้ชื่อโมดูลเป็นชื่อไฟล์เอาต์พุตโดยค่าเริ่มต้น

ใช้ฟังก์ชัน stem เมื่อคุณไม่สามารถตั้งชื่อโมดูลเป็นเอาต์พุตที่ต้องการ ชื่อไฟล์ ตัวอย่างเช่น rust_library สำหรับลัง log จะมีชื่อว่า liblog_rust, เนื่องจาก liblog cc_library มีอยู่แล้ว การใช้พร็อพเพอร์ตี้ stem ในกรณีนี้จะช่วยให้ไฟล์เอาต์พุตมีชื่อว่า liblog.* แทน liblog_rust.*

src

srcs มีไฟล์ต้นฉบับไฟล์เดียวที่แสดงถึงจุดแรกเข้าของข้อบังคับ (ปกติคือ main.rs หรือ lib.rs) rustc จะจัดการการแก้ไขและค้นหาไฟล์ต้นฉบับอื่นๆ ทั้งหมดที่จำเป็นสำหรับการคอมไพล์ และไฟล์เหล่านี้จะแสดงอยู่ในไฟล์ deps ที่สร้างขึ้น

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

crate_name

crate_name ตั้งค่าข้อมูลเมตาของชื่อลังผ่าน --crate_name ของ rustc แจ้ง สําหรับโมดูลที่สร้างไลบรารี ค่านี้ต้องตรงกับชื่อ crate ที่คาดไว้ซึ่งใช้ในแหล่งที่มา ตัวอย่างเช่น หากมีการอ้างอิงโมดูล libfoo_bar ในแหล่งที่มาเป็น extern crate foo_bar ในกรณีนี้ ต้องเป็น crate_name: "foo_bar"

พร็อพเพอร์ตี้นี้เป็นพร็อพเพอร์ตี้ทั่วไปของโมดูล rust_* ทั้งหมด แต่จำเป็นสำหรับโมดูลที่สร้างไลบรารี Rust (เช่น rust_library rust_ffi, rust_bindgen, rust_protobuf และ rust_proc_macro) โมดูลเหล่านี้บังคับใช้ข้อกำหนด rustc เกี่ยวกับความสัมพันธ์ระหว่าง crate_name กับชื่อไฟล์เอาต์พุต สำหรับข้อมูลเพิ่มเติม โปรดดู โมดูลไลบรารี

Lints

rustc Linter จะทำงานโดยค่าเริ่มต้นสำหรับโมดูลทุกประเภท ยกเว้นเครื่องมือสร้างแหล่งที่มา ชุด Lint บางชุดได้รับการกำหนดและใช้เพื่อตรวจสอบแหล่งที่มาของโมดูล ค่าที่เป็นไปได้สำหรับ Lint ดังกล่าว ดังนี้

  • default ชุดโปรแกรมตรวจภาษาเริ่มต้น โดยขึ้นอยู่กับตำแหน่งของโมดูล
  • android ชุด Lint ที่เข้มงวดที่สุดที่ใช้กับโค้ดแพลตฟอร์ม Android ทั้งหมด
  • vendor ชุดการตรวจสอบโค้ดแบบผ่อนปรนที่ใช้กับโค้ดของผู้ให้บริการ
  • none เพื่อละเว้นคำเตือนและข้อผิดพลาดจาก Lint ทั้งหมด

โปรแกรมลบลิงก์

นอกจากนี้ โปรแกรมวิเคราะห์เนื้อหาแบบคลิปก็ จะทำงานโดยค่าเริ่มต้นสำหรับโมดูลทุกประเภท ยกเว้นโปรแกรมสร้างแหล่งที่มา ผ้าขนสัตว์ 2-3 ชุด ได้รับการกำหนดซึ่งใช้เพื่อตรวจสอบแหล่งที่มาของโมดูล ค่าที่เป็นไปได้มีดังนี้

  • default ชุด lint เริ่มต้นโดยขึ้นอยู่กับตำแหน่งของโมดูล
  • android ชุด Lint ที่เข้มงวดที่สุดที่ใช้กับโค้ดแพลตฟอร์ม Android ทั้งหมด
  • vendor ชุดการตรวจสอบโค้ดแบบผ่อนปรนที่ใช้กับโค้ดของผู้ให้บริการ
  • none เพื่อละเว้นคำเตือนและข้อผิดพลาดจาก Lint ทั้งหมด

ฉบับ

edition กำหนดรุ่น Rust ที่จะใช้ในการคอมไพล์โค้ดนี้ ซึ่งคล้ายกับเวอร์ชัน std สําหรับ C และ C++ ค่าที่ใช้ได้คือ 2015 และ 2018 (ค่าเริ่มต้น)

แฟล็ก

flags มีรายการสตริงของแฟล็กที่จะส่งไปยัง rustc ระหว่างการคอมไพล์

ld_flags

ld-flags มีรายการสตริงของแฟล็กที่จะส่งไปยัง Linker เมื่อคอมไพล์ แหล่งที่มา ซึ่งจะส่งผ่านโดย-C linker-args Flag rustc มีการใช้ clang เป็น ฟรอนท์เอนด์ของ Linker ซึ่งเรียกใช้ lld สำหรับการลิงก์จริง

ฟีเจอร์

features คือรายการสตริงของฟีเจอร์ที่ต้องเปิดใช้ระหว่างการคอมไพล์ รายการนี้ส่งผ่านไปยัง rustc โดย --cfg 'feature="foo"' ฟีเจอร์ส่วนใหญ่จะเป็นส่วนเสริม ดังนั้นในหลายกรณี โซลูชันนี้จะประกอบด้วยชุดฟีเจอร์ทั้งหมดซึ่งจำเป็นต้องใช้ โมดูล แต่ในกรณีที่ฟีเจอร์หนึ่งไม่มีให้กัน กำหนดโมดูลเพิ่มเติมในไฟล์บิลด์ที่มีฟีเจอร์ที่ขัดแย้งกัน

cfgs

cfgs มีรายการสตริงของแฟล็ก cfg ที่จะเปิดใช้ระหว่างการคอมไพล์ --cfg foo และ --cfg "fizz=buzz" จะส่งข้อมูลนี้ไปให้ rustc

ระบบบิลด์จะตั้งค่าแฟล็ก cfg บางรายการโดยอัตโนมัติ รายการด้านล่าง

  • โมดูลที่สร้างเป็น dylib จะมีandroid_dylib cfg ตั้งค่าไว้

  • โมดูลที่จะใช้ VNDK จะมีการตั้งค่า android_vndk cfg ซึ่งคล้ายกับคำจำกัดความ __ANDROID_VNDK__ สำหรับ C++

แถบ

strip ควบคุมว่าจะมีการตัดไฟล์เอาต์พุตหรือไม่และอย่างไร (หากมี) หากไม่ได้ตั้งค่า โมดูลอุปกรณ์จะตัดทุกอย่างออกโดยค่าเริ่มต้น ยกเว้นข้อมูลการแก้ไขข้อบกพร่องย่อย โดยค่าเริ่มต้น โมดูลโฮสต์จะไม่ตัดสัญลักษณ์ใดๆ ออก ค่าที่ถูกต้อง ได้แก่ none เพื่อปิดใช้การลบข้อมูล และ all เพื่อลบข้อมูลทั้งหมด รวมถึง mini debuginfo ค่าเพิ่มเติมได้ใน ข้อมูลอ้างอิงเกี่ยวกับโมดูล Soong

host_supported

สำหรับโมดูลอุปกรณ์ พารามิเตอร์ host_supported จะระบุว่าโมดูล ควรระบุตัวแปรโฮสต์ด้วย

กำหนดทรัพยากร Dependency ของไลบรารี

โมดูล Rust สามารถใช้ทั้งไลบรารี CC และ Rust ผ่านพร็อพเพอร์ตี้ต่อไปนี้

ชื่อพร็อพเพอร์ตี้ คำอธิบาย
rustlibs รายการโมดูล rust_library ที่เป็นทรัพยากร Dependency ด้วย ใช้เป็นชื่อ วิธีในการประกาศทรัพยากร Dependency ที่ต้องการ เนื่องจากช่วยให้ระบบบิลด์ ให้เลือกการลิงก์ที่ต้องการ (ดูเมื่อลิงก์กับไลบรารี Rust ด้านล่าง)
rlibs รายการโมดูล rust_library ที่ต้องลิงก์แบบคงที่ ด้วยชื่อ rlibs (โปรดใช้ด้วยความระมัดระวัง โปรดดู เมื่อลิงก์กับไลบรารี Rust ที่ด้านล่าง)
shared_libs รายการโมดูล cc_library ซึ่งต้องแบบไดนามิก ลิงก์เป็นไลบรารีที่ใช้ร่วมกันแล้ว
static_libs รายการโมดูล cc_library ซึ่งต้องคงที่ เป็นไลบรารีแบบคงที่
whole_static_libs รายการโมดูล cc_library รายการที่ควรเป็นแบบคงที่ ลิงก์เป็นไลบรารีแบบคงที่ และรวมทั้งหมดไว้ในไลบรารีที่ได้ สำหรับ ตัวแปร rust_ffi_static รายการ whole_static_libraries จะรวมอยู่ใน ที่เป็นผลลัพธ์ในที่เก็บถาวรสำหรับไลบรารีแบบคงที่ สำหรับตัวแปร rust_library_rlib รายการ ไลบรารี whole_static_libraries รายการจะรวมอยู่ใน rlib ที่ได้ คลัง

เมื่อลิงก์กับไลบรารี Rust เป็น แนวทางปฏิบัติแนะนำ ให้ใช้พร็อพเพอร์ตี้ rustlibs แทน rlibs หรือ dylibs เว้นแต่คุณจะมีเหตุผลที่เจาะจงในการดำเนินการดังกล่าว ซึ่งช่วยให้สร้าง ระบบเพื่อเลือกการลิงก์ที่ถูกต้องโดยพิจารณาจากสิ่งที่โมดูลรูทต้องการ และลดโอกาสที่แผนผัง Dependency จะมีทั้ง rlib และ dylib เวอร์ชันไลบรารี (ซึ่งจะทำให้การคอมไพล์ล้มเหลว)

ฟีเจอร์บิลด์ที่ไม่รองรับและรับการสนับสนุนแบบจำกัด

Rust ของ Soong ให้การสนับสนุนแบบจำกัดสำหรับ vendor และ รูปภาพและสแนปชอต vendor_ramdisk รายการ อย่างไรก็ตาม staticlibs, cdylibs รองรับ rlibs และ binaries สําหรับเป้าหมายการสร้างรูปภาพของผู้ให้บริการ ระบบจะตั้งค่าพร็อพเพอร์ตี้ android_vndk cfg คุณใช้คีย์นี้ในโค้ดได้หากมี ความแตกต่างระหว่างเป้าหมายของระบบและของผู้ให้บริการ rust_proc_macros จะไม่ได้รับการบันทึกเป็นส่วนหนึ่งของสแนปชอตของผู้ให้บริการ หากระบบต้องใช้ไฟล์เหล่านี้ โปรดควบคุมเวอร์ชันอย่างเหมาะสม

ระบบไม่รองรับรูปภาพผลิตภัณฑ์ VNDK และรูปภาพการกู้คืน

บิลด์ส่วนเพิ่ม

นักพัฒนาซอฟต์แวร์สามารถเปิดใช้การคอมไพล์แบบเพิ่มขึ้นเรื่อยๆ สั่นโดยการตั้งค่า SOONG_RUSTC_INCREMENTAL ตัวแปรสภาพแวดล้อมเป็น true

คำเตือน: ไม่มีการรับประกันว่าจะสร้างไบนารีที่เหมือนกับ ที่บิลด์บ็อตสร้างขึ้น ที่อยู่ของฟังก์ชันหรือข้อมูลที่อยู่ในไฟล์ออบเจ็กต์อาจแตกต่างกัน หากต้องการตรวจสอบว่าอาร์ติแฟกต์ที่สร้างขึ้นนั้นสมบูรณ์ 100% เหมือนกันกับที่โครงสร้างพื้นฐานของ EngProd สร้างขึ้น ไม่ต้องระบุค่านี้