Soong Yapı Sistemi

Android 7.0 sürümünden önce Android, oluşturma kurallarını açıklamak ve yürütmek için özel olarak GNU Make'ı kullandı. Make build sistemi geniş çapta desteklenmekte ve kullanılmaktadır, ancak Android'in ölçeğinde yavaş, hataya açık, ölçeklenemez ve test edilmesi zor hale gelmiştir. Soong derleme sistemi, Android derlemeleri için gereken esnekliği sağlar.

Bu nedenle platform geliştiricilerin bir an önce Make'den geçiş yapması ve Soong'u benimsemesi bekleniyor. Destek almak için android geliştiren Google Grubuna soru gönderin.

Soong nedir?

Soong yapı sistemi, Make'in yerini almak üzere Android 7.0'da (Nougat) tanıtıldı. 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 Build System açıklamasına bakın ve Make to Soong'a uyum sağlamak için gereken değişiklikler hakkında bilgi edinmek için Android.mk Yazarları için Sistem Değişiklikleri Yapın .

Temel terimlerin tanımları için sözlükteki yapıyla ilgili girişlere ve tüm ayrıntılar için Soong referans dosyalarına bakın.

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

Burada, Soong'un bir Soong yapılandırma (Blueprint veya .bp ) dosyasında aynısını gerçekleştirmesiyle Yapılandırma Yap'ın karşılaştırması yer almaktadır.

Örnek olun

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)

Yakında örnek

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 bkz . Basit Yapı Yapılandırması .

Android.bp dosya biçimi

Tasarım gereği, Android.bp dosyaları basittir. Koşullu ifadeler veya kontrol akışı ifadeleri içermezler; tüm karmaşıklık, Go'da yazılmış yapı mantığı tarafından yönetilir. Mümkün olduğunda, Android.bp dosyalarının sözdizimi ve semantiği Bazel BUILD dosyalarına benzer.

Modüller

Android.bp dosyasındaki bir modül, bir modül türüyle başlar ve ardından name: "value", format:

cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

Her modülün bir name özelliği olmalıdır ve değer, ad alanlarındaki ve önceden oluşturulmuş modüllerdeki yinelenebilen name özelliği değerleri dışında tüm Android.bp dosyalarında benzersiz olmalıdır.

srcs özelliği, modülü oluşturmak için kullanılan kaynak dosyaları bir dize listesi olarak belirtir. ":<module-name>" modül referans sözdizimini kullanarak, genrule veya filegroup gibi kaynak dosyalar üreten diğer modüllerin çıktılarına başvurabilirsiniz.

Geçerli modül türlerinin ve özelliklerinin bir listesi için Soong Modülleri Referansına bakın.

Türler

Değişkenler ve özellikler, ilk atamaya göre dinamik olarak değişkenler ve modül tipine göre statik olarak ayarlanan özellikler ile güçlü bir şekilde yazılır. Desteklenen türler şunlardır:

  • Boolean ( true veya false )
  • tamsayılar ( int )
  • Dizeler ( "string" )
  • Dize listeleri ( ["string1", "string2"] )
  • Haritalar ( {key1: "value1", key2: ["value2"]} )

Haritalar, iç içe haritalar da dahil olmak üzere her türden değer içerebilir. Listelerde ve haritalarda son değerden sonra virgül olabilir.

Küreler

srcs gibi bir dosya listesi alan özellikler de glob kalıpları alabilir. Glob kalıpları normal UNIX joker karakterini * içerebilir, örneğin *.java . Glob kalıpları ayrıca yol öğesi olarak sıfır veya daha fazla yol öğesiyle eşleşen tek bir ** joker karakter içerebilir. Örneğin, java/**/*.java hem java/Main.java hem de java/com/android/Main.java kalıplarıyla eşleşir.

Değişkenler

Bir Android.bp dosyası, üst düzey değişken atamaları içerebilir:

gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
    name: "gzip",
    srcs: gzip_srcs,
    shared_libs: ["libz"],
    stl: "none",
}

Değişkenler, herhangi bir alt Blueprint dosyasının yanı sıra içinde bildirildikleri dosyanın geri kalanına göre kapsamlandırılır. Değişkenler değişmezdir, bir istisna dışında: += atamasıyla eklenebilirler, ancak yalnızca başvurulmadan önce.

