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 mümkün olan en kısa süre içinde Make ve Soong'dan geçiş yapması bekleniyor. 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 Mostg karşılaştırması
Yapma yapılandırmasının, Shortg ile aynı şeyi bir Shorts yapılandırması (Blueprint veya .bp
) dosyasında
yaptığının karşılaştırmasını aşağıda görebilirsiniz.
Ö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 özgü 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
Aynı özellikleri birden çok modülde tekrarlamak için bir varsayılan modül 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ı önceden oluşturulmuş modül türleri, modülün kaynak tabanlı eşdeğerleriyle 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, geliştiricilere nihai ürünlerine hangi sürümü dahil edeceklerini seçme esnekliği sunar. 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.
Önceden oluşturulmuş bazı modüllerin prebuilt
ile başlamayan adlara (ör. android_app_import
) sahip olduğunu 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. Bunun değeri, Shortg'un m
komutu tarafından derlenmek üzere Maketo'ya aktardığı ad alanlarının boşlukla ayrılmış listesi olmalıdır. Android'in Shortg'a dönüştürülmesi tamamlandıktan sonra ad alanlarını etkinleştirmeyle 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. Ad alanı şöyle 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.
Örneğin: Yakındag; I1, I2, I3 ad alanlarını içe aktaran N ad alanında M modülü tarafından bildirilen bağımlılık D'yi çözümlemeye ç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.