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 kez veya bir süre için ayrıştırdığı küçük bir GNU oluşturma dosyası daha fazla. Android.mk dosyası, kullanılabilecek proje genelindeki ayarları tanımlamak için yararlıdır: Application.mk, derleme sistemi ve ortam değişkenleriniz tanımlanmadı. 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. Yalnızca derleme sistemi paylaşılan kitaplıkları uygulama paketinize yerleştirir. Ayrıca, statik kitaplıklar paylaşılan kitaplıklar oluşturabilir.

Derleme sistemi, paketleme kitaplıklarının yanı sıra bazı ipuçları vereceğim. Örneğin, başlık dosyalarını veya müstehcen dosyaları listelemeniz gerekmez. Android.mk dosyanızdaki oluşturulan dosyalar arasındaki bağımlılıkları belirleyin. NDK yapısı sistem bu ilişkileri sizin için otomatik olarak hesaplar. Bunun sonucunda, gelecekteki NDK'da yeni araç zincirinden/platform desteğinden yararlanabilmeli Android.mk dosyanıza dokunmanıza gerek kalmadan serbest bırakılır.

Bu dosyanın söz dizimi, Android.mk dosyalarında kullanılan söz dizimine çok yakın tam Android Açık Kaynak Projesi ile dağıtılmıştı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 içeriğiyle ilgili temel bilgileri içerir. Bu bölümde, Bu hedefe doğru, Hello-JNI örneğindeki Android.mk dosyasını kullanarak dosyadaki her satırın oynatılmasını sağlar.

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

LOCAL_PATH := $(call my-dir)

Bu değişken, geliştirmedeki kaynak dosyaların konumunu gösterir ağacı. Bu örnekte, derleme sistemi tarafından sağlanan my-dir makro işlevi, geçerli dizinin (Android.mk içeren dizin) yolu dosyası) ekleyebilirsiniz.

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. LOCAL_PATH öğesinin temizlenmediğini unutmayın. 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ı sağlayın. Şunu yapmalısınız: her modülü açıklamadan önce bu değişkeni (yeniden) belirtin.

Daha sonra, LOCAL_MODULE değişkeni 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, dosyayı oluşturduğunda uygun dosyayı otomatik olarak ekler ve ön eki ve son eki, LOCAL_MODULE öğesine atadığınız ada eklenir. Ö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ı neyin 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. En son, Değişkenler ve makrolar, bu değişken hakkında daha fazla bilgi sağlar. bölümüne ekleyin.

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 birlikte gelir. Diğerlerini siz atarsınız.

Bu değişkenlere ek olarak kendi rastgele değişkenlerinizi de tanımlayabilirsiniz. İstiyorsanız NDK derleme sisteminin aşağıdaki değişken adlarını sakladığını unutmayın:

  • LOCAL_ ile başlayan LOCAL_MODULE gibi adlar.
  • 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. NDK, bazı durumlarda Android.mk dosyanızı farklı bir tanım kullanarak birkaç kez ayrıştırabilir bazıları için otomatik olarak ekler.

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. Bunu kullan değişkeni kullanabilirsiniz. Söz dizimi en iyi uygulamaları paylaşacağız:

include $(CLEAR_VARS)

BUILD_EXECUTABLE (Yürütülebilir)

Bu değişken, isimli bir komut dosyasıyla ilgili tüm bilgileri toplayan bir 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ı, LOCAL_MODULE öğesine zaten değer atadığınızı ve En az LOCAL_SRC_FILES (bu değişkenler hakkında daha fazla bilgi için Modül açıklaması değişkenleri).

Bu değişkeni kullanmak için söz dizimi şöyledir:

include $(BUILD_EXECUTABLE)

PAYLAŞILAN_KİTAPLIK

Bu değişken, isimli bir komut dosyasıyla ilgili tüm bilgileri toplayan bir 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ı, LOCAL_MODULE öğesine zaten değer atadığınızı ve En az LOCAL_SRC_FILES (bu değişkenler hakkında daha fazla bilgi için Modül açıklaması değişkenleri).

Bu değişkeni kullanmak için söz dizimi şöyledir:

include $(BUILD_SHARED_LIBRARY)

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

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)

Bir statik-kitaplık değişkeni, derleme sisteminin .a uzantısı var.

PREBUILT_SHARED_LIBRARY

Önceden oluşturulmuş paylaşılan bir kitaplığı belirtmek için kullanılan bir derleme komut dosyasına yönlendirir. 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şkeni ş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 bir kitaplıktır. Örneğin, Ö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 Android.mk öğesini, APP_ABI tarafından belirtilen ABI başına bir kez ayrıştırır değişkenidir. Bu değişken, genellikle Application.mk dosyanızda tanımlanır. Eğer APP_ABI ise all ise derleme sistemi, Android.mk değerini ABI başına NDK başına bir kez ayrıştırır destekler. Bu bölümde, derleme sisteminin her Android.mk ayrıştırır.

