Android Rust modülleri

Genel bir ilke olarak, rust_* modül tanımları, cc_* kullanımına ve beklentilerine yakından bağlıdır. Aşağıda, Rust ikilisi için bir modül tanımı örneği verilmiştir:

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

Bu sayfada, rust_* modüllerinin en yaygın özellikleri ele alınmaktadır. Belirli modül türleri ve örnek modül tanımları hakkında daha fazla bilgi için İkili modüller, Kitaplık modülleri veya Test modülleri başlıklı makaleleri inceleyin.

Temel modül türleri

TürTanımDaha Fazla Bilgi Edinmek İçin
rust_binaryRust ikili dosyası İkili Modüller sayfası
rust_libraryRust kitaplığı oluşturur ve hem rlib hem de dylib varyantlarını sağlar. rust_library, Kitaplık Modülleri sayfası.
rust_fficc modülleri tarafından kullanılabilen bir Rust C kitaplığı oluşturur ve hem statik hem de paylaşılan varyantlar sağlar. rust_ffi, Kitaplık Modülleri sayfası
rust_proc_macroproc-macro Rust kitaplığı oluşturur. (Bunlar, derleyici eklentilerine benzer.) rust_proc_macro, Kitaplık Modülleri sayfası
rust_testStandart Rust test koşumunu kullanan bir Rust test ikilisi oluşturur. Test Modülleri sayfası
rust_fuzzlibfuzzer kullanarak Rust fuzz ikilisi oluşturur. rust_fuzz modülü örneği
rust_protobufKaynak oluşturur ve belirli bir protobuf için arayüz sağlayan bir Rust kitaplığı üretir. Protobufs Modules (Protobuf Modülleri) ve Source Generators (Kaynak Oluşturucular) sayfaları
rust_bindgenKaynak oluşturur ve C kitaplıklarına Rust bağlamaları içeren bir Rust kitaplığı üretir. Bindgen Bağlama Modülleri ve Kaynak Oluşturucular sayfaları

Önemli ortak özellikler

Bu özellikler tüm Android Rust modüllerinde ortaktır. Bağımsız Rust modülleriyle ilişkili tüm ek (benzersiz) özellikler, ilgili modülün sayfasında listelenir.

ad

name, modülünüzün adıdır. Diğer Soong modüllerinde olduğu gibi, bu da çoğu Android.bp modül türünde benzersiz olmalıdır. Varsayılan olarak, çıkış dosya adı olarak name kullanılır. Çıkış dosyasının adı, modül adından farklı olmalıdır. Bu durumda, adı tanımlamak için stem özelliğini kullanın.

kök

stem (isteğe bağlı) çıkış dosyasının adı (dosya uzantısı ve diğer sonekler hariç) üzerinde doğrudan kontrol sağlar. Örneğin, rust_library_rlib kök değeri libfoo olan bir kitaplık, libfoo.rlib dosyası oluşturur. stem özelliği için bir değer sağlamazsanız çıkış dosyasının adı varsayılan olarak modül adı olur.

Modül adını istediğiniz çıkış dosyası adına ayarlayamadığınızda stem işlevini kullanın. Örneğin, log kasası için rust_library, liblog cc_library zaten mevcut olduğundan liblog_rust olarak adlandırılır. Bu durumda stem özelliğinin kullanılması, çıkış dosyasının liblog_rust.* yerine liblog.* olarak adlandırılmasını sağlar.

srcs

srcs, modülünüzün giriş noktasını temsil eden tek bir kaynak dosyayı (genellikle main.rs veya lib.rs) içerir. rustc, derleme için gereken diğer tüm kaynak dosyaların çözümlenmesini ve bulunmasını sağlar. Bu dosyalar, oluşturulan deps dosyasında listelenir.

Mümkün olduğunda platform kodu için bu kullanımdan kaçının. Daha fazla bilgi için Kaynak Oluşturucular başlıklı makaleyi inceleyin.

crate_name

