CMake veya ndk-build kullanmıyorsanız ancak Android Gradle eklentisi (AGP) C/C++ derleme ve Android Studio'nun tam entegrasyonunu istiyorsanız derleme bilgilerini Ninja derleme dosyası biçiminde yazan bir kabuk komut dosyası oluşturarak özel bir C/C++ derleme sistemi oluşturabilirsiniz.
Android Studio ve AGP'ye özel C/C++ derleme sistemleri için deneysel destek eklendi. Bu özellik, Android Studio Dolphin | 2021.3.1 Canary 4 sürümünden itibaren kullanılabilir.
Genel Bakış
C/C++ projeleri (özellikle birden fazla platformu hedefleyenler) için ortak bir kalıp, bazı temel temsillerden bu platformların her biri için proje oluşturmaktır.
Bu kalıba iyi bir örnek CMake'dir. CMake, CMakeLists.txt
dosyasına kaydedilen tek bir temel temsilden Android, iOS ve diğer platformlar için projeler oluşturabilir.
CMake, AGP tarafından doğrudan desteklenmesine rağmen doğrudan desteklenmeyen başka proje oluşturucular da vardır:
Bu tür proje oluşturucular, C/C++ derlemesinin arka uç temsili olarak Ninja'yı destekler veya Ninja'yı arka uç temsili olarak oluşturacak şekilde uyarlanabilir.
Doğru şekilde yapılandırıldığında, entegre bir C/C++ proje sistemi oluşturucusu içeren bir AGP projesi kullanıcıların şunları yapmasını sağlar:
Komut satırından ve Android Studio'dan derleme.
Android Studio'da tam dil hizmeti desteğiyle (ör. tanım sayfasına gitme) kaynakları düzenleyin.
Yerel ve karma süreçlerde hata ayıklama yapmak için Android Studio hata ayıklayıcılarını kullanın.
Özel bir C/C++ derleme yapılandırma komut dosyası kullanacak şekilde derlemenizi değiştirme
Bu bölümde, AGP'den özel bir C/C++ derleme yapılandırma komut dosyasını kullanmayla ilgili adımlar açıklanmaktadır.
1. adım: Modül düzeyindeki build.gradle
dosyasını, bir yapılandırma komut dosyasına referans verecek şekilde değiştirin
AGP'de Ninja desteğini etkinleştirmek için modül düzeyindeki build.gradle
dosyasında experimentalProperties
öğesini yapılandırın:
android {
defaultConfig {
externalNativeBuild {
experimentalProperties["ninja.abiFilters"] = [ "x86", "arm64-v8a" ]
experimentalProperties["ninja.path"] = "source-file-list.txt"
experimentalProperties["ninja.configure"] = "configure-ninja"
experimentalProperties["ninja.arguments"] = [
"\${ndk.moduleMakeFile}",
"--variant=\${ndk.variantName}",
"--abi=Android-\${ndk.abi}",
"--configuration-dir=\${ndk.configurationDir}",
"--ndk-version=\${ndk.moduleNdkVersion}",
"--min-sdk-version=\${ndk.minSdkVersion}"
]
}
}
Özellikler AGP tarafından aşağıdaki şekilde yorumlanır:
ninja.abiFilters
, derlenecek ABI'lerin listesidir. Geçerli değerlerx86
,x86-64
,armeabi-v7a
vearm64-v8a
değerleridir.ninja.path
, C/C++ proje dosyasının yoludur. Bu dosyanın biçimi istediğiniz herhangi bir şey olabilir. Bu dosyada yapılan değişiklikler, Android Studio'da Gradle senkronizasyonu istemi tetikler.ninja.configure
, C/C++ projesinin yapılandırılması gerektiğinde Gradle tarafından yürütülecek bir komut dosyası yolunun adıdır. Projeler ilk derlemede, Android Studio'da Gradle senkronizasyonu sırasında veya yapılandırma komut dosyası girişlerinden biri değiştiğinde yapılandırılır.ninja.arguments
, ninja.configure tarafından tanımlanan komut dosyasına iletilecek bağımsız değişkenler listesidir. Bu listedeki öğeler, değerleri AGP'deki mevcut yapılandırma bağlamına bağlı olan bir makro grubuna referans verebilir:${ndk.moduleMakeFile}
,ninja.configure
dosyasının tam yoludur. Bu nedenle, örnekteC:\path\to\configure-ninja.bat
olur.${ndk.variantName}
, derlenmekte olan mevcut AGP varyantının adıdır. Örneğin, hata ayıklama veya yayınlama.${ndk.abi}
, derlenen mevcut AGP ABI'nin adıdır. Örneğin,x86
veyaarm64-v8a
.
${ndk.buildRoot}
, AGP tarafından oluşturulan ve komut dosyasının çıkışını yazdığı klasörün adıdır. Bununla ilgili ayrıntılar 2. Adım: Yapılandırma komut dosyasını oluşturun bölümünde açıklanacaktır.${ndk.ndkVersion}
, kullanılacak NDK sürümüdür. Bu genelliklebuild.gradle
dosyasında android.ndkVersion parametresine iletilen değerdir veya böyle bir değer yoksa varsayılan değerdir.${ndk.minPlatform}
, AGP tarafından istenen minimum hedef Android platformudur.
ninja.targets
, oluşturulması gereken belirli Ninja hedeflerinin listesidir.
2. adım: Yapılandırıcı komut dosyasını oluşturun
Yapılandırma komut dosyasının (önceki örnekte configure-ninja.bat
) minimum sorumluluğu, Ninja ile derlendiğinde projenin tüm yerel çıkışlarını derleyip bağlayacak bir build.ninja
dosyası oluşturmaktır. Bunlar genellikle .o
(Nesne), .a
(Arşiv) ve .so
(Paylaşılan Nesne) dosyalarıdır.
Yapılandırıcı komut dosyası, build.ninja
dosyasını ihtiyaçlarınıza bağlı olarak iki farklı yere yazabilir.
AGP'nin bir konum seçmesi uygunsa yapılandırma komut dosyası,
${ndk.buildRoot}
makrosunda ayarlanan konumabuild.ninja
yazar.Yapılandırıcı komut dosyasının
build.ninja
dosyasının konumunu seçmesi gerekiyorsa${ndk.buildRoot}
makrosunda ayarlanan konumabuild.ninja.txt
adlı bir dosya da yazar. Bu dosya, yapılandırma komut dosyasının yazdığıbuild.ninja
dosyasının tam yolunu içerir.
build.ninja
dosyasının yapısı
Genel olarak, Android C/C++ derlemesini doğru şekilde temsil eden çoğu yapı işe yarar. AGP ve Android Studio'nun ihtiyaç duyduğu temel öğeler şunlardır:
Clang'ın derlemesi için ihtiyaç duyduğu işaretlerle birlikte C/C++ kaynak dosyalarının listesi.
Çıkış kitaplıklarının listesi. Bunlar genellikle
.so
(ortak nesne) dosyalarıdır ancak.a
(arşiv) veya yürütülebilir (uzantı yok) dosyalar da olabilir.
build.ninja
dosyasının nasıl oluşturulacağına dair örneklere ihtiyacınız varsa build.ninja
oluşturucu kullanıldığında CMake'in çıktısına bakabilirsiniz.
Basit bir build.ninja
şablonu örneğini aşağıda bulabilirsiniz.
rule COMPILE
command = /path/to/ndk/clang -c $in -o $out {other flags}
rule LINK
command = /path/to/ndk/clang $in -o $out {other flags}
build source.o : COMPILE source.cpp
build lib.so : LINK source.o
En iyi uygulamalar
Şartlara (kaynak dosyaların ve çıkış kitaplıklarının listesi) ek olarak, önerilen bazı en iyi uygulamaları aşağıda bulabilirsiniz.
phony
kurallarıyla adlandırılmış çıkışları bildirme
Mümkün olduğunda, derleme çıktılarına kullanıcı tarafından okunabilir adlar vermek için build.ninja
yapısının phony
kuralları kullanması önerilir. Örneğin, c:/path/to/lib.so
adlı bir çıkışınız varsa aşağıdaki gibi kullanıcı tarafından okunabilir bir ad verebilirsiniz.
build curl: phony /path/to/lib.so
Bunu yapmanın avantajı, daha sonra bu adı build.gradle
dosyasında derleme hedefi olarak belirtebilmenizdir. Örneğin,
android {
defaultConfig {
externalNativeBuild {
...
experimentalProperties["ninja.targets"] = [ "curl" ]
"Tümü" hedefini belirtme
all
hedefi belirttiğinizde, build.gradle
dosyasında açıkça hedef belirtilmediği takdirde AGP tarafından oluşturulan varsayılan kitaplık grubu bu olur.
rule COMPILE
command = /path/to/ndk/clang $in -o $out {other flags}
rule LINK
command = /path/to/ndk/clang $in -o $out {other flags}
build foo.o : COMPILE foo.cpp
build bar.o : COMPILE bar.cpp
build libfoo.so : LINK foo.o
build libbar.so : LINK bar.o
build all: phony libfoo.so libbar.so
Alternatif bir derleme yöntemi belirtin (isteğe bağlı)
Daha gelişmiş bir kullanım alanı, Ninja tabanlı olmayan mevcut bir derleme sistemini sarmalamaktır. Bu durumda, Android Studio'nun otomatik tamamlama ve tanım sayfasına gitme gibi uygun dil hizmeti özelliklerini sunabilmesi için tüm kaynakları, çıkış kitaplıklarıyla birlikte işaretleriyle birlikte temsil etmeniz gerekir. Ancak AGP'nin gerçek derleme sırasında temel derleme sistemine devretmesini istiyorsunuz.
Bunu yapmak için belirli bir uzantıya (.passthrough
) sahip bir Ninja derleme çıkışı kullanabilirsiniz.
Daha somut bir örnek olarak, bir MSBuild'i sarmalamak istediğinizi varsayalım. Yapılandırma komut dosyanız her zamanki gibi build.ninja
dosyasını oluşturur ancak AGP'nin MSBuild'i nasıl çağıracağını tanımlayan bir geçiş hedefi de ekler.
rule COMPILE
command = /path/to/ndk/clang $in -o $out {other flags}
rule LINK
command = /path/to/ndk/clang $in -o $out {other flags}
rule MBSUILD_CURL
command = /path/to/msbuild {flags to build curl with MSBuild}
build source.o : COMPILE source.cpp
build lib.so : LINK source.o
build curl : phony lib.so
build curl.passthrough : MBSUILD_CURL
Geri bildirimde bulunma
Bu özellik deneysel olduğundan geri bildirimlerinizi bekliyoruz. Aşağıdaki kanallardan geri bildirimde bulunabilirsiniz:
Genel geri bildirim için bu hataya yorum ekleyin.
Hata bildirmek için Android Studio'yu açıp Yardım > Geri Bildirim Gönder'i tıklayın. Hatayı yönlendirmek için "Özel C/C++ Derleme Sistemleri"ne referans verdiğinizden emin olun.
Android Studio yüklü değilse hata bildirmek için bu şablonu kullanarak hata kaydı oluşturun.