Android.mk

Bu sayfada,Android.mk ndk-build.

Genel Bakış

Android.mk dosyası, projenizin jni/ dizininin bir alt dizininde yer alır dizinini oluşturur ve kaynaklarınızı ve paylaşılan kitaplıklarınızı derleme sistemine açıklar. Bu, derleme sisteminin bir veya daha fazla kez ayrıştırdığı küçük bir GNU makefile parçasıdır. Android.mk dosyası, Application.mk, derleme sistemi ve ortam değişkenlerinizin tanımlı bırakmadığı proje genelindeki ayarları tanımlamak için kullanışlıdır. Ayrıca, belirli modüller için proje genelindeki ayarları da geçersiz kılabilir.

Android.mk söz dizimi, kaynaklarınızı modüller halinde gruplandırmanıza olanak tanır. Modüller statik bir kitaplık, paylaşılan kitaplık veya bağımsız yürütülebilir. Her Android.mk dosyasında bir veya daha fazla modül tanımlayabilirsiniz. Aynı kaynak dosyayı birden fazla modülde kullanabilirsiniz. Derleme sistemi, paylaşılan kitaplıkları yalnızca uygulama paketinize yerleştirir. Ayrıca statik kitaplıklar, paylaşılan kitaplıklar oluşturabilir.

Derleme sistemi, paketleme kitaplıklarına ek olarak bazı ipuçları vereceğim. Örneğin, Android.mk dosyanızda başlık dosyalarını veya oluşturulan dosyalar arasındaki açık bağımlılıkları listelemeniz gerekmez. NDK yapısı sistem bu ilişkileri sizin için otomatik olarak hesaplar. Bu sayede, Android.mk dosyanıza dokunmak zorunda kalmadan gelecekteki NDK sürümlerinde yeni araç zinciri/platform desteğinden yararlanabilirsiniz.

Bu dosyanın söz dizimi, Android Open Source Project'in tamamıyla dağıtılan Android.mk dosyalarında kullanılana çok yakındır. Derleme sistemi bunları kullanan uygulamanın farklı olması, benzerliklerin kasıtlı uygulama geliştiricilerinin, uygulama geliştirmelerini kolaylaştırmak amacıyla kaynak kodundan yararlanabilirsiniz.

Temel Bilgiler

Söz dizimini ayrıntılı olarak incelemeden önce, Android.mk dosyasının temel özelliklerini anlayarak başlamak faydalı olacaktır. Bu bölümde, Hello-JNI örneğindeki Android.mk dosyası kullanılarak dosyanın her satırının işlevi açıklanmaktadır.

Android.mk dosyası, LOCAL_PATH değişkenini tanımlayarak başlamalıdır:

LOCAL_PATH := $(call my-dir)

Bu değişken, kaynak dosyaların geliştirme ağacındaki konumunu gösterir. Burada, derleme sistemi tarafından sağlanan my-dir makro işlevi, geçerli dizinin yolunu (Android.mk dosyasını içeren dizin) döndürür.

Bir sonraki satırda, derleme sistemi değeri olan CLEAR_VARS değişkeni belirtilir sağlar.

include $(CLEAR_VARS)

CLEAR_VARS değişkeni, birçok öğeyi temizleyen özel bir GNU Makefile'a işaret ediyor Sizin için LOCAL_XXX gibi LOCAL_MODULE, LOCAL_SRC_FILES ve LOCAL_STATIC_LIBRARIES. Bu işlem LOCAL_PATH değerini temizlemez. Bu sistem tüm derleme kontrolü dosyalarını ayrıştırdığı için değişkenin değerini korumalıdır tek bir GNU Tüm değişkenlerin global olduğu yürütme bağlamı sunar. Şunu yapmalısınız: her modülü açıklamadan önce bu değişkeni (yeniden) tanımlayın.

Daha sonra, LOCAL_MODULE değişkeni eklemek istediğiniz modülün adını seçeceğiz. Bu değişkeni uygulamanızdaki her modül için bir kez kullanın.

LOCAL_MODULE := hello-jni

Her modül adı benzersiz olmalı ve boşluk içermemelidir. Derleme sistemi, nihai paylaşılan kitaplık dosyasını oluştururken LOCAL_MODULE'ye atadığınız ada otomatik olarak uygun ön ek ve son ek ekler. Örneğin, yukarıda görünen örnek, libhello-jni.so

Sonraki satır, kaynak dosyaları numaralandırır ve birden çok değeri boşluklarla sınırlandırır. dosyalar:

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES değişkeni, C ve/veya C++ kaynak dosyalarının listesini içermelidir bir yöntem de vardır.