HEDEF_ARCH

Bu Android.mk öğesini ayrıştırırken derleme sisteminin hedeflediği CPU ailesi dosyası olarak kaydedebilirsiniz. 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ı yükleyin. Örneğin, Android 5.1 sistem görüntüleri Android API düzeyi 22: 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 olarak ARMv8 AArch64'ün nasıl kontrol edileceği gösterilmektedir CPU ve ABI kombinasyonu:

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'nın 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'de çalışan 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, modülünüzü derleme sistemine açıklar. 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, dolayısıyla:

LOCAL_PATH := $(call my-dir)

CLEAR_VARS tarafından işaret edilen komut dosyası, bu değişkeni temizlemez. Dolayısıyla, Android.mk dosyanız olsa bile yalnızca bir kez tanımlamanız gerekir. birden fazla modülün açıklanmasıdır.

YEREL_MODÜL

Bu değişken, modülünüzün adını depolar. Tüm modüller arasında benzersiz olmalıdır. 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 boyunca dosyalarını değiştirirseniz modülünize değiştirilmemiş adıyla bakın. Örneğin, satır sonuçları libfoo.so adlı paylaşılan bir kitaplık modülünün oluşturulmasıyla sonuçlanır:

LOCAL_MODULE := "foo"

Oluşturulan modülün lib + LOCAL_MODULE değerini belirlemek için LOCAL_MODULE_FILENAME değişkenini kullanabilirsiniz kendi seçtiğiniz bir adla oluşturulmuş bir modül verebilirsiniz.

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

Paylaşılan kitaplık modülü için bu örnek, libnewfoo.so

LOCAL_SRC_FILES

Bu değişken, derleme sisteminin kullandığı oluşturacağım. 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) hem de mutlak değerlerin kullanılabileceğini unutmayın. dosya yolları.

