Make'ten Soong'a dönüştürme

Android 7.0 sürümünden önce Android, derleme kurallarını tanımlamak ve yürütmek için yalnızca GNU Make'i kullanıyordu. Make derleme sistemi yaygın olarak desteklenir ve kullanılır ancak Android'in ölçeğinde yavaş, hataya yatkın, ölçeklendirilemez ve test edilmesi zor hale geldi. Soong derleme sistemi, Android derlemeleri için gereken esnekliği sağlar.

Bu nedenle, platform geliştiricilerinin en kısa sürede Make'ten geçiş yapıp Soong'u benimsemeleri beklenmektedir. Destek almak için android-building Google grubuna soru gönderin.

Soong nedir?

Soong derleme sistemi, Make'in yerini almak üzere Android 7.0 (Nougat) sürümünde kullanıma sunulmuştur. Android derlemelerini hızlandırmak için Kati GNU Make klonlama aracından ve Ninja derleme sistemi bileşeninden yararlanır.

Genel talimatlar için Android Açık Kaynak Projesi'ndeki (AOSP) Android Make Derleme Sistemi açıklamasına ve Make'ten Soong'a geçiş için gereken değişiklikler hakkında bilgi edinmek üzere Android.mk Yazarları İçin Derleme Sistemi Değişiklikleri başlıklı makaleye göz atın.

Anahtar terimlerin tanımları için sözlükteki derlemeyle ilgili girişlere, tüm ayrıntılar için de Soong referans dosyalarına bakın.

Make ve Soong karşılaştırması

Aşağıda, Make yapılandırma ile Soong yapılandırma (Blueprint veya .bp) dosyasında aynı işlemi gerçekleştirmenin karşılaştırması verilmiştir.

Örnek oluşturma

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

Soong örneği

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

Teste özel Soong yapılandırma örnekleri için Basit Derleme Yapılandırması başlıklı makaleyi inceleyin.

Android.bp dosyasındaki alanların açıklaması için Android.bp dosya biçimi bölümüne bakın.

Özel modüller

Bazı özel modül gruplarının benzersiz özellikleri vardır.

Varsayılan modüller

Varsayılanlar modülü, aynı özellikleri birden fazla modülde tekrarlamak için kullanılabilir. Örnek:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

Önceden oluşturulmuş modüller

Bazı hazır modül türleri, bir modülün kaynak tabanlı muadilleriyle aynı ada sahip olmasına olanak tanır. Örneğin, aynı ada sahip bir cc_binary varken foo adlı bir cc_prebuilt_binary olabilir. Bu sayede geliştiriciler, nihai ürünlerine hangi sürümü dahil edeceklerini seçebilirler. Bir derleme yapılandırması her iki sürümü de içeriyorsa öncelikli sürüm, önceden derlenmiş modül tanımındaki prefer işareti değerine göre belirlenir. Bazı önceden oluşturulmuş modüllerin adlarının prebuilt ile başlamadığını (ör. android_app_import) unutmayın.

Ad alanı modülleri

Android, Make'ten Soong'a tamamen geçiş yapana kadar Make ürün yapılandırmasında bir PRODUCT_SOONG_NAMESPACES değeri belirtilmelidir. Değeri, m komutu tarafından derlenmek üzere Soong'un Make'e dışa aktardığı ad alanlarının boşlukla ayrılmış bir listesi olmalıdır. Android'in Soong'a geçişi tamamlandıktan sonra, ad alanlarının etkinleştirilmesiyle ilgili ayrıntılar değişebilir.

Soong, her modül ayrı bir ad alanında tanımlandığı sürece farklı dizinlerdeki modüllerin aynı adı belirtmesine olanak tanır. Bir ad alanı şu şekilde tanımlanabilir:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

Ad alanının ad özelliği olmadığını, adının otomatik olarak yolu olarak atandığını unutmayın.

Her Soong modülüne, ağaçtaki konumuna göre bir ad alanı atanır. Her Soong modülünün, geçerli dizindeki veya en yakın üst dizindeki bir Android.bp dosyasında bulunan soong_namespace tarafından tanımlanan ad alanında olduğu kabul edilir. Böyle bir soong_namespace modülü bulunamazsa modülün, varsayılan kök ad alanında olduğu kabul edilir.

Aşağıda bir örnek verilmiştir: Soong, I1, I2, I3 ad alanlarını içe aktaran N ad alanındaki M modülü tarafından tanımlanan D bağımlılığını çözmeye çalışır.

  1. Ardından, D //namespace:module biçiminde tam nitelikli bir ad ise belirtilen modül adı için yalnızca belirtilen ad alanı aranır.
  2. Aksi takdirde Soong, önce N adında bir ad alanında tanımlanmış D adlı bir modül arar.
  3. Bu modül mevcut değilse Soong, I1, I2, I3… ad alanlarında D adlı bir modül arar.
  4. Son olarak Soong, kök ad alanında arama yapar.