crate_name, rustc --crate_name işaretiyle paket adı meta verilerini ayarlar. Kitaplık üreten modüller için bu, kaynakta kullanılan beklenen sandık adıyla eşleşmelidir. Örneğin, kaynakta libfoo_bar modülüne extern crate foo_bar olarak referans veriliyorsa bu crate_name, "foo_bar" olmalıdır.

Bu özellik tüm rust_* modüllerinde ortaktır ancak rust_library (rust_ffi, rust_bindgen, rust_protobuf ve rust_proc_macro gibi) Rust kitaplıkları oluşturan modüller için zorunludur. Bu modüller, crate_name ile çıkış dosyasının adı arasındaki ilişkiyle ilgili rustc şartlarını zorunlu kılar. Daha fazla bilgi için Kitaplık Modülleri bölümüne bakın.

hata analizi

rustc linter, kaynak oluşturucular hariç tüm modül türleri için varsayılan olarak çalıştırılır. Bazı lint kümeleri, modül kaynağını doğrulamak için tanımlanır ve kullanılır. Bu tür lint kümeleri için olası değerler şunlardır:

  • default Modülün konumuna bağlı olarak varsayılan lint kümesi
  • android Tüm Android platform kodu için geçerli olan en katı lint kümesi
  • vendor satıcı koduna uygulanan gevşek bir lint kümesi
  • Tüm lint uyarılarını ve hatalarını yoksaymak için none

clippy_lints

Clippy linter, kaynak oluşturucular hariç tüm modül türleri için varsayılan olarak da çalıştırılır. Modül kaynağını doğrulamak için kullanılan birkaç lint kümesi tanımlanır. Olası değerlerden bazıları şunlardır:

  • Modülün konumuna bağlı olarak default varsayılan lint kümesi
  • android Tüm Android platform kodu için geçerli olan en katı lint kümesi
  • vendor satıcı koduna uygulanan gevşek bir lint kümesi
  • Tüm lint uyarılarını ve hatalarını yoksaymak için none

basım

edition, bu kodu derlemek için kullanılacak Rust sürümünü tanımlar. Bu, C ve C++ için std sürümlerine benzer. Geçerli değerler 2015, 2018 ve 2021'dir (varsayılan).

flags

flags, derleme sırasında rustc'ye iletilecek işaretlerin dize listesini içerir.

ld_flags

ld-flags, kaynak derlenirken bağlayıcıya iletilecek işaretlerin dize listesini içerir. Bunlar, -C linker-args rustc işaretiyle iletilir. clang, bağlayıcı ön ucu olarak kullanılır ve gerçek bağlama için lld çağrılır.

özellikler

features, derleme sırasında etkinleştirilmesi gereken özelliklerin dize listesidir. Bu, --cfg 'feature="foo"' tarafından rustc'ye iletilir. Çoğu özellik eklenir. Bu nedenle, birçok durumda bu, tüm bağımlı modüllerin gerektirdiği tam özellik setinden oluşur. Ancak özelliklerin birbirini dışladığı durumlarda, çakışan özellikler sağlayan tüm derleme dosyalarında ek modüller tanımlayın.

cfgs

cfgs, derleme sırasında etkinleştirilecek cfg işaretlerinin dize listesini içerir. Bu, --cfg foo ve --cfg "fizz=buzz" tarafından rustc'a iletilir.

Derleme sistemi, belirli durumlarda aşağıdaki cfg işaretlerini otomatik olarak ayarlar:

  • Dinamik kitaplık olarak oluşturulan modüllerde android_dylib cfg ayarlanır.

  • VNDK'yı kullanacak modüllerde android_vndk cfg ayarı bulunur. Bu, C++ için __ANDROID_VNDK__ tanımına benzer.

strip