Son satır, sistemin her şeyi birbirine bağlamasına yardımcı olur:

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY değişkeni, aynı türde bir GNU Makefile komut dosyasına en fazla dönüşüm elde ettikten sonra, LOCAL_XXX değişkende tanımladığınız tüm bilgileri son include. Bu komut dosyası, nelerin oluşturulacağını ve nasıl yapılacağını belirler.

Örnek dizinlerinde, açıklama eklenmiş daha karmaşık örnekler vardır. Bakabileceğiniz Android.mk dosya var. Ayrıca, Örnek: yerel etkinlik , söz konusu örneğin Android.mk dosyasıyla ilgili ayrıntılı bir açıklama sunar. Son olarak, Değişkenler ve makrolar bölümünde bu bölümdeki değişkenler hakkında daha fazla bilgi verilmektedir.

Değişkenler ve makrolar

Derleme sistemi, Android.mk dosyasında kullanılabilecek birçok olası değişken sağlar. Bu değişkenlerin çoğu önceden atanmış değerlerle gelir. Diğerlerini siz atarsınız.

Bu değişkenlere ek olarak kendi rastgele değişkenlerinizi de tanımlayabilirsiniz. Bu durumda, NDK derleme sisteminin aşağıdaki değişken adlarını ayırdığını unutmayın:

  • LOCAL_ ile başlayan adlar (ör. LOCAL_MODULE).
  • PRIVATE_, NDK_ veya APP ile başlayan adlar. Derleme sistemi içgüdülerini güçlendiriyor.
  • Küçük harfli adlar (ör. my-dir). Derleme sistemi, bunu dahili olarak olur.

Bir Android.mk dosyasında kendi kolaylık değişkenlerinizi tanımlamanız gerekirse, adlarının başına MY_ eklemelerini öner.

NDK tarafından tanımlanan içerme değişkenleri

Bu bölümde, derleme sisteminin tanımladığı GNU Yapma değişkenleri ele alınmaktadır Android.mk dosyanızı ayrıştırmadan önce. Belirli durumlarda NDK, her seferinde bu değişkenlerin bazıları için farklı bir tanım kullanarak Android.mk dosyanızı birkaç kez ayrıştırabilir.

TEMİZLE_VARS

Bu değişken, neredeyse tüm LOCAL_XXX tanımını kaldıran bir derleme komut dosyasına işaret ediyor "Geliştirici tanımlı değişkenler"de listelenen değişkenler bölümüne bakın. Yeni bir modülü açıklamadan önce bu komut dosyasını dahil etmek için bu değişkeni kullanın. Kullanım söz dizimi:

include $(CLEAR_VARS)

BUILD_EXECUTABLE

Bu değişken, Google Analytics 4 ile ilgili tüm bilgileri toplayan bir derleme LOCAL_XXX değişkenlerinizde sağladığınız modülü ve listelediğiniz kaynaklardan yürütülebilir bir hedef dosya derleyin. Bu komut dosyasını kullanabilmek için en azından LOCAL_MODULE ve LOCAL_SRC_FILES değişkenlerine değer atamış olmanız gerektiğini unutmayın (bu değişkenler hakkında daha fazla bilgi için Modül açıklaması değişkenleri bölümüne bakın).

Bu değişkenin kullanımıyla ilgili söz dizimi:

include $(BUILD_EXECUTABLE)

PAYLAŞILAN_KİTAPLIK

Bu değişken, Google Analytics 4 ile ilgili tüm bilgileri toplayan bir derleme LOCAL_XXX değişkenlerinizde sağladığınız modülü ve listelediğiniz kaynaklardan paylaşılan bir hedef kitaplık oluşturun. Bu komut dosyasını kullanabilmek için en azından LOCAL_MODULE ve LOCAL_SRC_FILES değişkenlerine değer atamış olmanız gerektiğini unutmayın (bu değişkenler hakkında daha fazla bilgi için Modül açıklaması değişkenleri bölümüne bakın).

Bu değişkenin kullanımıyla ilgili söz dizimi:

include $(BUILD_SHARED_LIBRARY)

Paylaşılan kitaplık değişkeni, derleme sisteminin .so uzantılı bir kitaplık dosyası oluşturmasına neden olur.

BUILD_STATIC_KİTAPLIĞI

Statik kitaplık oluşturmak için kullanılan BUILD_SHARED_LIBRARY varyantı. İlgili içeriği oluşturmak için kullanılan derleme sistemi, statik kitaplıkları projenize/paketlerinize kopyalamaz ancak bunları paylaşılan kitaplıklar oluşturmak için kullanabilir (bkz. LOCAL_STATIC_LIBRARIES ve LOCAL_WHOLE_STATIC_LIBRARIES). Bu değişkeni kullanmak için söz dizimi şöyledir:

