Android Rust modülleri

Genel prensip olarak, rust_* modül tanımları cc_* kullanımı ve beklentilerine sıkı sıkıya 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 sayfa, rust_* modüllerinin en yaygın özelliklerini kapsar. Belirli modül türleri ve örnek modül tanımları hakkında daha fazla bilgi için bkz. İkili modüller , Kitaplık modülleri veya Test modülleri .

Temel modül türleri

Tip Tanım Daha fazla bilgi için
rust_binary Bir Rust ikilisi İkili Modüller sayfası
rust_library Bir Rust kitaplığı oluşturur ve hem rlib hem de dylib değişkenlerini sağlar. rust_library , Kütüphane Modülleri sayfası.
rust_ffi Cc modülleri tarafından kullanılabilen bir Rust C kitaplığı üretir ve hem statik hem de paylaşılan değişkenler sağlar. rust_ffi , Kütüphane Modülleri sayfası
rust_proc_macro Bir proc-macro Rust kütüphanesi üretir. (Bunlar derleyici eklentilerine benzer.) rust_proc_macro , Kitaplıklar Modülleri sayfası
rust_test Standart Rust test donanımını kullanan bir Rust test ikili dosyası üretir. Test Modülleri sayfası
rust_fuzz libfuzzer yararlanan bir Rust fuzz ikili dosyası üretir. rust_fuzz modülü örneği
rust_protobuf Kaynak oluşturur ve belirli bir protobuf için arayüz sağlayan bir Rust kütüphanesi üretir. Protobuf Modülleri ve Kaynak Oluşturucu sayfaları
rust_bindgen Kaynak oluşturur ve C kitaplıklarına Rust bağlamaları içeren bir Rust kitaplığı üretir. Bindgen Bağlama Modülleri ve Kaynak Oluşturucu sayfaları

Önemli ortak özellikler

Bu özellikler tüm Android Rust Modüllerinde ortaktır. Bireysel Rust modülleriyle ilişkili tüm ek (benzersiz) özellikler, o modülün sayfasında listelenir.

isim

name modülünüzün adıdır. Diğer Soong modülleri gibi bunun da çoğu Android.bp modül türünde benzersiz olması gerekir. Varsayılan olarak, çıktı dosya adı olarak name kullanılır. Çıkış dosya adının modül adından farklı olması gerekiyorsa bunu tanımlamak için stem özelliğini kullanın.

kök

stem (isteğe bağlı), çıktı dosya adı üzerinde doğrudan kontrol sağlar (dosya uzantısı ve diğer son ekler hariç). Örneğin, libfoo kök değerine sahip bir rust_library_rlib kitaplığı, bir libfoo.rlib dosyası üretir. stem özelliği için bir değer sağlamazsanız çıktı dosya adı, varsayılan olarak modül adını kullanır.

Modül adını istenen çıktı dosya adına ayarlayamadığınızda stem işlevini kullanın. Örneğin, log kasasının rust_library liblog_rust olarak adlandırılmıştır çünkü bir liblog cc_library zaten mevcuttur. Bu durumda stem özelliğinin kullanılması, çıktı dosyasının liblog.* yerine liblog_rust.* olarak adlandırılmasını sağlar.

kaynaklar

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 tüm diğer kaynak dosyaların çözümlenmesini ve keşfedilmesini sağlar ve bunlar, üretilen deps dosyasında numaralandırılır.

Mümkün olduğunda platform kodu için bu kullanımdan kaçının; Daha fazla bilgi için Kaynak Jeneratörleri'ne bakın.

sandık_adı

crate_name sandık adı meta verilerini rustc --crate_name bayrağı aracılığıyla ayarlar. Kitaplıklar üreten modüller için bu, kaynakta kullanılan beklenen kasa adıyla eşleşmelidir . Örneğin, libfoo_bar modülüne kaynakta extern crate foo_bar olarak başvuruluyorsa, bu sandık_adı: "foo_bar" olmalıdır .

Bu özellik tüm rust_* modülleri için ortaktır ancak Rust kitaplıkları üreten modüller için gereklidir (örneğin, rust_library rust_ffi , rust_bindgen , rust_protobuf ve rust_proc_macro ). Bu modüller, crate_name ile çıktı dosya adı arasındaki ilişkiye ilişkin rustc gerekliliklerini uygular. Daha fazla bilgi için Kütüphane Modülleri bölümüne bakın.

tüyler

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

  • modülün konumuna bağlı olarak varsayılan tüy kümesini default
  • android tüm Android platform kodları için geçerli olan en katı tüy bırakmayan settir
  • vendor satıcı koduna uygulanan rahat bir tüy bırakmayan dizi
  • none tüm tüy bırakmayan uyarıları ve hataları göz ardı etmek için

