Yapı sistemi, aynı yapıda 32 bit ve 64 bit olmak üzere iki hedef CPU mimarisi için ikili dosyalar oluşturmayı destekler. Bu iki hedefli yapı, çoklu kütüphane yapısı olarak bilinir.
Yerleşik statik kitaplıklar ve paylaşılan kitaplıklar için yapı sistemi, her iki mimariye yönelik ikili dosyalar oluşturmaya yönelik kurallar ayarlar. Bağımlılık grafiğiyle birlikte ürün yapılandırması ( PRODUCT_PACKAGES
), hangi ikili dosyaların oluşturulduğunu ve sistem görüntüsüne yüklendiğini belirler.
Yürütülebilir dosyalar ve uygulamalar için derleme sistemi varsayılan olarak yalnızca 64 bit sürümü oluşturur, ancak bu ayarı genel bir BoardConfig.mk
değişkeni veya modül kapsamlı bir değişkenle geçersiz kılabilirsiniz.
İkinci bir CPU mimarisini ve ABI'yi tanımlayın
BoardConfig.mk
ikinci CPU mimarisini ve uygulama ikili arayüzünü (ABI) yapılandırmak için aşağıdaki değişkenleri içerir:
-
TARGET_2ND_ARCH
-
TARGET_2ND_ARCH_VARIANT
-
TARGET_2ND_CPU_VARIANT
-
TARGET_2ND_CPU_ABI
-
TARGET_2ND_CPU_ABI2
Bu değişkenleri kullanan örnek bir makefile için bkz build/make/target/board/generic_arm64/BoardConfig.mk
.
Çoklu kütüphane yapısında, PRODUCT_PACKAGES
içindeki modül adları, yapı sistemi tarafından tanımlandıkları sürece hem 32 bit hem de 64 bit ikili dosyaları kapsar. Bağımlılığın içerdiği kitaplıklar için, 32 bit veya 64 bit kitaplık, yalnızca başka bir 32 bit veya 64 bit kitaplık veya yürütülebilir dosya için gerekli olması durumunda yüklenir.
Ancak make
komut satırındaki modül adları yalnızca 64 bit sürümü kapsar. Örneğin, lunch aosp_arm64-eng
komutunu çalıştırdıktan sonra make libc
yalnızca 64 bit libc'yi oluşturur. 32 bit libc'yi oluşturmak için make libc_32
çalıştırmanız gerekir.
Android.mk'de modül mimarisini tanımlayın
Yapınızı 32 bit ve 64 bit için yapılandırmak için LOCAL_MULTILIB
değişkenini kullanabilir ve global TARGET_PREFER_32_BIT
değişkenini geçersiz kılabilirsiniz.
TARGET_PREFER_32_BIT
geçersiz kılmak için LOCAL_MULTILIB
aşağıdakilerden birine ayarlayın:
-
both
hem 32 bit hem de 64 bit oluşturur. -
32
yalnızca 32 bit oluşturur. -
64
yalnızca 64 bit oluşturur. -
first
yalnızca ilk mimari için oluşturulur (32 bit cihazlarda 32 bit ve 64 bit cihazlarda 64 bit).
Varsayılan olarak, LOCAL_MULTILIB
ayarlanmamıştır ve yapı sistemi, modül sınıfına ve LOCAL_MODULE_TARGET_ARCH
ve LOCAL_32_BIT_ONLY
gibi diğer LOCAL_ *
değişkenlerine dayalı olarak hangi mimarinin oluşturulacağına karar verir.
Modülünüzü belirli mimarilere göre oluşturmak istiyorsanız aşağıdaki değişkenleri kullanın:
LOCAL_MODULE_TARGET_ARCH
- Bu değişkeniarm x86 arm64
gibi bir mimari listesine ayarlayın. İnşa edilmekte olan mimari bu listede yer alıyorsa geçerli modül, derleme sistemine dahil edilir.LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
- Bu değişkenLOCAL_MODULE_TARGET_ARCH
tersidir. İnşa edilmekte olan mimari bu listedenot
mevcut modül, derleme sistemine dahil edilir.
Bu iki değişkenin küçük varyantları vardır:
-
LOCAL_MODULE_TARGET_ARCH_WARN
-
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN
Yapı sistemi, listelenen mimariler nedeniyle geçerli modülün atlanması durumunda uyarı verir.
Belirli bir mimariye yönelik yapı bayrakları ayarlamak için mimariye özgü LOCAL_ *
değişkenlerini kullanın; burada *
mimariye özgü bir son ektir, örneğin:
-
LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,
-
LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,
-
LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,
Bu değişkenler yalnızca o mimari için bir ikili dosya oluşturuluyorsa uygulanır.
Bazen ikili dosyanın 32 bit için mi yoksa 64 bit için mi oluşturulduğuna bağlı olarak bayrakları ayarlamak daha kolaydır. LOCAL_ *
değişkenini _32
veya _64
sonekiyle kullanın, örneğin:
-
LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,
-
LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,
-
LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,
Kitaplık yükleme yolunu ayarlayın
Çoklu kütüphane olmayan bir yapı için, bir kütüphaneyi varsayılan konum dışında bir konuma yüklemek için LOCAL_MODULE_PATH
kullanabilirsiniz. Örneğin, LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
.
Ancak çoklu kütüphane yapısında bunun yerine LOCAL_MODULE_RELATIVE_PATH
kullanın:
LOCAL_MODULE_RELATIVE_PATH := hw
Bu formatla hem 64 bit hem de 32 bit kitaplıklar doğru konuma kurulur.
Hem 32 bit hem de 64 bit olarak yürütülebilir bir dosya oluşturursanız yükleme yolunu ayırt etmek için aşağıdaki değişkenlerden birini kullanın:
-
LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64
- Kurulu dosya adını belirtir. -
LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64
- Yükleme yolunu belirtir.
Kaynak dosyalar için ara dizini edinin
Çoklu kütüphane yapısında, $(local-intermediates-dir)
(veya $(intermediates-dir-for)
dizinine açık değişkenlerle kaynak dosyalar oluşturursanız), güvenilir bir şekilde çalışmaz. Bunun nedeni, orta düzeyde oluşturulan kaynakların hem 32 bit hem de 64 bit yapılar için gerekli olmasıdır, ancak $(local-intermediates-dir)
iki ara dizinden yalnızca birine işaret eder.
Derleme sistemi, kaynak oluşturmak için özel, çoklu kütüphane dostu bir ara dizin sağlar. Ara dizinin yolunu almak için $(local-generated-sources-dir)
veya $(generated-sources-dir-for)
makrosunu kullanın. Bu makroların kullanımları $(local-intermediates-dir)
ve $(intermediates-dir-for)
makrolarına benzer.
Bu ayrılmış dizine bir kaynak dosya oluşturulursa ve LOCAL_GENERATED_SOURCES
tarafından alınırsa, bu dosya multilib yapısında hem 32 bit hem de 64 bit için oluşturulmuştur.
Önceden oluşturulmuş ikili hedeflerin sistem mimarisini belirtin
Çoklu kütüphane yapısında, önceden oluşturulmuş ikili hedeflerin sistem mimarisini belirtmek için TARGET_ARCH
veya TARGET_ARCH
ile TARGET_2ND_ARCH
kombinasyonunu kullanamazsınız. Bunun yerine LOCAL_ *
değişkenlerini LOCAL_MODULE_TARGET_ARCH
veya LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
kullanın.
Bu değişkenlerle yapı sistemi, 64 bitlik bir çoklu kütüphane yapısı üzerinde çalışıyor olsa bile karşılık gelen 32 bitlik önceden oluşturulmuş ikili dosyayı seçebilir.
Önceden oluşturulmuş ikili dosyanın kaynak yolunu hesaplamak için seçilen mimariyi kullanmak istiyorsanız $(get-prebuilt-src-arch)
çağırın.
32 bit ve 64 bit ODEX dosya oluşturulmasını sağlayın
64 bit cihazlar için varsayılan olarak Google, önyükleme görüntüsü ve tüm Java kitaplıkları için hem 32 bit hem de 64 bit ODEX dosyaları oluşturur. APK'lar için Google, varsayılan olarak yalnızca birincil 64 bit mimari için ODEX oluşturur. Bir uygulama hem 32 bit hem de 64 bit işlemlerde başlatılırsa, hem 32 bit hem de 64 bit ODEX dosyalarının oluşturulduğundan emin olmak için LOCAL_MULTILIB := both
kullanın. Uygulamanın herhangi bir 32 bit veya 64 bit JNI kitaplığı varsa, bu bayrak aynı zamanda derleme sistemine bunları dahil etmesini de bildirir.