64-bit Yapıları Anlama

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 ve LOCAL_MODULE_TARGET_ARCH ve LOCAL_32_BIT_ONLY gibi diğer LOCAL_ 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şkeni arm 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şken LOCAL_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.