โมดูล Android Rust

ตามหลักการทั่วไป คําจํากัดความของโมดูล 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สร้างไลบรารี Rust C ที่ 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 โดยเฉพาะ หน้าโมดูลโปรโตคอลและเครื่องมือสร้างแหล่งที่มา
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 ของ rustc แจ้ง สำหรับโมดูลที่สร้างไลบรารี พารามิเตอร์นี้ต้องตรงกับที่คาดไว้ ชื่อลังที่ใช้ในแหล่งที่มา ตัวอย่างเช่น หากมีการอ้างอิงโมดูล 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 ชุด Lint เริ่มต้นโดยขึ้นอยู่กับตำแหน่งของโมดูล
  • android ชุด Lint ที่เข้มงวดที่สุดที่ใช้กับโค้ดแพลตฟอร์ม Android ทั้งหมด
  • vendor ชุด Lint แบบผ่อนคลายที่ใช้กับโค้ดของผู้ให้บริการ
  • none เพื่อเพิกเฉยต่อคำเตือนและข้อผิดพลาดทั้งหมดของ Lint

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

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

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

ฉบับ

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

แฟล็ก

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

ld_flags

ld-flags มีรายการสตริงของแฟล็กที่จะส่งไปยัง Linker เมื่อคอมไพล์ แหล่งที่มา ค่าเหล่านี้ส่งมาโดยธงรัสเซีย -C linker-args มีการใช้ 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 เพื่อตัดทุกอย่าง รวมถึงข้อมูลการแก้ไขข้อบกพร่องขนาดเล็ก ค่าเพิ่มเติมได้ใน ข้อมูลอ้างอิงเกี่ยวกับโมดูล Soong

รองรับโฮสต์

สำหรับโมดูลอุปกรณ์ พารามิเตอร์ 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 สร้างขึ้น ไม่ต้องระบุค่านี้