Kaynak oluşturucular

Bu sayfada, oluşturulan kaynağın nasıl desteklendiği ve derleme sisteminde nasıl kullanılabileceğine dair genel bir bakış sunulmaktadır.

Tüm kaynak oluşturucular, benzer bir derleme sistemi işlevi sunar. Üç derleme sistemi tarafından desteklenen kaynak oluşturma kullanım alanları C bağlamaları oluşturuyor AIDL arayüzlerini ve protobuf arayüzlerini kullanarak.

Oluşturulan kaynaktan gelen kasalar

Kaynak kod üreten her Rust modülü bir kafes olarak kullanılabilir. (rust_library olarak tanımlandıysa) (Yani, bu bir hedef olarak tanımlanabilir rustlibs, rlibs ve dylibs özelliklerinde bağımlılık.) Platform kodu için en iyi kullanım şekli, oluşturulan kaynağı paket olarak kullanmaktır. Oluşturulan kaynak için include! makrosu desteklenmesine rağmen birincil amacı, external/ içinde bulunan üçüncü taraf kodunu desteklemektir.

Platform kodunun include!() makrosu (ör. kaynak oluşturmak için genrule modülü kullandığınızda) benzersiz bir şekilde kullanır.

Oluşturulan kaynağı dahil etmek için include!() işlevini kullanın.

Oluşturulan kaynağı kutu olarak kullanma, her bir (ilgili) modül sayfasındaki örneklerde ele alınmıştır. Bu bölümde, oluşturulan kaynağa nasıl referans verileceği gösterilmektedir include!() makrosu aracılığıyla iletilsin. Bu işlemin tüm kaynaklarda benzer olduğunu unutmayın. oluşturabilirsiniz.

Ön Koşul

Bu örnek, bir rust_bindgen tanımladığınız varsayılır. modülünü (libbuzz_bindgen) gerçekleştirip Oluşturulan kaynağı ekleme adımları'na geçebilirsiniz. (include!()) makrosuna karşılık gelir. Henüz yapmadıysanız lütfen Rust bindgen modülü tanımlama başlıklı makaleyi inceleyin, libbuzz_bindgen oluşturun ve buraya dönün.

Bu dosyanın derleme dosyası bölümlerinin tüm kaynak oluşturucular için geçerli olduğunu unutmayın.

Oluşturulan kaynağı ekleme adımları

Aşağıdaki içeriklerle external/rust/hello_bindgen/Android.bp oluşturun:

rust_binary {
   name: "hello_bzip_bindgen_include",
   srcs: [
         // The primary rust source file must come first in this list.
         "src/lib.rs",

         // The module providing the bindgen bindings is
         // included in srcs prepended by ":".
         ":libbuzz_bindgen",
    ],

    // Dependencies need to be redeclared when generated source is used via srcs.
    shared_libs: [
        "libbuzz",
    ],
}

Aşağıdaki içeriklerle external/rust/hello_bindgen/src/bindings.rs oluşturun:

#![allow(clippy::all)]
#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(unused)]
#![allow(missing_docs)]

// Note that "bzip_bindings.rs" here must match the source_stem property from
// the rust_bindgen module.
include!(concat!(env!("OUT_DIR"), "/bzip_bindings.rs"));

Aşağıdaki içeriklerle external/rust/hello_bindgen/src/lib.rs oluşturun:

mod bindings;

fn main() {
    let mut x = bindings::foo { x: 2 };
    unsafe { bindings::fizz(1, &mut x as *mut bindings::foo) }
}

Oluşturulan kaynak neden oluşturulur?

C/C++ derleyicilerinden farklı olarak, rustc yalnızca tek bir kaynak dosyayı kabul eder giriş noktasını temsil eder. Kaynağın çalışma sırasında ağaç, tüm gerekli kaynak dosyalarının otomatik olarak keşfedilebilir. Bu, oluşturulan kaynağın kaynak ağacına yerleştirilmesi veya kaynakta bir include yönergesi aracılığıyla sağlanması gerektiği anlamına gelir:

include!("/path/to/hello.rs");

Rust topluluğu, bu farkla çalışmak için build.rs komut dosyalarına ve Cargo derleme ortamıyla ilgili varsayımlara ihtiyaç duyar. Uygulama derlendiğinde cargo komutu bir OUT_DIR ortam değişkeni ayarlar Oluşturulan kaynak kodu build.rs komut dosyasının yerleştirmesi beklenen yer. Şunu kullanın: aşağıdaki komutu çalıştırın:

include!(concat!(env!("OUT_DIR"), "/hello.rs"));

Bu durum, her modülün çıkışları sıraya koyulduğu için Shortg için bir zorluk teşkil etmektedir. kendine ait out/ dizini1 bulunabilir. Tek bir OUT_DIR yok. bağımlılıkları, oluşturdukları kaynağın çıktısını verir.

AOSP, platform kodu için oluşturulan kaynağı, aşağıdaki nedenlerden dolayı içe aktarılabilen bir pakete paketlemeyi tercih eder:

  • Oluşturulan kaynak dosya adlarının çakışmasını önleyin.
  • Ağaç boyunca kaydedilen ve bakım gerektiren ortak metin kodunun sayısını azaltın. Proje yönetiminde oluşturulan kaynak derlemesini yapmak için gereklidir merkezi olarak bakımını yapabiliriz.
  • Oluşturulan kod ile etrafındaki kafes arasında örtülü 2 etkileşimlerinden kaçının.
  • Sık kullanılan oluşturulan kaynakları dinamik olarak bağlayarak bellek ve disk üzerindeki baskıyı azaltın.

Sonuç olarak, Android'in Rust kaynak oluşturma modülü türlerinin tümü, derlenip paket olarak kullanılabilen kodlar oluşturur. Shortg, herhangi bir değişiklik yapılmadan üçüncü taraf kasalarını desteklemeye devam etmektedir. bir modül için oluşturulan kaynak bağımlılıkları, modül başına tek bir bileşene kopyalanır olduğunu varsayalım. Bu gibi durumlarda Mostg, OUT_DIR ortam değişkenini ayarlar oluşturulan kaynağın bulunabilmesi için bu dizinde yer alır. Ancak daha önce açıklanan nedenlerden dolayı, bu mekanizmanın platform kodunda yalnızca kesinlikle gerekli olduğunda kullanılması en iyi uygulamadır.


  1. Oluşturulan kaynağın yolu doğrudan derleyiciye sağlandığından bu durum C/C++ ve benzer diller için herhangi bir sorun teşkil etmez. 

  2. include!, metin dahil etme yöntemiyle çalıştığından, kapsayıcı ad alanındaki değerlere referans verebilir, ad alanını değiştirebilir veya #![foo] gibi yapıları kullanabilir. Bu dolaylı etkileşimlerin sürdürülmesi zor olabilir. Paketin geri kalanıyla etkileşim gerçekten gerekli olduğunda her zaman makroları tercih edin.