strip, çıktı dosyasının (varsa) temizlenip temizlenmeyeceğini ve nasıl temizleneceğini kontrol eder. Bu ayar belirlenmemişse cihaz modülleri, mini debuginfo hariç her şeyi varsayılan olarak kaldırır. Varsayılan olarak, ana makine modülleri sembolleri kaldırmaz. Geçerli değerler arasında, none ile sıyırma işlemini devre dışı bırakma ve all ile mini debuginfo dahil her şeyi sıyırma yer alır. Ek değerleri Soong Modules Reference (Soong Modülleri Referansı) bölümünde bulabilirsiniz.

host_supported

Cihaz modüllerinde host_supported parametresi, modülün bir ana makine varyantı da sağlayıp sağlamaması gerektiğini gösterir.

Kitaplık bağımlılıklarını tanımlama

Rust modülleri, aşağıdaki özellikler aracılığıyla hem CC hem de Rust kitaplıklarına bağlı olabilir:

Mülk Adı Açıklama
rustlibs Aynı zamanda bağımlılık olan rust_library modüllerinin listesi. Bu yöntemi, derleme sisteminin tercih edilen bağlantıyı seçmesine olanak tanıdığı için tercih ettiğiniz bağımlılık bildirme yöntemi olarak kullanın. (Aşağıdaki Rust kitaplıklarına bağlama bölümüne bakın.)
rlibs rust_library olarak statik olarak bağlanması gereken rlibs modüllerinin listesi. (Dikkatli kullanın; aşağıdaki Rust kitaplıklarına bağlarken bölümüne bakın.)
shared_libs Paylaşılan kitaplıklar olarak dinamik şekilde bağlanması gereken cc_library modüllerinin listesi.
static_libs Statik kitaplıklar olarak statik olarak bağlanması gereken cc_library modüllerinin listesi.
whole_static_libs Statik kitaplıklar olarak statik olarak bağlanması ve sonuçtaki kitaplığa tamamen dahil edilmesi gereken cc_library modüllerinin listesi. rust_ffi_static varyantları için whole_static_libraries, sonuçta ortaya çıkan statik kitaplık arşivine dahil edilir. rust_library_rlib varyantları için whole_static_libraries kitaplıkları, sonuçta elde edilen rlib kitaplığına paketlenir.

Rust kitaplıklarına bağlarken, en iyi uygulama olarak, bunu yapmak için özel bir nedeniniz olmadığı sürece rlibs veya dylibs yerine rustlibs özelliğini kullanarak yapın. Bu, derleme sisteminin kök modülün gerektirdiklerine göre doğru bağlantıyı seçmesine olanak tanır ve bağımlılık ağacının bir kitaplığın hem rlib hem de dylib sürümlerini içerme olasılığını azaltır (bu durum derlemenin başarısız olmasına neden olur).

Desteklenmeyen ve sınırlı desteklenen derleme özellikleri

Soong's Rust, vendor ve vendor_ramdisk resimleri ile anlık görüntüler için sınırlı destek sunar. Ancak staticlibs, cdylibs, rlibs ve binaries desteklenir. Tedarikçi resim derleme hedefleri için android_vndk cfg özelliği ayarlanır. Sistem ve satıcı hedefleri arasında farklılıklar varsa bunu kodda kullanabilirsiniz. rust_proc_macros satıcı anlık görüntülerinin bir parçası olarak yakalanmaz. Bunlar kullanılıyorsa uygun şekilde sürüm kontrolü yaptığınızdan emin olun.

Ürün, VNDK ve kurtarma görüntüleri desteklenmez.

Artımlı derlemeler

Geliştiriciler, SOONG_RUSTC_INCREMENTAL ortam değişkenini true olarak ayarlayarak Rust kaynağının artımlı derlenmesini etkinleştirebilir.

Uyarı: Bu işlem, derleme botları tarafından oluşturulanlarla aynı ikili dosyaları üreteceği garanti edilmez. Nesne dosyalarında bulunan işlevlerin veya verilerin adresleri farklı olabilir. Oluşturulan yapıların EngProd altyapısı tarafından oluşturulanlarla %100 aynı olmasını sağlamak için bu değeri ayarlamayın.