include $(BUILD_STATIC_LIBRARY)

Statik kitaplık değişkeni, derleme sisteminin .a uzantılı bir kitaplık oluşturmasına neden olur.

PREBUILT_SHARED_LIBRARY

Önceden oluşturulmuş bir paylaşılan kitaplığı belirtmek için kullanılan bir derleme komut dosyasını gösterir. Beğenmekten vazgeç BUILD_SHARED_LIBRARY ve BUILD_STATIC_LIBRARY için geçerlidir. Burada LOCAL_SRC_FILES kaynak dosya olamaz. Bunun yerine, değer teslim etmek için foo/libfoo.so gibi önceden oluşturulmuş paylaşılan bir kitaplık. Bu değişkenin söz dizimi şu şekildedir:

include $(PREBUILT_SHARED_LIBRARY)

Ayrıca LOCAL_PREBUILTS değişkeni Önceden oluşturulmuş öğeleri kullanma hakkında daha fazla bilgi için Önceden oluşturulmuş kitaplıkları kullanın.

PREBUILT_STATIC_KİTAPLIĞI

PREBUILT_SHARED_LIBRARY ile aynıdır ancak önceden oluşturulmuş statik kitaplıklar için kullanılır. Önceden oluşturulmuş kitaplıkları kullanma hakkında daha fazla bilgi için Önceden oluşturulmuş kitaplıkları kullanma başlıklı makaleyi inceleyin.

Hedef bilgi değişkenleri

Derleme sistemi, genellikle Application.mk dosyanızda tanımlanan APP_ABI değişkeni tarafından belirtilen her ABI için Android.mk dosyasını bir kez ayrıştırır. APP_ABI all ise derleme sistemi, NDK'nın desteklediği her ABI için Android.mk dosyasını bir kez ayrıştırır. Bu bölümde, derleme sisteminin her Android.mk ayrıştırır.

TARGET_ARCH

Derleme sisteminin bu Android.mk dosyasını ayrıştırırken hedeflediği CPU ailesidir. Bu değişken şunlardan biri olacaktır: arm, arm64, x86 veya x86_64.

HEDEF_PLATFORM

Bunu ayrıştırırken derleme sisteminin hedeflediği Android API düzeyi numarası Android.mk dosyası oluşturun. Örneğin, Android 5.1 sistem resimleri Android API düzeyi 22'ye karşılık gelir: android-22. Platform adlarının tam listesi ve ilgili Android sistem görüntüleri için Yerel API'ler bölümüne bakın. İlgili içeriği oluşturmak için kullanılan aşağıdaki örnekte bu değişkeni kullanmak için gereken söz dizimi gösterilmektedir:

ifeq ($(TARGET_PLATFORM),android-22)
    # ... do something ...
endif

HEDEF_ARCH_ABI

Bu Android.mk dosyasını ayrıştırırken derleme sisteminin hedeflediği ABI. Tablo 1'de, desteklenen her CPU ve mimari için kullanılan ABI ayarı gösterilmektedir.

Tablo 1. Farklı CPU'lar ve mimariler için ABI ayarları.

CPU ve mimari Ayar
RM7 armeabi-v7a
ARMv8 AArch64 arm64-v8a
i686 x86
x86-64 x86_64

Aşağıdaki örnekte, hedef CPU ve ABI kombinasyonu olarak ARMv8 AArch64'ün nasıl kontrol edileceği gösterilmektedir:

ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
  # ... do something ...
endif

Mimari ABI'ler ve ilgili uyumluluk sorunları hakkında daha fazla bilgi için Android ABI'lerine bakın.

Gelecekteki yeni hedef ABI'ler farklı değerlere sahip olacak.

HEDEF_ABI

Hedef Android API düzeyi ile ABI'nin birleşimi. Bu, özellikle de belirli bir hedef sistem görüntüsüne göre test etmek istediğinizde Örneğin, Android API düzeyi 22'yi çalıştıran 64 bit ARM cihaz olup olmadığını kontrol etmek için:

ifeq ($(TARGET_ABI),android-22-arm64-v8a)
  # ... do something ...
endif

Modül açıklaması değişkenleri

Bu bölümdeki değişkenler, derleme sistemine modülünüzü tanımlar. Her biri modülün açıklaması şu temel akışı izlemelidir:

  1. CLEAR_VARS değişkeni
  2. Modülü tanımlamak için kullanılan değişkenlere değerler atayın.
  3. NDK derleme sistemini, modül için uygun derleme komut dosyasını kullanacak şekilde ayarlayın, BUILD_XXX değişkeni kullanılır.

YEREL_YOL

Bu değişken, geçerli dosyanın yolunu vermek için kullanılır. Tanımlayın Android.mk dosyanızın başına ekleyin. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:

