32 bit ve 64 bit mimariler için geliştirin,32 bit ve 64 bit mimariler için geliştirin

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şkeni arm 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şken LOCAL_MODULE_TARGET_ARCH tersidir. İnşa edilmekte olan mimari bu listede not 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.