Mutlak dosya yollarından kaçınmanızı öneririz; göreli yollar, Android.mk daha taşınabilir hale getiriyoruz.

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 .cxx uzantısına sahip. (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. Bu değişken, önceden oluşturulmuş ikili programlar için bağlı olarak değişiklik gösterir. Böylece, nihai bağlantının doğru şekilde çalıştığından emin olabilirsiniz. Biz -frtti ve -fexceptions değerini doğrudan LOCAL_CPPFLAGS tanımınızda bulabilirsiniz.

Bu değişkenin kullanılması, derleme sisteminin inceleyeceğiz. LOCAL_CPPFLAGS kullanılması, derleyicinin belirtilen tüm bilgileri kullanmasına neden olur. bayraklarını pekiştirmeniz gerekir.

Ö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 çok değer de belirtebilirsiniz. Örnek:

LOCAL_CPP_FEATURES := rtti features

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

YEREL_C_DAHİL

Bu isteğe bağlı değişkeni, Tümünü derlerken dahil et arama yoluna eklemek için NDK root dizini kaynakları (C, C++ ve Assembly) içerir. Örnek:

LOCAL_C_INCLUDES := sources/foo

Hatta:

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

Dahil olma bayraklarını LOCAL_CFLAGS veya LOCAL_CPPFLAGS.

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

YEREL_CFLAGS

Bu isteğe bağlı değişken, C ve C++ kaynak dosyaları oluşturmak için de kullanabilirsiniz. Bu özellik, proje yöneticisi olarak ek makro tanımları veya derleme seçenekleri belirtme. LOCAL_CPPFLAGS hesabını kullan kullanın.

Android.mk dosyanızda optimizasyon/hata ayıklama düzeyini değiştirmemeye çalışın. Derleme sistemi Application.mk dosyasındaki alakalı bilgiler. Bu sayede hata ayıklama sırasında kullanılan faydalı veri dosyaları oluşturmak için derleme sistemi.

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

LOCAL_CFLAGS += -I<path>,

Ancak LOCAL_C_INCLUDES kullanmak daha iyidir çünkü Böylece, yerel hata ayıklama için kullanılabilecek yolların ndk-gdb.

YEREL_ASKFLAGS

C++ kaynağı derlenirken iletilecek isteğe bağlı bir derleyici işaretleri grubu yalnızca dosyalara erişebilir. Bunlar derleyicide LOCAL_CFLAGS sonra görünür komut satırından erişebilirsiniz. Hem C hem de C++ için işaretleri belirtmek üzere LOCAL_CFLAGS öğesini 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 işlevinin bir varyantıdır ve bağlayıcı, ilişkili kitaplık modüllerini tüm arşivler olarak işlemelidir. Örneğin, daha fazla bilgi edinmek için GNU ld dokümanlarına bakın --whole-archive işareti.

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 bu 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 yükleme sırasında /system/lib/libz.so ile bağlantı kuran bir modül oluşturmak için bağlayıcıyı zaman:

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.

YEREL_LDFLAGS

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

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 hatası, 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 thumb modunda ARM hedef ikili programları oluşturur. Bu yöntemde her talimat 16 bit genişliğinde olur ve thumb/ dizini. 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

Ayrıca, derleme sistemine arm ürününde yalnızca belirli kaynakları derleyecek şekilde talimat verebilirsiniz kaynak dosya adlarına .arm son eki ekleyerek modunuza uygulayabilirsiniz. Ö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'sini hedeflediğinizde önemlidir. Google C ve C++ uygulamaları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.

Tüm ARMv7 tabanlı CPU'ların NEON talimat grubu uzantılarını desteklemediğini unutmayın. Bu nedenle, dosyayı güvenli bir şekilde kullanabilmek için çalışma zamanı algılamayı 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. Yapmak Bu nedenle, printf stili işlev. 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 -DFOO=1 ve -DBAR=2 işaretlerini derleyiciye iletir bar.c oluşturun. Ayrıca, dışa aktarılan işaretleri modülünüzün başına Bunları kolayca geçersiz kılabilmeniz için LOCAL_CFLAGS.

Ayrıca, modüller arasındaki ilişki geçişlidir: zoo bar, bu da foo değerine bağlıdır, ardından zoo de tüm işaretleri devralır foo kaynağından dışa aktarıldı.

Son olarak, derleme sistemi yerel olarak derleme yaparken dışa aktarılan işaretleri kullanmaz (yani, işaretlerini dışa aktardığı modülü derleme). Dolayısıyla, yukarıda belirtilenden, foo/foo.c derleme sırasında -DFOO=1 öğesini derleyiciye iletmez. Alıcı: yerel olarak derlemek yerine LOCAL_CFLAGS kullanın.

YEREL_DIŞA AKTAR_ÇALIŞAN_PAZARLAMALAR

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

YEREL_DIŞA_AKIŞ_C_DAHİL

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ün LOCAL_LDLIBS değişkeni 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 aktaracağız. Ö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şlemle, bağlayıcı bunu belirtir. Çünkü libbar.so foo değerine bağlıdır. Sistem günlük kaydı kitaplığına da bağlıdır.

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, derleme sistemini ara nesne dosyaları veya bağlantı içeren arşivler için @ söz dizimini kullanın kitaplıklar.

Bu özellik, komut satırının maksimum 8191 karakterden oluşmalıdır. Bu boyut, 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 değerlerin varsayılan davranışa geri 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 daha yavaş.

LOCAL_THIN_ARCHIVE

Statik kitaplıklar oluştururken bu değişkeni true olarak ayarlayın. Bu işlemle ince bir arşiv, yani nesne dosyaları içermeyen bir kitaplık dosyası oluşturun. Bunun yerine, normalde yalnızca görüntüleyeceğimiz gerçek nesnelerin dosya yollarını, emin olun.

Bu, derleme çıktınızın boyutunu azaltma açısından yararlıdır. Dezavantajı ise bu tür kitaplıklar farklı bir konuma (içindeki tüm yollar) taşınamaz 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_FİLTRE_ASM

Bu değişkeni, derleme sisteminin filtrelemek için kullanacağı kabuk komutu olarak tanımlayın belirttiğiniz dosyalardan ayıklanan 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" "2" derleyiciye karşılık gelir ekleyin ve "3" geri dönelim. Filtre, girişin adını alan bağımsız bir kabuk komutu olmalıdır dosyasını ilk bağımsız değişkeni olarak, çıkış dosyasının adını ise ikinci bağımsız değişken olarak kullanabilirsiniz. Ö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.

benim-diz

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 ele alalım:

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ının LOCAL_PATH öğesini $PATH yerine $PATH/foo, çünkü en son tıklayın.

Diğer her şeyden sonra ek eklemeler yaparak bu sorunu önleyebilirsiniz. Android.mk dosyasında bulabilirsiniz. Ö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

Şu öğenin tüm alt dizinlerinde bulunan Android.mk dosyalarının listesini döndürür: mevcut my-dir yolu.

Bu işlevi, derin iç içe yerleştirilmiş kaynak dizin hiyerarşileri sağlamak için kullanabilirsiniz. inceleyeceğiz. Varsayılan olarak, NDK yalnızca dizindeki dosyaları arar. Android.mk dosyasını içeren dosyalar.

bu-yapım dosyası

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

üst-yapı dosyası

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ü

Bir modülün Android.mk dosyasını bulup dahil etmenize olanak tanıyan modülün adını yazın. Aşağıda tipik bir örnek verilmiştir:

$(call import-module,<name>)

Bu örnekte, derleme sistemi aşağıdaki kodda <name> etiketli modülü NDK_MODULE_PATH ortamınıza referans veren dizinlerin listesi değişkenine referansta bulunur ve Android.mk dosyasını sizin için otomatik olarak ekler.