LOCAL_PATH := $(call my-dir)

CLEAR_VARS tarafından işaret edilen komut dosyası, bu değişkeni temizlemez. Bu nedenle, Android.mk dosyanız birden fazla modülü tanımlasa bile bu modülü yalnızca bir kez tanımlamanız gerekir.

LOCAL_MODULE

Bu değişken, modülünüzün adını depolar. Tüm modül adları arasında benzersiz olmalı ve boşluk içermemelidir. Herhangi bir komut dosyaları (CLEAR_VARS için olandan farklı). lib öneki veya .so ya da .a dosya uzantısı; derleme sistemi bunları pek çok yolu vardır. Android.mk ve Application.mk dosyalarınızda modülünüze değiştirilmemiş adıyla atıfta bulunun. Örneğin, aşağıdaki satır libfoo.so adlı bir paylaşılan kitaplık modülü oluşturulmasına neden olur:

LOCAL_MODULE := "foo"

Oluşturulan modülün lib + LOCAL_MODULE değerinden farklı bir ada sahip olmasını istiyorsanız oluşturulan modüle kendi seçtiğiniz bir ad vermek için LOCAL_MODULE_FILENAME değişkenini kullanabilirsiniz.

LOCAL_MODULE_FILENAME

Bu isteğe bağlı değişken, derleme sistemi tarafından verilen adları geçersiz kılmanıza varsayılan olarak kullanır. Örneğin, LOCAL_MODULE foo. Sistemi, oluşturduğu dosyayı çağırmaya zorlayabilirsiniz libnewfoo. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:

LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo

Bu örnek, paylaşılan kitaplık modülü için libnewfoo.so adlı bir dosya oluşturur.

LOCAL_SRC_FILES

Bu değişken, derleme sisteminin modülü oluşturmak için kullandığı kaynak dosyaların listesini içerir. Yalnızca derleme sisteminin gerçekten aktardığı dosyaları listeleyin tarafından otomatik olarak hesaplandığından, derleyici için ve bildirmeyi konuştuk. Hem göreli (LOCAL_PATH ile ilişkili) hem de mutlak dosya yolları kullanabileceğinizi unutmayın.

Mutlak dosya yollarını kullanmaktan kaçının. Göreli yollar, Android.mk dosyanızın taşınabilirliğini artırır.

YEREL_PBM_UZANTIsı

İsteğe bağlı bu değişkeni C++ kaynak dosyalarınız için .cpp. Örneğin, aşağıdaki satırda uzantı .cxx olarak değiştirilmiştir. (Ayar, noktayı içermelidir.)

LOCAL_CPP_EXTENSION := .cxx

Birden çok uzantı belirtmek için bu değişkeni kullanabilirsiniz. Örneğin:

LOCAL_CPP_EXTENSION := .cxx .cpp .cc

YEREL_ABM_ÖZELLİKLERİ

Kodunuzun belirli bir koda dayalı olduğunu belirtmek için bu isteğe bağlı değişkeni C++ özellikleri hakkında daha fazla bilgi edinin. Derleme sırasında doğru derleyici ve bağlayıcı işaretlerini etkinleştirir bahsedeceğim. Önceden derlenmiş ikili programlar için bu değişken, ikili programın hangi özelliklere bağlı olduğunu da belirtir. Böylece nihai bağlantının doğru şekilde çalıştığından emin olabilirsiniz. -frtti ve -fexceptions'yi doğrudan LOCAL_CPPFLAGS tanımınızda etkinleştirmek yerine bu değişkeni kullanmanızı öneririz.

Bu değişkenin kullanılması, derleme sisteminin her modül için uygun işaretleri kullanmasına olanak tanır. LOCAL_CPPFLAGS kullanıldığında derleyici, gerçek ihtiyaçtan bağımsız olarak tüm modüller için belirtilen tüm işaretleri kullanır.

Örneğin, kodunuzun RTTI (Çalışma Zamanı Türü Bilgisi) kullandığını belirtmek için yaz:

LOCAL_CPP_FEATURES := rtti

Kodunuzun C++ istisnalarını kullandığını belirtmek için şunu yazın:

LOCAL_CPP_FEATURES := exceptions

Bu değişken için birden fazla değer de belirtebilirsiniz. Örnek:

LOCAL_CPP_FEATURES := rtti features

Değerleri açıklama sırası önemli değildir.

LOCAL_C_INCLUDES

Bu isteğe bağlı değişkeni, tüm kaynakları (C, C++ ve Assembly) derleirken dahil edilecek arama yoluna eklemek için NDK root dizine göre bir yol listesi belirtmek üzere kullanabilirsiniz. Örnek:

LOCAL_C_INCLUDES := sources/foo

