NDK ile oluşturulan ara katman yazılımlarının dağıtılması, endişelenmesine gerek yok. Hazır kitaplıklar, uygulama seçeneklerinin bir kısmını kullanıcılarına empoze eder.
API düzeylerini ve NDK sürümlerini seçme
Kullanıcılarınız sizinkinden daha düşük bir minSdkVersion kullanamaz. Kullanıcılarınızın uygulamalar API 21'de çalıştırmanız gerekiyorsa API 24 için derleme yapamazsınız. Kendilerinizi kullanıcılarınıza göre daha düşük API düzeyi için sunulur. API 16 için oluşturma işlemi gerçekleştirebilir ve API 21 kullanıcılarınızla uyumlu kalabilirsiniz.
NDK sürümleri büyük ölçüde birbiriyle uyumludur ancak zaman zaman uyumluluğu bozan değişiklikler olabilir. Tüm kullanıcılarınızın ile aynı sürümü kullanmak en iyisidir. Aksi takdirde en yeni sürümü kullanın.
STL'yi kullanma
C++ yazıyor ve STL kullanıyorsanız libc++_shared
ve STL
Paylaşılan bir kitaplık dağıtıyorsanız libc++_static
kullanıcılarınızı etkiler. Paylaşılan bir kitaplık dağıtıyorsanız libc++_shared
'ü kullanmanız veya libc++'nın simgelerinin kitaplığınız tarafından gösterilmediğinden emin olmanız gerekir. Bunu yapmanın en iyi yolu
ABI yüzeyinizi bir sürüm komut dosyası ile açıkça beyan edin.
Daha az güvenilir başka bir seçenek de bağlantı oluştururken -Wl,--exclude-libs,libc++_static.a
-Wl,--exclude-libs,libc++abi.a
kullanmaktır. Bu yaklaşım daha az güvenilirdir çünkü
yalnızca açıkça adlandırılmış kitaplıklardaki simgeleri gizler ve
kullanılmayan kitaplıklar için teşhisler raporlanır (kitaplıkta bir yazım hatası vardır)
ad bir hata değildir ve kitaplık listesini güncel tutma sorumluluğu kullanıcıya aittir
) sağlar. Bu yaklaşım, kendi uygulama ayrıntılarınızı da gizlemez.
AAR'larda yerel kitaplıkları dağıtma
Android Gradle eklentisi, AAR'larda dağıtılan yerel bağımlılıkları içe aktarabilir. Kullanıcılarınız Android Gradle eklentisini kullanıyorsa bu eklenti, en kolay yolunu sunuyor.
Yerel kitaplıklar AGP tarafından AAR olarak paketlenebilir. Bu, kitaplığınız zaten externalNativeBuild tarafından oluşturulmuşsa en kolay seçenektir.
AGP dışı derlemeler ndkports'i kullanabilir veya AAR'larının prefab/
alt dizinlerini oluşturmak için Prefab belgelerini izleyerek manuel paketleme yapabilir.
JNI kitaplıklarıyla Java ara katman yazılımları
JNI kitaplıkları (başka bir deyişle,
jniLibs
) kullanıyorsanız, bu sonuçlardaki JNI kitaplıklarının
kullanıcının uygulamasındaki diğer kitaplıklarla çakışır. Örneğin, AAR
libc++_shared.so
, ancak uygulamadan farklı bir libc++_shared.so
sürümü
bu durumlardan biri APK'ya yüklenir ve bu durum,
gösterir.
En güvenilir çözüm, Java kitaplıklarının en fazla bir JNI kitaplığı içermesidir (bu, uygulamalar için de iyi bir öneridir). STL dahil tüm bağımlılıklar, uygulama kitaplığına statik olarak bağlanmalı ve ABI yüzeyini zorunlu kılmak için bir sürüm komut dosyası kullanılmalıdır. Örneğin, libfooimpl.so
JNI kitaplığını içeren bir Java kitaplığıcom.example.foo
aşağıdaki sürüm komut dosyasını kullanmalıdır:
LIBFOOIMPL {
global:
JNI_OnLoad;
local:
*;
};
Bu örnekte, minimum ABI yüzeyinin gösterilmesi ve kitaplık yükleme süresinin en aza indirilmesi için JNI İpuçları bölümünde açıklandığı gibi JNI_OnLoad
üzerinden registerNatives
kullanılır.