Ara katman yazılımları satıcıları için öneriler

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.