Hatta:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo

LOCAL_CFLAGS veya LOCAL_CPPFLAGS aracılığıyla ilgili dahil etme işaretlerini ayarlamadan önce bu değişkeni tanımlayın.

Derleme sistemi, ndk-gdb ile yerel hata ayıklama işlemini başlatırken de LOCAL_C_INCLUDES yollarını otomatik olarak kullanır.

LOCAL_ASFLAGS

.s veya .S dosyaları derlenirken Clang'a iletilecek işaretler.

YEREL_ASMFLAGS

.asm dosyaları oluşturulurken yasm'a aktarılacak işaretler.

LOCAL_CFLAGS

C, C++ ve bazı uygulamalar oluştururken Clang'a geçirilecek işaretler derleme (.s ve .S; ancak .asm değil) kaynak dosyaları. Bu sayede, ek makro tanımları veya derleme seçenekleri belirtmek için yararlı olabilir. Tekliflerinizi otomatikleştirmek ve optimize etmek için Yalnızca C++ için işaretleri belirtmek üzere LOCAL_CPPFLAGS. Şunlar için LOCAL_CONLYFLAGS kullanın: yalnızca C için işaretleri belirtin.

Android.mk dosyanızdaki optimizasyon/hata ayıklama düzeyini değiştirmemeye çalışın. Derleme sistemi Application.mk dosyasındaki alakalı bilgiler bulunmalıdır. Bu şekilde yapmak, derleme sisteminin hata ayıklama sırasında kullanılan yararlı veri dosyaları oluşturmasına olanak tanır.

Aşağıdakileri yazarak ek dahil etme yolları belirtebilirsiniz:

LOCAL_CFLAGS += -I<path>,

Ancak bu amaçla LOCAL_C_INCLUDES kullanmak daha iyidir. Böylece, ndk-gdb ile yerel hata ayıklama için kullanılabilen yolları da kullanabilirsiniz.

YEREL_KONLYFLAGS

C kaynaklarını derlediğinde Clang'a iletilecek işaretler. LOCAL_CFLAGS'ün aksine LOCAL_CONLYFLAGS, C++ veya derleme kaynakları derlenirken Clang'a iletilmez.

LOCAL_CPPFLAGS

Yalnızca C++ kaynak dosyaları derlenirken iletilecek isteğe bağlı bir derleyici işaretleri grubu. Bunlar, derleyicinin komut satırında LOCAL_CFLAGS'den sonra görünür. Hem C hem de C++ için işaretleri belirtmek üzere LOCAL_CFLAGS kullanın.

YEREL_STATIC_KİTAPLIKLAR

Bu değişken, geçerli değişiklik gösterir.

Geçerli modül paylaşılan bir kitaplık veya yürütülebilir bir modülse bu değişken bu kitaplıkları elde edilen ikili değere bağlanmaya zorlar.

Geçerli modül statik bir kitaplıksa bu değişken mevcut modüllere bağlı olan diğer modüller de listelenen kitaplıklar.

LOCAL_SHARED_LIBRARIES

Bu değişken, bu modülün üzerinde yer aldığı paylaşılan kitaplıkların modüllerinin listesidir. çalışma zamanına bağlıdır. Bu bilgi, bağlantı anında ve ilgili bilgileri içeren bir dosyayı Google'a ekleyin.

YEREL_WHOLE_STATIC_KİTAPLIKLAR

Bu değişken, LOCAL_STATIC_LIBRARIES değişkeninin bir varyantıdır ve bağlayıcının ilişkili kitaplık modüllerini bütün arşivler olarak ele alması gerektiğini ifade eder. Arşivlerin tamamı hakkında daha fazla bilgi için --whole-archive işaretçisi ile ilgili GNU ld belgelerine bakın.

Bu değişken, birkaç kullanıcı arasında döngüsel bağımlılıklar olduğunda işe yarar. olması gerekir. Paylaşılan bir kitaplık oluşturmak için bu değişkeni kullandığınızda derleme sistemini, statik kitaplıklarınızdaki tüm nesne dosyalarını iki kat daha fazla belirir. Ancak yürütülebilir dosyalar oluşturulurken aynı durum geçerli değildir.

LOCAL_LDLIBS

Bu değişken, binada kullanılan ek bağlayıcı flag'lerinin listesini içerir paylaşılan kitaplığınızda veya yürütülebilir dosyalarda görünür. -l ön ekini kullanarak belirli sistem kitaplıklarının adını yazın. Örneğin, aşağıdaki örnekte bağlayıcıya yükleme sırasında /system/lib/libz.so'e bağlantı veren bir modül oluşturması söylenmektedir:

LOCAL_LDLIBS := -lz

