32 bit ve 64 bit mimariler için geliştirme

Derleme sistemi, aynı derlemede 32 bit ve 64 bit olmak üzere iki hedef CPU mimarisi için ikili dosyalar oluşturmayı destekler. 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 programlar derlemek üzere kurallar oluşturur. Ürün yapılandırması (PRODUCT_PACKAGES), bağımlılık grafiğiyle birlikte hangi ikili dosyaların derlenip sistem görüntüsüne yükleneceğini belirler.

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 mimarisini 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 örnek bir makefile için build/make/target/board/generic_arm64/BoardConfig.mk bölümüne bakın.

Ç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ığı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 kitaplık tarafından gerekli kılındığında 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 çalıştırıldı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 dosyasında 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 değerini geçersiz kılmak için LOCAL_MULTILIB değerini aşağıdakilerden birine ayarlayın:

  • both hem 32 bit hem de 64 bit derlemeler oluşturur.
  • 32 yalnızca 32 bit derlemeler oluşturur.
  • 64 yalnızca 64 bit derlemeler oluşturur.
  • first yalnızca ilk mimari için derlenir (32 bit cihazlarda 32 bit, 64 bit cihazlarda 64 bit).

Varsayılan olarak LOCAL_MULTILIB ayarlanmaz ve derleme sistemi, modül sınıfına ve LOCAL_MODULE_TARGET_ARCH ile LOCAL_32_BIT_ONLY gibi diğer LOCAL_* değişkenlerine göre hangi mimarinin oluşturulacağına karar verir.

Modülünüzü belirli mimariler için derlemek istiyorsanız aşağıdaki değişkenleri kullanın:

  • LOCAL_MODULE_TARGET_ARCH: Bu değişkeni arm x86 arm64 gibi bir mimari listesine ayarlayın. Derlenen mimari bu listedeyse derleme sistemi mevcut modülü ekler.

  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH - Bu değişken, LOCAL_MODULE_TARGET_ARCH işlevinin tersidir. Oluşturulan mimari bu listede not varsa geçerli 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 mimariler nedeniyle mevcut modülün atlanması durumunda uyarı verir.

Belirli bir mimariye yönelik derleme işaretleri oluşturmak için mimariye özgü LOCAL_* değişkenlerini kullanın. Burada * mimariye özgü 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 söz konusu mimari için bir ikili program derleniyorsa 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_* 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,
sayfasını inceleyin.

Kitaplık yükleme yolunu ayarlama

Multilib olmayan bir derleme için bir kitaplığı varsayılan konumdan başka bir konuma yüklemek üzere LOCAL_MODULE_PATH kullanabilirsiniz. Ö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 yüklenir.

Hem 32 bit hem de 64 bit olarak yürütülebilir bir dosya derlerseniz 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üklenen dosya adını belirtir.
  • LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64: Yükleme yolunu belirtir.

Kaynak dosyalar için ara dizin elde edin

Çoklu kitaplık içeren bir derlemede, $(local-intermediates-dir) için kaynak dosyalar (veya açık değişkenlerle $(intermediates-dir-for)) oluşturursanız bu dosyalar güvenilir bir şekilde çalışmaz. Bunun nedeni, oluşturulan ara kaynakların hem 32 bit hem de 64 bit derlemeler tarafından gerekli olması ancak $(local-intermediates-dir)'ün iki ara dizinden yalnızca birine işaret etmesidir.

Derleme sistemi, kaynak oluşturmak için özel, çok kitaplık uyumlu bir ara dizin sağlar. Ara dizin yolunu almak için $(local-generated-sources-dir) veya $(generated-sources-dir-for) makrosunu kullanın. Bu makroların kullanım alanları $(local-intermediates-dir) ve $(intermediates-dir-for) ile benzerdir.

Bu özel dizine oluşturulan ve LOCAL_GENERATED_SOURCES tarafından alınan bir kaynak dosya, çok kitaplıklı bir derlemede hem 32 bit hem de 64 bit için derlenir.

Önceden oluşturulmuş ikili hedeflerin sistem mimarisini belirtme

Çok kitaplıklı derlemede, önceden derlenmiş ikili hedeflerin sistem mimarisini belirtmek için TARGET_ARCH veya TARGET_ARCH ile birlikte TARGET_2ND_ARCH kullanamazsınız. Bunun yerine LOCAL_* değişkenlerini LOCAL_MODULE_TARGET_ARCH veya LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH kullanın.

Derleme sistemi, bu değişkenlerle 64 bit çok kitaplıklı derleme üzerinde çalışıyor olsa bile ilgili 32 bit önceden derlenmiş ikili dosyayı seçebilir.

Ö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 cihazlarda varsayılan olarak başlatma görüntüsü ve 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ıldıysa 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 32 bit veya 64 bit JNI kitaplıkları varsa bu işaret, derleme sistemine bunları dahil etmesini de bildirir.