Yapı sistemi, aynı yapı içinde iki hedef CPU mimarisi (64 bit ve 32 bit) için ikili dosyalar oluşturmayı destekler. Bu, multilib derlemesi olarak bilinir.
Yerel statik kitaplıklar ve paylaşılan kitaplıklar için derleme sistemi, her iki mimari için ikili dosyalar oluşturmak üzere kurallar oluşturur. Ürün yapılandırması ( PRODUCT_PACKAGES
), bağımlılık grafiğiyle birlikte, sistem görüntüsüne hangi ikili dosyaların oluşturulacağını ve yükleneceğ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ı global bir BoardConfig.mk
değişkeni veya modül kapsamlı bir değişkenle geçersiz kılabilirsiniz.
Ürün yapılandırması
BoardConfig.mk
, ikinci CPU mimarisini ve ABI'yi 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
build/target/board/generic_arm64/BoardConfig.mk
içinde bir örnek görebilirsiniz.
Bir multilib derlemesinde, 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ığa göre alınan kitaplıklar için, 32 bit kitaplık yalnızca başka bir 32 bit kitaplık veya yürütülebilir dosya için gerekliyse yüklenir. Aynı şey 64 bit kitaplıklar için de geçerlidir.
Ancak, make
komut satırındaki modül adları yalnızca 64 bit sürümü kapsar. Örneğin, lunch aosp_arm64-eng
çalıştırdıktan sonra, make libc
yalnızca 64-bit libc'yi oluşturmasını sağlayın. 32 bit libc'yi oluşturmak için make libc_32
çalıştırmanız gerekir.
Android.mk'de modül tanımı
LOCAL_MULTILIB
32 bit/64 bit için yapılandırmak ve global TARGET_PREFER_32_BIT
değişkenini geçersiz kılmak için LOCAL_MULTILIB değişkenini kullanabilirsiniz.
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 derlenir (32 bit aygıtlarda 32 bit ve 64 bit aygıtlarda 64 bit). -
""
varsayılandır. Yapı sistemi, modül sınıfına veLOCAL_MODULE_TARGET_ARCH
veLOCAL_32_BIT_ONLY
gibi diğerLOCAL_
değişkenlerine dayanarak hangi mimarinin oluşturulacağına karar verir.
Modülünüzü belirli mimariler için oluşturmak istiyorsanız, aşağıdaki değişkenleri kullanın:
-
LOCAL_MODULE_TARGET_ARCH
Bu değişkeniarm x86 arm64
gibi bir mimariler listesine ayarlayın. Oluşturulan mimari bu listedeyse, mevcut modül yapı sistemine dahil edilir. -
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
Bu değişkenLOCAL_MODULE_TARGET_ARCH
değişkeninin tersidir. Oluşturulan mimari bu listede yoksa , mevcut modül yapı 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 atlanırsa uyarır.
Belirli bir mimari için yapı bayrakları ayarlamak için mimariye özgü LOCAL_
değişkenlerini kullanın. Mimariye özgü bir LOCAL_
değişkeni, mimari son eki olan normal bir LOCAL_
değişkenidir, ö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 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
son ekiyle kullanın, örneğin:
-
LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,
-
LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,
-
LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,
Yol yükleme
Önceden, varsayılan konum dışında bir konuma kitaplık yüklemek için LOCAL_MODULE_PATH
kullanabiliyordunuz. Örneğin, LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
.
Bir multilib derlemesinde bunun yerine LOCAL_MODULE_RELATIVE_PATH
kullanın:
LOCAL_MODULE_RELATIVE_PATH := hw
Bu format ile hem 64-bit hem de 32-bit kitaplıklar doğru yere kurulur.
Hem 32 bit hem de 64 bit olarak bir yürütülebilir 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
Yüklü dosya adını belirtir. -
LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64
Yükleme yolunu belirtir.
Oluşturulan kaynaklar
Bir multilib derlemesinde, kaynak dosyaları $(local-intermediates-dir)
(veya $(intermediates-dir-for)
için açık değişkenlerle oluşturursanız), güvenilir şekilde çalışmaz. Bunun nedeni, ara oluşturulan kaynakların hem 32 bit hem de 64 bit yapılar için gerekli olması, ancak $(local-intermediates-dir)
yalnızca iki ara dizinden birine işaret etmesidir.
Derleme sistemi, kaynak üretmek için ayrılmış, çoklu kütüphane dostu, ara bir dizin sağlar. Dizinin yolunu almak için $(local-generated-sources-dir)
veya $(generated-sources-dir-for)
arayabilirsiniz. Kullanımları $(local-intermediates-dir)
ve $(intermediates-dir-for)
ile benzerdir.
Bu özel dizine bir kaynak dosya oluşturulur ve LOCAL_GENERATED_SOURCES
tarafından alınırsa, bir multilib yapısında hem 32 bit hem de 64 bit için oluşturulur.
önceden oluşturulmuş
Bir multilib derlemesinde, yapı sistemine önceden oluşturulmuş ikili sistemin hangi mimariyi hedeflediğini söylemek için TARGET_ARCH
(veya TARGET_2ND_ARCH
ile birlikte) kullanamazsınız. Bunun yerine, LOCAL_MODULE_TARGET_ARCH
veya LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
LOCAL_
değişkenlerini kullanın.
Bu değişkenlerle, yapı sistemi 64-bit multilib yapı üzerinde çalışıyor olsa bile karşılık gelen 32-bit ö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.
ODEX dosya oluşturma
64 bit aygıtlar için, önyükleme görüntüsü ve herhangi bir Java kitaplığı için varsayılan olarak hem 32 bit hem de 64 bit ODEX dosyaları oluştururuz. APK'lar için varsayılan olarak yalnızca birincil 64 bit mimari için ODEX oluştururuz. Bir uygulama hem 32 bit hem de 64 bit işlemlerde başlatılacaksa, hem 32 bit hem de 64 bit ODEX dosyalarının oluşturulduğundan emin olmak için LOCAL_MULTILIB := both
kullanın. Uygulamada herhangi bir 32-bit veya 64-bit JNI kitaplığı varsa, bu bayrak ayrıca derleme sistemine bunları dahil etmesini söyler.