Bu NDK'da bağlantı oluşturabileceğiniz, açığa çıkmış sistem kitaplıklarının listesi için sürümü için Yerel API'ler bölümüne bakın.

LOCAL_LDFLAGS

Derleme sisteminizin derleme sırasında kullanacağı, derleme sistemi için paylaşılan kitaplık veya yürütülebilir dosya. Örneğin, ARM/X86'te ld.bfd bağlayıcıyı kullanmak için:

LOCAL_LDFLAGS += -fuse-ld=bfd

LOCAL_ALLOW_UNDEFINED_SYMBOLS

Derleme sistemi tanımlanmamış bir referansla karşılaştığında varsayılan olarak paylaşılan bir değer oluşturmaya çalışırken tanımsız sembol hatası atar. Bu hata, kaynak kodunuzdaki hataları yakalamanıza yardımcı olabilir.

Bu kontrolü devre dışı bırakmak için değişkeni true olarak ayarlayın. Bu ayarın paylaşılan kitaplığın çalışma zamanında yüklenmesine neden olur.

YEREL_ARM_MODU

Derleme sistemi varsayılan olarak ARM hedef ikili programlarını thumb modunda oluşturur. Bu modda her talimat 16 bit genişliğindedir ve thumb/ dizinindeki STL kitaplıklarıyla bağlantılıdır. Bu değişkenin arm olarak tanımlanması, derleme sistemini modülün nesne dosyalarını 32 bit arm modunda oluşturur. Aşağıdaki örnek bunun nasıl yapılacağını gösterir:

LOCAL_ARM_MODE := arm

Kaynak dosya adlarına .arm son ekini ekleyerek derleme sistemine yalnızca belirli kaynakları arm modunda derlemesini de bildirebilirsiniz. Örneğin, Aşağıdaki örnek, derleme sistemine bar.c öğesini her zaman ARM modunda derlemesini söyler, ancak LOCAL_ARM_MODE değerine göre foo.c oluşturmak için kullanılır.

LOCAL_SRC_FILES := foo.c bar.c.arm

LOCAL_ARM_NEON

Bu değişken yalnızca armeabi-v7a ABI'yi hedeflediğinizde önemlidir. Google C ve C++ cihazlarınızda ARM Advanced SIMD (NEON) derleyici yerleşik özelliklerinin kullanılmasına olanak tanır ve Assembly dosyalarındaki NEON talimatlarını içerir.

ARMv7 tabanlı tüm CPU'ların NEON talimat seti uzantılarını desteklemediğini unutmayın. Bu nedenle, dosyayı güvenli bir şekilde kullanabilmek için çalışma zamanı algılaması bu kodu girmeniz gerekir. Daha fazla bilgi için Neon destek sayfasına bakın ve CPU özellikleri.

Alternatif olarak, .neon sonekini kullanarak derleme sisteminin NEON desteğiyle yalnızca belirli kaynak dosyaları derleyin. Aşağıdaki örnekte, derleme sistemi, foo.c öğesini baş ve neon desteğiyle, bar.c öğesini ise başparmak desteği ve ARM ve NEON desteğiyle zoo.c:

LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon

Her iki soneki de kullanırsanız .arm, .neon tarihinden önce gelmelidir.

LOCAL_DISABLE_FORMAT_STRING_CHECKS

Derleme sistemi, varsayılan olarak kodu biçim dizesi korumasıyla derler. Bu işlem, printf stilinde bir işlevde sabit olmayan bir biçim dizesi kullanılıyorsa derleyici hatası oluşmasına neden olur. Bu koruma varsayılan olarak açıktır, ancak isterseniz devre dışı bırakabilirsiniz bu değişkenin değerini true olarak ayarlayarak bunu görebilirsiniz. Bunu yapmanızı önermiyoruz bir nedeni olabilir.

YEREL_DIŞA_AKIŞ_CFLAGS

Bu değişken, LOCAL_CFLAGS öğesine eklenecek bir dizi C/C++ derleyici işareti kaydeder kullanan diğer modüllerin tanımlarını LOCAL_STATIC_LIBRARIES veya LOCAL_SHARED_LIBRARIES değişkenleri.

Örneğin, şu modül çiftlerini ele alalım: foo ve bar. foo öğesine bağlıdır:

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_CFLAGS := -DFOO=1
include $(BUILD_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_CFLAGS := -DBAR=2
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)

Burada derleme sistemi, bar.c dosyasını derlerken -DFOO=1 ve -DBAR=2 işaretlerini derleyiciye iletir. Ayrıca, dışa aktarılan işaretleri modülünüzün LOCAL_CFLAGS önüne ekleyerek bunları kolayca geçersiz kılabilirsiniz.

