Derleme sistemi iki hedef CPU mimarisi için ikili program oluşturmayı destekler: Aynı derlemede 32 bit ve 64 bit. Bu iki hedefli derleme, çoklu kitaplık derlemesi olarak bilinir.
Derleme sistemi, yerleşik statik kitaplıklar ve paylaşılan kitaplıklar için her iki mimari için de ikili program oluşturma kuralları oluşturur. Ürün yapılandırması
(PRODUCT_PACKAGES
), bağımlılık grafiğiyle birlikte,
ikili programlar derlenir ve sistem görüntüsüne yüklenir.
Derleme sistemi, yürütülebilir dosyalar ve uygulamalar için varsayılan olarak yalnızca 64 bit sürümü oluşturur ancak bu ayarı global bir BoardConfig.mk
değişkeni veya modül kapsamlı bir değişkenle geçersiz kılabilirsiniz.
İkinci bir CPU mimarisi ve ABI'yi tanımlama
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 bir örnek oluşturma dosyası için
build/make/target/board/generic_arm64/BoardConfig.mk
.
Çok kitaplıklı bir derlemede, PRODUCT_PACKAGES
içindeki modül adları, derleme sistemi tarafından tanımlandıkları sürece hem 32 bit hem de 64 bit ikili dosyaları kapsar. Bağımlılık tarafından eklenen kitaplıklar için 32 bit veya 64 bit kitaplık
başka bir 32 bit veya 64 bit kitaplık gerekiyorsa veya
yürütülebilir.
Ancak make
komut satırındaki modül adları yalnızca
64 bit sürümü. Örneğin, lunch aosp_arm64-eng
çalıştırdıktan sonra,
make libc
yalnızca 64 bit libc'yi oluşturur. 32 bit libc'yi derlemek için make libc_32
dosyasını çalıştırmanız gerekir.
Android.mk'de modül mimarisini tanımlama
Derlemenizi 32 bit ve 64 bit için yapılandırmak ve global TARGET_PREFER_32_BIT
değişkenini geçersiz kılmak üzere LOCAL_MULTILIB
değişkenini kullanabilirsiniz.
TARGET_PREFER_32_BIT
politikasını geçersiz kılmak için LOCAL_MULTILIB
öğesini
takip etmek için:
both
hem 32 bit hem de 64 bit derlemeler oluşturur.32
yalnızca 32 bit derlemeler oluşturur.64
yalnızca 64 bit oluşturur.first
yalnızca ilk mimari (32 bit cihazlarda 32 bit) için derlemeler ve 64 bit cihazlarda 64 bit) için geçerlidir.
Varsayılan olarak LOCAL_MULTILIB
ayarlanmaz ve derleme sistemi hangisinin
ve diğer mimari özelliklerine göre
LOCAL_MODULE_TARGET_ARCH
gibi LOCAL_*
değişken
ve LOCAL_32_BIT_ONLY
.
Modülünüzü belirli mimariler için derlemek istiyorsanız aşağıdaki değişkenler:
LOCAL_MODULE_TARGET_ARCH
- Bu değişkeni bir mimari listesine ayarlayın. (ör.arm x86 arm64
). Derlenen mimari bu listedeyse derleme sistemi mevcut modülü ekler.LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
- Bu değişkenLOCAL_MODULE_TARGET_ARCH
. Oluşturulan mimari bu listedeysenot
mevcut modül derleme sistemi tarafından dahil edilir.
Bu iki değişkenin küçük varyantları vardır:
LOCAL_MODULE_TARGET_ARCH_WARN
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN
Derleme sistemi, listelenen mimaridir.
Belirli bir mimariye yönelik derleme işaretleri oluşturmak için
Burada, mimariye özgü LOCAL_*
değişkenleri
*
, mimariye özel bir sonektir. Ö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 ilgili mimari için bir ikili oluşturuluyorsa uygulanır.
Bazen, ikili dosyanın 32 bit mi yoksa 64 bit mi oluşturulacağına bağlı olarak işaretleri ayarlamak daha kolaydır. LOCAL_*
kullanın
değişkeni _32
veya _64
son ekine sahip olabilir, ö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 ayarla
Multilib olmayan bir derleme için LOCAL_MODULE_PATH
kullanarak bir kitaplık yükleyebilirsiniz
bir konuma taşımanızı sağlar. Örneğin,
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
Ancak çok kitaplık derlemesinde bunun yerine LOCAL_MODULE_RELATIVE_PATH
kullanın:
LOCAL_MODULE_RELATIVE_PATH := hw
Bu biçimle hem 64 bit hem de 32 bit kitaplıklar doğru konuma.
Hem 32 bit hem de 64 bit olarak yürütülebilir bir dosya derlerseniz aşağıdaki değişkenleri kullanın:
LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64
- Yüklü olanları belirtir dosya adı.LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64
- Yükleme yolunu belirtir.
Kaynak dosyalar için ara dizin elde edin
Çok kitaplıklı bir derlemede, $(local-intermediates-dir)
(veya açık değişkenlerle $(intermediates-dir-for)
) için kaynak dosyaları oluşturursanız bu güvenilir bir şekilde çalışmaz. Bunun nedeni, oluşturulan ara kaynaklar hem 32 bit hem de 64 bit derlemeler tarafından gerekli olması ancak $(local-intermediates-dir)
'ün iki ara dizinden yalnızca birini işaret etmesidir.
Derleme sistemi özel, çoklu kitaplık dostu,
kaynak oluşturmak için ara dizin. Ara bileşeni almak için
dizinin yolunu belirtmek için
$(local-generated-sources-dir)
veya
$(generated-sources-dir-for)
makrosu. Bu makroların kullanımları $(local-intermediates-dir)
ve $(intermediates-dir-for)
'e benzer.
Bu özel dizin için bir kaynak dosya oluşturulup seçilirse
LOCAL_GENERATED_SOURCES
tarafından hem 32 bit hem de 64 bit için
inceleyebilirsiniz.
Önceden oluşturulmuş ikili hedeflerin sistem mimarisini belirtme
Çoklu kitaplık derlemesinde TARGET_ARCH
veya TARGET_ARCH
öğelerini şununla birlikte kullanamazsınız:
Önceden oluşturulmuş sistem mimarisini belirtmek için TARGET_2ND_ARCH
ikili hedefler. Bunun yerine LOCAL_*
değişkenlerini LOCAL_MODULE_TARGET_ARCH
veya LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
kullanın.
Bu değişkenlerle derleme sistemi, 20 bite karşılık gelen 32 bit olsa bile önceden oluşturulmuş bir ikili program kullanır.
Önceden derlenmiş ikili programın kaynak yolunu hesaplamak için seçilen mimariyi kullanmak istiyorsanız $(get-prebuilt-src-arch)
işlevini çağırın.
32 bit ve 64 bit ODEX dosyası oluşturun
Google, 64 bit cihazlar için varsayılan olarak önyükleme resmi ve tüm Java kitaplıkları için hem 32 bit hem de 64 bit ODEX dosyaları oluşturur. Google, APK'ler için 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ıyorsa hem 32 bit hem de 64 bit ODEX dosyalarının oluşturulduğundan emin olmak için LOCAL_MULTILIB := both
seçeneğini kullanın. Uygulamada 32 bit veya 64 bit JNI kitaplıkları varsa bu işaret, derleme sistemine bunları da dahil etmesini söyler.