Android Rust modülleri

Genel bir ilke olarak, rust_* modül tanımları, kullanıma ve beklentilere cc_* yakından bağlıdır. Aşağıda, Rust ikili dosyası 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ülleri için en yaygın özellikler ele alınmaktadır. Belirli modül türleri ve örnek modül tanımları hakkında daha fazla bilgi edinmek 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ına gidin.
rust_libraryBir Rust kitaplığı oluşturur ve hem rlib hem de dylib varyantlarını sağlar. rust_library, Kitaplık Modülleri sayfasına gidin.
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. (Bu, derleyici eklentilerine benzer.) rust_proc_macro, Kitaplıklar Modülleri sayfası
rust_testStandart Rust test donanımlarını kullanan bir Rust test ikili dosyası oluşturur. Test Modülleri sayfası
rust_fuzzlibfuzzer'den yararlanarak Rust fuzz ikili dosyası 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. Protobuf Modülleri ve Kaynak Oluşturucular sayfaları
rust_bindgenKaynak oluşturur ve C kitaplıklarına Rust bağlamaları içeren bir Rust kitaplığı oluşturur. Bindgen Bağlama Modülleri ve Kaynak Oluşturucular sayfaları

Önemli ortak özellikler

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

ad

name, modülünüzün adıdır. Diğer Soong modülleri gibi bu modül de çoğu Android.bp modülü türü için benzersiz olmalıdır. Varsayılan olarak, çıkış dosyası adı olarak name kullanılır. Çıkış dosyası adı, modül adından farklı olmalıdır. Dosya adını tanımlamak için stem mülkünü kullanın.

sap

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

Modül adını istediğiniz çıkış dosya adına ayarlayamadığınızda stem işlevini kullanın. Örneğin, log kutusu için rust_library liblog cc_library zaten mevcut olduğundan liblog_rust olarak adlandırılır. Bu durumda stem özelliğini kullanmak, çı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 dosya içerir (genellikle main.rs veya lib.rs). rustc, derleme için gereken diğer tüm kaynak dosyalarının çözümlenmesini ve bulunmasını yönetir. Bu dosyalar, oluşturulan deps dosyasında listelenir.

Mümkün olduğunda platform kodunda 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şaretçisi aracılığıyla kutu adı meta verilerini ayarlar. Kitaplık oluşturan modüller için bu ad, kaynakta kullanılan beklenen paket adıyla eşleşmelidir. Örneğin, kaynakta libfoo_bar modülüne extern crate foo_bar olarak referans veriliyor ise bu, crate_name: "foo_bar" olmalıdır.

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

lints

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

  • default modülün konumuna bağlı olarak varsayılan lint grubu
  • android tüm Android platform kodları için geçerli olan en katı lint grubu
  • vendor tedarikçi koduna uygulanan gevşek bir lint grubu
  • 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 grubu tanımlanır. Olası değerlerden bazıları şunlardır:

  • default modülün konumuna bağlı olarak varsayılan lint grubu
  • android tüm Android platform kodları için geçerli olan en katı lint grubu
  • vendor tedarikçi koduna uygulanan gevşek bir lint grubu
  • 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'e 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şareti tarafından iletilir. clang, bağlayıcı ön ucu olarak kullanılır ve gerçek bağlantı için lld'ı çağırı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 eklemeli olduğundan çoğu durumda bu, tüm bağımlı modüller tarafından gereken tüm özellik grubundan oluşur. Ancak özelliklerin birbirini hariç tuttuğu durumlarda, derleme dosyalarında çakışan özellikler sağlayan ek modüller tanımlayın.

cfgs

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

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

  • dylib olarak oluşturulan modüllerde android_dylib cfg ayarlanır.

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

şerit

strip, çıkış dosyasının (varsa) soyulup soyulmayacağını ve nasıl soyulacağını kontrol eder. Bu ayar ayarlanmazsa cihaz modülleri varsayılan olarak mini debuginfo dışındaki her şeyi kaldırır. Ana makine modülleri varsayılan olarak hiçbir simgeyi kaldırmaz. Geçerli değerler arasında, ayıklama işlemini devre dışı bırakmak için none ve mini hata ayıklama bilgileri dahil her şeyi ayıklamak için all yer alır. Diğer değerleri Soong Modülleri Referansı bölümünde bulabilirsiniz.

host_supported

Cihaz modülleri için host_supported parametresi, modülün ana makine varyantı da sağlaması gerekip gerekmediğini belirtir.

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 Bağımlılık olan rust_library modüllerinin listesi. Derleme sisteminin tercih edilen bağlantıyı seçmesine olanak tanıdığı için bu yöntemi, bağımlılık beyan etmek için tercih ettiğiniz yöntem olarak kullanın. (Aşağıdaki Rust kitaplıklarına bağlantı oluştururken bölümüne bakın.)
rlibs rlibs olarak statik olarak bağlanması gereken rust_library modüllerinin listesi. (Dikkatle kullanın; aşağıdaki Rust kitaplıklarına bağlantı oluştururken bölümüne bakın.)
shared_libs Paylaşılan kitaplıklar olarak dinamik olarak 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 elde edilen kitaplığacc_library rust_ffi_static varyantları için whole_static_libraries, elde edilen statik kitaplık arşivine dahil edilir. rust_library_rlib varyantları için whole_static_libraries kitaplıkları, elde edilen rlib kitaplığında gruplandırılır.

Rust kitaplıklarıyla bağlantı oluştururken, belirli bir nedeniniz yoksa rlibs veya dylibs yerine rustlibs mülkünü kullanarak bağlantı oluşturmanız önerilir. Bu, derleme sisteminin kök modülün gerektirdiğine göre doğru bağlantıyı seçmesine olanak tanır ve bir 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 da derlemenin başarısız olmasına neden olur).

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

Soong'un Rust, vendor ve vendor_ramdisk resimleri ve anlık görüntüleri için sınırlı destek sunar. Ancak staticlibs, cdylibs, rlibs ve binaries desteklenir. Tedarikçi firma resim derleme hedefleri için android_vndk cfg mülkü ayarlanır. Sistem ve tedarikçi hedefleri arasında farklılıklar varsa bunu kodda kullanabilirsiniz. rust_proc_macros, tedarikçi firma anlık görüntülerinin bir parçası olarak yakalanmaz. Bunlara ihtiyaç duyuyorsanız uygun şekilde sürüm kontrolünü yaptığınızdan emin olun.

Ürün, VNDK ve kurtarma resimleri desteklenmez.

Artımlı derlemeler

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

Uyarı: Bu yöntemin, derleme robotları tarafından oluşturulanlarla aynı ikili dosyaları oluşturacağı 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ı olduğundan emin olmak için bu değeri ayarlanmamış olarak bırakın.