Ayrıca, modüller arasındaki ilişki geçişlidir: zoo, bar'a bağlıysa ve bar da foo'ye bağlıysa zoo, foo'den dışa aktarılan tüm işaretleri de devralır.

Son olarak, derleme sistemi yerel olarak derleme yaparken (yani, işaretlerini dışa aktardığı modülü derleme) dışa aktarılan işaretleri kullanmaz. Bu nedenle, yukarıdaki örnekte foo/foo.c derlenirken -DFOO=1 derleyiciye iletilmez. Yerel olarak derlemek için bunun yerine LOCAL_CFLAGS kullanın.

LOCAL_EXPORT_CPPFLAGS

Bu değişken LOCAL_EXPORT_CFLAGS ile aynıdır, ancak yalnızca C++ işaretleri için geçerlidir.

YEREL_DIŞA_AKTAR_C_DAHİL ETME

Bu değişken, LOCAL_EXPORT_CFLAGS ile aynıdır ancak C için yolları içerir. Google Örneğin, bar.c öğesinin üstbilgilerini içermesi gerektiği durumlarda yararlıdır: foo modülü.

YEREL_DIŞA_AKIŞ_LDFLAGS

Bu değişken LOCAL_EXPORT_CFLAGS ile aynıdır ancak bağlayıcı işaretleri içindir.

YEREL_EXPORT_LDLIBS

Bu değişken LOCAL_EXPORT_CFLAGS ile aynıdır ve derleme sistemine belirli sistem kitaplıklarının adlarını derleyiciye iletir. Başına -l ekle adını yazın.

Derleme sisteminin, içe aktarılan bağlayıcı işaretlerini modülünüzün LOCAL_LDLIBS değişkeninin değerine eklediğini unutmayın. Unix bağlayıcılarının çalışma şeklinden dolayı bunu yapar.

Bu değişken genellikle foo modülü statik bir kitaplık olduğunda ve sistem kitaplığına bağlı bir kod içerir. Ardından LOCAL_EXPORT_LDLIBS ile şunları yapabilirsiniz: dışa aktarması gerekir. Örnek:

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)

Bu örnekte, derleme sistemi bağlayıcı komutunun sonuna -llog komutunu yerleştiriyor libbar.so derlendiğinde. Bu işlem, libbar.so'ün foo'e bağlı olduğu için sistem günlük kaydı kitaplığına da bağlı olduğunu bağlayıcıya bildirir.

LOCAL_SHORT_COMMANDS

Modülünüzde çok fazla kaynak olduğunda bu değişkeni true olarak ayarlayın ve/veya bağımlı statik ya da paylaşılan kitaplıklar. Bu işlem, derleme sistemini ara nesne dosyaları veya bağlantı kitaplıkları içeren arşivler için @ söz dizimini kullanmaya zorlar.

Bu özellik, komut satırının maksimum 8191 karakterden oluşan bir metin girin. Bu değer, karmaşık projeler için çok küçük olabilir. Aynı zamanda tek tek kaynak dosyaların derlenmesini etkiler ve neredeyse tüm derleyiciler işaretleri de içerir.

true dışındaki tüm değerlerin varsayılan davranışa döneceğini unutmayın. Siz zorlamak için Application.mk dosyanızda APP_SHORT_COMMANDS tanımlayabilirsiniz bu davranışı projenizdeki tüm modüller için geçerli hale getirir.

Derlemenin daha hızlı yüklenmesini sağladığından bu özelliğin varsayılan olarak etkinleştirilmesini önermiyoruz yavaşlar.

LOCAL_THIN_ARCHIVE

Statik kitaplıklar oluştururken bu değişkeni true olarak ayarlayın. Bu işlem, nesne dosyaları yerine normalde içereceği gerçek nesnelerin dosya yollarını içeren bir kitaplık dosyası olan ince bir arşiv oluşturur.

Bu, derleme çıktınızın boyutunu azaltma açısından yararlıdır. Bunun dezavantajı, bu tür kitaplıkların farklı bir konuma taşınamamasıdır (içlerindeki tüm yollar görecelidir).

Geçerli değerler true, false veya boş değerlerdir. APP_THIN_ARCHIVE değişkeni üzerinden Application.mk dosyasını yükleyebilirsiniz.

LOCAL_FILTER_ASM

Bu değişkeni, derleme sisteminin filtrelemek için kullanacağı kabuk komutu olarak tanımlayın belirttiğiniz dosyalardan çıkarılan veya oluşturulan derleme dosyaları LOCAL_SRC_FILES Bu değişkenin tanımlanması, aşağıdaki durumların oluşmasına neden olur:

  1. Derleme sistemi herhangi bir C veya C++ kaynağından geçici bir derleme dosyası oluşturur dosyası olarak derleyebilirsiniz.
  2. Derleme sistemi, kabuk komutunu LOCAL_FILTER_ASM projesinde LOCAL_SRC_FILES dizininde listelenen herhangi bir derleme dosyasında, oluşturarak başka bir geçici derleme dosyası oluşturabilirsiniz.
  3. Derleme sistemi, filtrelenmiş bu derleme dosyalarını bir nesne dosyasında derler.

