32 bit ve 64 bit mimariler için derleme

Derleme sistemi, aynı derlemede iki hedef CPU mimarisi (32 bit ve 64 bit) için ikili dosyalar oluşturmayı destekler. Bu iki hedefli derleme, multilib derleme olarak bilinir.

Derleme sistemi, yerleşik statik kitaplıklar ve paylaşılan kitaplıklar için her iki mimari için de ikili dosyalar oluşturma kuralları belirler. Ürün yapılandırması (PRODUCT_PACKAGES), bağımlılık grafiğiyle birlikte hangi ikili dosyaların oluşturulup sistem görüntüsüne 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 BoardConfig.mk değişkeni veya modül kapsamlı değişkenle geçersiz kılabilirsiniz.

İkinci bir CPU mimarisi ve ABI tanımlama

BoardConfig.mk, ikinci CPU mimarisini ve uygulama ikili arabirimini (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 makefile örneği için build/make/target/board/generic_arm64/BoardConfig.mk bölümüne bakın.

Çoklu kitaplık 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ını kapsar. Bağımlılık yoluyla dahil edilen kitaplıklar için 32 bit veya 64 bit kitaplıklar yalnızca başka bir 32 bit veya 64 bit kitaplık ya da yürütülebilir dosya tarafından gerekiyorsa 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 komutunu ç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 genel 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 biri olarak ayarlayın:

  • both hem 32 bit hem de 64 bit sürümlerini oluşturur.
  • 32 yalnızca 32 bitlik derlemelerdir.
  • 64 yalnızca 64 bit derlemeler.
  • 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 diğer LOCAL_* değişkenlerine (ör. LOCAL_MODULE_TARGET_ARCH ve LOCAL_32_BIT_ONLY) göre hangi mimarinin derleneceğine 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şkeni, arm x86 arm64 gibi bir mimari listesi olarak ayarlayın. Oluşturulan mimari bu listede yer alıyorsa mevcut modül, derleme sistemine dahil edilir.

  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH: Bu değişken, LOCAL_MODULE_TARGET_ARCH değişkeninin tersidir. Oluşturulan mimari not bu listede yer alıyorsa 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

Derleme sistemi, listelenen mimariler nedeniyle mevcut modülün atlanması durumunda uyarı verir.

Belirli bir mimari için derleme işaretleri ayarlamak üzere mimariye özel LOCAL_* değişkenlerini kullanın. Burada *, 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 söz konusu mimari için bir ikili oluşturuluyorsa uygulanır.

Bazen, ikilinin 32 bit mi yoksa 64 bit için mi oluşturulduğuna bağlı olarak işaretleri 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 ayarlama

Çoklu kitaplık içermeyen bir derleme için, kitaplığı varsayılan konum dışında bir konuma yüklemek üzere LOCAL_MODULE_PATH kullanabilirsiniz. Örneğin, LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw.

Ancak çoklu kitaplık derlemesinde bunun yerine LOCAL_MODULE_RELATIVE_PATH kullanın:

LOCAL_MODULE_RELATIVE_PATH := hw

Bu biçimde hem 64 bit hem de 32 bit kitaplıklar doğru konuma yüklenir.

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

Kaynak dosyalar için ara dizini edinme

Çoklu kitaplık derlemesinde, $(local-intermediates-dir) (veya $(intermediates-dir-for) ile açık değişkenler) için kaynak dosyalar oluşturursanız bu işlem güvenilir şekilde çalışmaz. Bunun nedeni, oluşturulan ara kaynakların hem 32 bit hem de 64 bit derlemeler için gerekli olması ancak $(local-intermediates-dir) işaretinin iki ara dizinden yalnızca birini göstermesidir.

Derleme sistemi, kaynak oluşturmak için özel, çok kitaplıklı uyumlu 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ımı, $(local-intermediates-dir) ve $(intermediates-dir-for) ile benzerdir.

Bu özel dizinde bir kaynak dosya oluşturulup LOCAL_GENERATED_SOURCES tarafından alınırsa çoklu kitaplık derlemesinde hem 32 bit hem de 64 bit için oluşturulur.

Önceden oluşturulmuş ikili hedeflerin sistem mimarisini belirtin

Çoklu kitaplık derlemesinde, ö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şkenler sayesinde, derleme sistemi 64 bit çoklu kitaplık derlemesi üzerinde çalışsa bile ilgili 32 bit önceden derlenmiş ikili dosyayı seçebilir.

Önceden oluşturulmuş 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şturma

64 bit cihazlarda Google, varsayılan olarak hem 32 bit hem de 64 bit ODEX dosyalarını önyükleme resmi ve tüm Java kitaplıkları için oluşturur. Google, APK'lar 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 süreçlerde 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 kullanın. Uygulamada 32 bit veya 64 bit JNI kitaplıkları varsa bu işaret, derleme sistemine bunları da dahil etmesini söyler.