簡(jiǎn)介: CSDN博客專家,專注Android/Linux系統(tǒng),分享多mic語(yǔ)音方案、音視頻、編解碼等技術(shù),與大家一起成長(zhǎng)!
優(yōu)質(zhì)專欄:Audio工程師進(jìn)階系列【原創(chuàng)干貨持續(xù)更新中……】??
優(yōu)質(zhì)專欄:多媒體系統(tǒng)工程師系列【原創(chuàng)干貨持續(xù)更新中……】??
人生格言: 人生從來(lái)沒(méi)有捷徑,只有行動(dòng)才是治療恐懼和懶惰的唯一良藥.
1.前言
本篇目的:Android14之Android Rust模塊編譯語(yǔ)法
2.Android Rust介紹
- Android Rust是一個(gè)開(kāi)源項(xiàng)目,旨在將Rust編程語(yǔ)言集成到Android應(yīng)用開(kāi)發(fā)中。Rust是一種系統(tǒng)編程語(yǔ)言,注重安全、性能和并發(fā)性,而Android是一個(gè)廣泛使用的移動(dòng)操作系統(tǒng),主要由Java和Kotlin編程語(yǔ)言支持。Android Rust項(xiàng)目的目標(biāo)是為Android開(kāi)發(fā)者提供一種新的編程選擇,以提高應(yīng)用的安全性和性能。
- Rust編程語(yǔ)言具有許多優(yōu)點(diǎn),例如零成本抽象、內(nèi)存安全、所有權(quán)模型和異步編程。這些特性使得Rust成為Android應(yīng)用開(kāi)發(fā)的理想選擇,因?yàn)樗鼈兛梢詭椭_(kāi)發(fā)者編寫(xiě)更安全、更高效的代碼。零成本抽象意味著Rust提供了高級(jí)抽象,而不需要犧牲性能。內(nèi)存安全是指Rust編譯器會(huì)檢查內(nèi)存使用,以防止內(nèi)存泄漏和越界訪問(wèn)等問(wèn)題。所有權(quán)模型可以幫助開(kāi)發(fā)者更好地管理內(nèi)存和資源,而異步編程可以提高應(yīng)用的響應(yīng)性和性能。
- Android Rust項(xiàng)目提供了一套工具和庫(kù),以支持在Android平臺(tái)上使用Rust編程語(yǔ)言。這些工具和庫(kù)包括Rust編譯器、Android NDK(Native Development Kit)集成、CMake構(gòu)建系統(tǒng)和Rust交叉編譯工具鏈。這些工具和庫(kù)可以幫助開(kāi)發(fā)者輕松地將Rust代碼集成到Android應(yīng)用中。
- 為了使用Android Rust進(jìn)行開(kāi)發(fā),首先需要安裝Rust和Android SDK。然后,可以使用Rust編譯器交叉編譯Android平臺(tái)上的Rust代碼。接下來(lái),可以使用Android NDK將Rust代碼與C/C++代碼集成,以便在Android應(yīng)用中使用原生代碼。最后,可以使用CMake構(gòu)建系統(tǒng)來(lái)配置和構(gòu)建Android應(yīng)用。
- Android Rust項(xiàng)目還提供了一些示例和教程,以幫助開(kāi)發(fā)者開(kāi)始使用Rust進(jìn)行Android應(yīng)用開(kāi)發(fā)。這些示例涵蓋了各種不同的場(chǎng)景,例如渲染圖像、處理音頻和網(wǎng)絡(luò)通信等。通過(guò)這些示例和教程,開(kāi)發(fā)者可以更好地了解如何使用Rust編程語(yǔ)言在Android平臺(tái)上實(shí)現(xiàn)不同的功能。
- 總之,Android Rust是一個(gè)令人興奮的新項(xiàng)目,它將Rust編程語(yǔ)言引入Android應(yīng)用開(kāi)發(fā)領(lǐng)域。通過(guò)使用Rust,Android開(kāi)發(fā)者可以編寫(xiě)更安全、更高效的代碼,并充分利用Rust的各種特性。隨著Android Rust項(xiàng)目的不斷發(fā)展,我們期待看到更多使用Rust編寫(xiě)的Android應(yīng)用出現(xiàn)。
Android Rust模塊編譯語(yǔ)法實(shí)例
3.Rust 二進(jìn)制文件的模塊定義示例
rust_binary {
name: "hello_rust",
crate_name: "hello_rust",
srcs: ["src/hello_rust.rs"],
host_supported: true,
}
4.基本模塊類型
5.重要的通用屬性
name
name 是模塊的名稱。與其他 Soong 模塊一樣,此名稱必須在大多數(shù) Android.bp 模塊類型中具有唯一性。
默認(rèn)情況下,name 被用作輸出文件名。如果輸出文件名必須與模塊名稱不同,使用 stem 屬性定義輸出文件名。
stem
stem(可選)直接控制輸出文件名(不包括文件擴(kuò)展名和其他后綴)。
例如,stem 值為 libfoo 的 rust_library_rlib 庫(kù)會(huì)生成一個(gè) libfoo.rlib 文件。如果沒(méi)有為 stem 屬性提供值,輸出文件名將默認(rèn)采用模塊名稱。
無(wú)法將模塊名稱設(shè)置為所需的輸出文件名時(shí),請(qǐng)使用 stem 函數(shù)。
舉例而言,假設(shè)因?yàn)橐呀?jīng)存在一個(gè) liblog cc_library,log crate 的 rust_library 被命名為 liblog_rust。
在這種情況下,使用 stem 屬性可以確保輸出文件被命名為 liblog.* 而不是 liblog_rust.*。
srcs
srcs 包含代表模塊入口點(diǎn)的單個(gè)源代碼文件(通常是 main.rs 或 lib.rs)。
rustc 負(fù)責(zé)解析和發(fā)現(xiàn)編譯所需的所有其他源代碼文件,生成的 deps 文件中將列舉這些文件。
crate_name
crate_name 通過(guò) rustc --crate_name 標(biāo)志設(shè)置 crate 名稱元數(shù)據(jù)。
對(duì)于會(huì)生成庫(kù)的模塊,此屬性必須與源代碼中預(yù)期使用的 crate 名稱相匹配。
例如,如果源代碼中以 extern crate foo_bar 的形式引用模塊 libfoo_bar,那么此屬性就必須為 crate_name: "foo_bar"。
此屬性對(duì)所有 rust_* 模塊都是通用的,但是對(duì)于會(huì)生成 Rust 庫(kù)的模塊(例如 rust_library、rust_ffi、rust_bindgen、rust_protobuf 和 rust_proc_macro)是必需的。這些模塊強(qiáng)制執(zhí)行有關(guān) rustc 與輸出文件名之間關(guān)系的 crate_name 要求。
lints
默認(rèn)情況下,系統(tǒng)會(huì)針對(duì)除源代碼生成器外的所有模塊類型運(yùn)行 rustc linter。目前定義了一些 lint 集,并用其驗(yàn)證模塊源代碼。此類 lint 集可能的值如下所示:
default(默認(rèn)的 lint 集,具體視模塊位置而定)
android(應(yīng)用于所有 Android 平臺(tái)代碼的最嚴(yán)格的 lint 集)
vendor(應(yīng)用于供應(yīng)商代碼的寬松 lint 集)
none(用于忽略所有 lint 警告和錯(cuò)誤)
clippy_lints
默認(rèn)情況下,系統(tǒng)還會(huì)針對(duì)除源代碼生成器外的所有模塊類型運(yùn)行 clippy linter。目前定義了幾個(gè) lint 集,用于驗(yàn)證模塊源代碼。下面列出了一些可能的值:
default(默認(rèn)的 lint 集,具體視模塊位置而定)
android(應(yīng)用于所有 Android 平臺(tái)代碼的最嚴(yán)格的 lint 集)
vendor(應(yīng)用于供應(yīng)商代碼的寬松 lint 集)
none(用于忽略所有 lint 警告和錯(cuò)誤)
edition
edition 定義用于編譯此代碼的 Rust 版本。此屬性與 C 和 C++ 標(biāo)準(zhǔn)的版本類似。有效的值為 2015 和 2018(默認(rèn)值)。
flags
flags 包含一個(gè)字符串列表,列出了要在編譯期間傳遞給 rustc 的標(biāo)志。
ld_flags
ld-flags 包含一個(gè)字符串列表,列出了要在編譯源代碼時(shí)傳遞給鏈接器的標(biāo)志。
這些標(biāo)志通過(guò) -C linker-args rustc 標(biāo)志傳遞。clang 用作鏈接器前端,為實(shí)際鏈接調(diào)用 lld。
features
features 是在編譯期間必須啟用的功能的字符串列表。此屬性通過(guò) --cfg 'feature="foo"' 傳遞給 rustc。
由于大多數(shù)功能可以累加使用,因此在許多情況下,此屬性包括所有相關(guān)模塊所需的全套功能。
過(guò),如果功能互斥,請(qǐng)?jiān)谌魏翁峁┝藳_突功能的構(gòu)建文件中定義其他模塊。
cfgs
cfgs 包含一個(gè)字符串列表,列出了要在編譯期間啟用的 cfg 標(biāo)志。此屬性通過(guò) --cfg foo 和 --cfg "fizz=buzz" 傳遞給 rustc。
構(gòu)建系統(tǒng)會(huì)在特定情況下自動(dòng)設(shè)置某些 cfg 標(biāo)志,如下所列:
作為 dylib 構(gòu)建的模塊將設(shè)置 android_dylib cfg。
將使用 VNDK 的模塊將設(shè)置 android_vndk cfg。這類似于 C++ 中的 __ANDROID_VNDK__ 定義。
strip
strip 用于控制是否剝離以及如何剝離輸出文件中的內(nèi)容(如果適用)。
如果未設(shè)置此屬性,設(shè)備模塊將默認(rèn)剝離除 mini debuginfo 外的所有內(nèi)容。
默認(rèn)情況下,主機(jī)模塊不會(huì)剝離任何符號(hào)。有效值包括用于停用剝離的 none,以及用于剝離所有內(nèi)容(包括 mini debuginfo)的 all
host_supported
對(duì)于設(shè)備模塊,host_supported 參數(shù)用于指示該模塊是否也應(yīng)該提供主機(jī)變體。
``
6.定義庫(kù)依賴項(xiàng)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-837035.html
關(guān)聯(lián)到 Rust 庫(kù)時(shí),除非有特定原因,否則最佳做法是使用 rustlibs 屬性而不是使用 rlibs 或 dylibs。這樣,構(gòu)建系統(tǒng)就可以根據(jù)根模塊所需選擇正確的關(guān)聯(lián),而且依賴項(xiàng)樹(shù)同時(shí)包含庫(kù)的 rlib 和 dylib 版本(這種情況會(huì)導(dǎo)致編譯失?。┑目赡苄砸矔?huì)降低。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-837035.html
7.不支持和支持有限的構(gòu)建功能
Soong 的 Rust 對(duì) vendor 和 vendor_ramdisk 映像與快照提供有限支持,但支持 staticlibs、cdylibs、rlibs 和 binaries。
對(duì)于供應(yīng)商映像構(gòu)建目標(biāo),已設(shè)置了 android_vndk cfg 屬性。如果系統(tǒng)目標(biāo)和供應(yīng)商目標(biāo)之間存在差異,您可以在代碼中使用此屬性。
rust_proc_macros 不會(huì)作為供應(yīng)商快照的一部分捕獲;如果依賴于這些宏,請(qǐng)確保對(duì)其進(jìn)行適當(dāng)?shù)陌姹究刂啤?
不支持產(chǎn)品映像、VNDK 和恢復(fù)映像。
8.增量構(gòu)建
- 開(kāi)發(fā)者可以通過(guò)將 SOONG_RUSTC_INCREMENTAL 環(huán)境變量設(shè)置為 true 來(lái)啟用 Rust 源代碼的增量編譯。
到了這里,關(guān)于Android14之Android Rust模塊編譯語(yǔ)法(一百八十七)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!