Örnek:

LOCAL_SRC_FILES  := foo.c bar.S
LOCAL_FILTER_ASM :=

foo.c --1--> $OBJS_DIR/foo.S.original --2--> $OBJS_DIR/foo.S --3--> $OBJS_DIR/foo.o
bar.S                                 --2--> $OBJS_DIR/bar.S --3--> $OBJS_DIR/bar.o

"1" derleyiciye, "2" filtreye ve "3" de derleyiciye karşılık gelir. Filtre, ilk bağımsız değişkeni giriş dosyasının adı, ikinci bağımsız değişkeni ise çıkış dosyasının adı olan bağımsız bir kabuk komutu olmalıdır. Örnek:

myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
myasmfilter bar.S $OBJS_DIR/bar.S

NDK tarafından sağlanan işlev makroları

Bu bölümde, NDK'nın sağladığı GNU Make işlevi makroları açıklanmaktadır. Tekliflerinizi otomatikleştirmek ve optimize etmek için Değerlendirmek için $(call <function>); metinsel bilgiler döndürürler.

my-dir

Bu makro, eklenen son Makefile yolunu döndürür. Bu yöntem genellikle mevcut Android.mk dizini. my-dir, şunun tanımlanması için yararlıdır: Android.mk dosyanızın başında LOCAL_PATH. Örnek:

LOCAL_PATH := $(call my-dir)

GNU Make'sinin çalışma şekli nedeniyle bu makronun gerçekte döndürdüğü şey, derleme sisteminin derleme komut dosyalarını ayrıştırırken eklediği son oluşturma dosyası. Örneğin, Bu nedenle, başka bir dosya ekledikten sonra my-dir öğesini çağırmamalısınız.

Örneğin, aşağıdaki örneği inceleyin:

LOCAL_PATH := $(call my-dir)

# ... declare one module

include $(LOCAL_PATH)/foo/`Android.mk`

LOCAL_PATH := $(call my-dir)

# ... declare another module

Buradaki sorun, my-dir için yapılan ikinci çağrıda LOCAL_PATH, en son dahil etme işleminin işaret ettiği yer olduğu için $PATH yerine $PATH/foo olarak tanımlanıyor.

Android.mk dosyasında diğer her şeyden sonra ek dahil etme işlemleri ekleyerek bu sorunu önleyebilirsiniz. Örnek:

LOCAL_PATH := $(call my-dir)

# ... declare one module

LOCAL_PATH := $(call my-dir)

# ... declare another module

# extra includes at the end of the Android.mk file
include $(LOCAL_PATH)/foo/Android.mk

Dosyayı bu şekilde yapılandırmak mümkün değilse ilk my-dir çağrısı başka bir değişkene dönüştürülür. Örnek:

MY_LOCAL_PATH := $(call my-dir)

LOCAL_PATH := $(MY_LOCAL_PATH)

# ... declare one module

include $(LOCAL_PATH)/foo/`Android.mk`

LOCAL_PATH := $(MY_LOCAL_PATH)

# ... declare another module

tüm-subdir-makefiles

Geçerli my-dir yolunun tüm alt dizinlerinde bulunan Android.mk dosyalarının listesini döndürür.

Derleme sistemine derin iç içe yerleştirilmiş kaynak dizin hiyerarşileri sağlamak için bu işlevi kullanabilirsiniz. NDK, varsayılan olarak yalnızca Android.mk dosyasını içeren dizinde dosya arar.

bu-yapım dosyası

Geçerli oluşturma dosyasının yolunu döndürür (derleme sisteminin işlevi) kullanabilirsiniz.

parent-makefile

Dahil etme ağacındaki üst oluşturma dosyasının yolunu ( hazır dosyayı da içerir.

büyük-ana-yapı-dosyası

Dahil etme ağacındaki ( dosyayı tekrar yükleyebilirsiniz.

içe aktarma modülü

Modülün adına göre modülün Android.mk dosyasını bulup dahil etmenize olanak tanıyan bir işlev. Aşağıda tipik bir örnek verilmiştir:

$(call import-module,<name>)

Bu örnekte derleme sistemi, NDK_MODULE_PATH ortam değişkeninizin referans verdiği dizin listesinde <name> etiketli modülü arar ve Android.mk dosyasını sizin için otomatik olarak ekler.