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.
- 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. - Aksi takdirde Soong, önce N adında bir ad alanında tanımlanmış D adlı bir modül arar.
- Bu modül mevcut değilse Soong, I1, I2, I3… ad alanlarında D adlı bir modül arar.
- Son olarak Soong, kök ad alanında arama yapar.