Yorumlar

Android.bp dosyaları, C stili çok satırlı /* */ ve C++ stili tek satırlı // yorumlar içerebilir.

Operatörler

Dizeler, dizi listeleri ve haritalar + operatörü kullanılarak eklenebilir. Tamsayılar + operatörü kullanılarak toplanabilir. Bir haritanın eklenmesi, her iki haritada bulunan anahtarların değerlerinin eklenmesiyle her iki haritadaki anahtarların birleşimini oluşturur.

Şartlılar

Soong, Android.bp dosyalarındaki koşullu ifadeleri desteklemez. Bunun yerine, koşullu ifadeler gerektirecek yapı kurallarındaki karmaşıklık, üst düzey dil özelliklerinin kullanılabileceği ve koşullu koşullar tarafından sunulan örtük bağımlılıkların izlenebileceği Go'da ele alınır. Çoğu koşul, haritadaki değerlerden birinin seçildiği ve üst düzey özelliklere eklendiği bir harita özelliğine dönüştürülür.

Örneğin, mimariye özgü dosyaları desteklemek için:

cc_library {
    ...
    srcs: ["generic.cpp"],
    arch: {
        arm: {
            srcs: ["arm.cpp"],
        },
        x86: {
            srcs: ["x86.cpp"],
        },
    },
}

biçimlendirici

Soong, Blueprint dosyaları için gofmt'ye benzer bir kurallı biçimlendirici içerir. Geçerli dizindeki tüm Android.bp dosyalarını yinelemeli olarak yeniden biçimlendirmek için şunu çalıştırın:

bpfmt -w .

Kanonik biçim, dört boşluklu girintiler, çok öğeli bir listenin her öğesinden sonra yeni satırlar ve listelerde ve haritalarda sondaki bir virgül içerir.

Özel modüller

Bazı özel modül grupları benzersiz özelliklere sahiptir.

Varsayılan modüller

Aynı özellikleri birden fazla modülde tekrarlamak için bir varsayılan modül kullanılabilir. Örneğin:

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, bir modülün kaynak tabanlı benzerleriyle aynı ada sahip olmasına izin verir. Ö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 sağlar. Bir derleme yapılandırması her iki sürümü de içeriyorsa, önceden oluşturulmuş modül tanımındaki prefer bayrağı değeri hangi sürümün önceliğe sahip olduğunu belirler. Bazı önceden oluşturulmuş modüllerin android_app_import gibi prebuilt adlarla başlamadığını unutmayın.

Ad alanı modülleri

Android, Make'den Soong'a tamamen dönüşene kadar, Make ürün yapılandırması bir PRODUCT_SOONG_NAMESPACES değeri belirtmelidir. Değeri, Soong'un m komutu tarafından oluşturulmak üzere Make'e dışa aktardığı ad alanlarının boşlukla ayrılmış bir listesi olmalıdır. Android'in Soong'a dönüşümü tamamlandıktan sonra, ad alanlarını etkinleştirmenin ayrıntıları değişebilir.

Soong, her modül ayrı bir ad alanı içinde bildirildiği sürece, farklı dizinlerdeki modüller için aynı adı belirtme yeteneği sağlar. Bir ad alanı şu şekilde bildirilebilir:

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

Bir ad alanının bir ad özelliğine sahip olmadığına dikkat edin; yolu, adı olarak otomatik olarak atanır.

Her Soong modülüne, ağaçtaki konumuna göre bir ad alanı atanır. Her Soong modülünün, geçerli dizinde veya en yakın ata dizininde 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 örtük kök ad alanında olduğu kabul edilir.

İşte bir örnek: Soong, I1, I2, I3… ad alanlarını içe aktaran N ad alanında M modülü tarafından bildirilen D bağımlılığını çözmeye çalışır…

  1. Daha sonra D //namespace:module formunun tam nitelenmiş bir adıysa, belirtilen modül adı için yalnızca belirtilen ad alanı aranır.
  2. Aksi takdirde, Soong önce N ad alanında bildirilen D adlı bir modülü arar.
  3. Bu modül yoksa Soong, I1, I2, I3… ad alanlarında D adlı bir modül arar.
  4. Son olarak Soong, kök ad alanına bakar.