Clippy_lints

Clippy linter, kaynak oluşturucular dışındaki 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ç tüy kümesi tanımlanmıştır. Bunlar bazı olası değerlerdir:

  • modülün konumuna bağlı olarak default varsayılan tüy tiftiği seti
  • android tüm Android platform kodları için geçerli olan en katı tüy bırakmayan settir
  • vendor satıcı koduna uygulanan rahat bir tüy bırakmayan dizi
  • none tüm tüy bırakmayan uyarıları ve hataları göz ardı etmek için

baskı

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 ve 2018 (varsayılan).

bayraklar

flags derleme sırasında rustc aktarılacak bayrakların bir dize listesini içerir.

ld_flags

ld-flags kaynağı derlerken bağlayıcıya iletilecek bayrakların bir dize listesini içerir. Bunlar -C linker-args Rusc bayrağıyla iletilir. clang bağlayıcı ön uç 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 bir dize listesidir. --cfg 'feature="foo"' ile Rusc'a iletilir. Çoğu özellik eklemelidir, dolayısıyla çoğu durumda bu, tüm bağımlı modüllerin gerektirdiği tüm özellikler setinden oluşur. Ancak özelliklerin birbirini dışladığı durumlarda, herhangi bir yapı dosyasında çakışan özellikler sağlayan ek modüller tanımlayın.

CFG'ler

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

Yapı sistemi, aşağıda listelenen belirli durumlarda belirli cfg bayraklarını otomatik olarak ayarlar:

  • Dylib olarak oluşturulan modüller android_dylib cfg setine sahip olacaktır.

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

şerit

strip çıktı dosyasının çıkarılıp çıkarılmayacağını ve nasıl çıkarılacağını (varsa) kontrol eder. Bu ayarlanmazsa, cihaz modülleri varsayılan olarak mini hata ayıklama bilgisi dışındaki her şeyi çıkarır. Ana bilgisayar modülleri varsayılan olarak hiçbir sembolü çıkarmaz. Geçerli değerler, ayırmayı devre dışı bırakmak için none ve mini hata ayıklama bilgisi de dahil olmak üzere her şeyi çıkarmak için all içerir. Ek değerler Soong Modül Referansında bulunabilir.

ana bilgisayar_desteklendi

Cihaz modülleri için host_supported parametresi, modülün ayrıca bir ana bilgisayar varyantı 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ülkiyet adı Tanım
rustlibs Aynı zamanda bağımlılık olan rust_library modüllerinin listesi. Yapı sisteminin tercih edilen bağlantıyı seçmesine olanak tanıdığından, bağımlılıkları bildirmek için tercih ettiğiniz yöntem olarak bunu kullanın. (Aşağıdaki Rust kitaplıklarına bağlantı verirken bölümüne bakın)
rlibs Statik olarak rlibs olarak bağlanması gereken rust_library modüllerinin listesi. (Dikkatli kullanın; aşağıdaki Rust kitaplıklarına bağlantı verirken 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 sonuçta ortaya çıkan kitaplığa tamamen dahil edilmesi gereken cc_library modüllerinin listesi. rust_ffi_static çeşitleri için, whole_static_libraries sonuçta ortaya çıkan statik kitaplık arşivine dahil edilecektir. rust_library_rlib çeşitleri için, whole_static_libraries kitaplıkları sonuçtaki rlib kitaplığında paketlenecektir.

Rust kitaplıklarına karşı bağlantı oluştururken , en iyi uygulama olarak, özel bir nedeniniz olmadığı sürece bunu rlibs veya dylibs yerine rustlibs özelliğini kullanarak yapın. 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, derlemenin başarısız olmasına neden olur).

Desteklenmeyen ve sınırlı destek oluşturma özellikleri

Soong's Rust , vendor ve vendor_ramdisk görüntüleri ve anlık görüntüleri için sınırlı destek sunar. Ancak staticlibs , cdylibs , rlibs ve binaries desteklenir. Satıcı imajı oluşturma hedefleri için android_vndk cfg özelliği ayarlanır. Sistem ve satıcı hedefleri arasında farklar varsa bunu kodda kullanabilirsiniz. rust_proc_macros satıcı anlık görüntülerinin bir parçası olarak yakalanmaz; bunlara bağlıysa, bunların sürüm kontrolünü uygun şekilde 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ştirebilirler.

Uyarı : Bunun, buildbot'lar tarafından oluşturulanlarla aynı ikili dosyalar üreteceği garanti edilmez. Nesne dosyalarının içerdiği işlevlerin veya verilerin adresleri farklı olabilir. Oluşturulan yapıtların EngProd altyapısı tarafından oluşturulanlarla %100 aynı olduğundan emin olmak için bu değeri ayarlamadan bırakın.