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. Önceden oluşturulmuş kitaplıklar hakkında daha fazla bilgi edindiniz.

API seviyelerini 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 için 16'yı kullanmaya devam edebilir ve API 21 kullanıcılarınızla uyumlu olmaya devam edebilirsiniz.

NDK sürümleri birbirleriyle büyük ölçüde uyumludur, ancak zaman zaman veya 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. Şu durumda: paylaşılan bir kitaplığı dağıtıyorsanız libc++_shared kullanmanız veya libc++ simgeleri kitaplığınızda gösterilmez. Bunu yapmanın en iyi yolu ABI yüzeyinizi bir sürüm komut dosyasıyla açıkça bildirin (bu aynı zamanda uygulama ayrıntılarınızı gizli tutabilirsiniz). Örneğin, basit bir aritmetik kütüphanesi aşağıdaki sürüm komut dosyasına sahip olabilir:

LIBMYMATH {
global:
    add;
    sub;
    mul;
    div;
    # C++ symbols in an extern block will be mangled automatically. See
    # https://stackoverflow.com/a/21845178/632035 for more examples.
    extern "C++" {
        "pow(int, int)";
    }
local:
    *;
};

En sağlam seçenek olduğu için tercih edilen seçenek, sürüm komut dosyasıdır. kontrol etmenin bir yoludur. Bu, paylaşılan tüm kullanıcılar için en iyi uygulamadır arasında bağlantı oluşturarak, uygulama ayrıntılarınızın ve yükleme süresini kısaltır.

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 kullanıcının kütüphane listesini güncel tutma sorumluluğudur ) sağlar. Bu yaklaşım, kendi uygulama ayrıntılarınızı da gizlemez.

AAR'larda yerel kitaplıkları dağıtma

Android Gradle eklentisi şurada dağıtılan yerel bağımlılıkları içe aktarabilir: AAR'ler. Kullanıcılarınız Android Gradle eklentisini kullanıyorsa bu eklenti, en kolay yolunu sunuyor.

Yerel kitaplıklar, AAR içine paketlenebilir AGP. Bu, kitaplığınız zaten externalNativeBuild tarafından oluşturulmuşsa en kolay seçenektir.

AGP olmayan derlemeler ndkport kullanabilir veya aşağıdaki adımları uygulayarak manuel paketleme gerçekleştirebilir: AAR'lerinin prefab/ alt dizinini oluşturmak için Prefab belgesini kullanmalıdır.

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 kod içermesidir JNI kitaplığı (bu, uygulamalar için de iyi bir öneridir). dahil olmak üzere tüm bağımlılıklar STL, uygulama kitaplığına statik olarak bağlı olmalıdır. Ayrıca, komut dosyası, ABI yüzeyini uygulamak için kullanılmalıdır. Örneğin, bir Java kitaplığının libfooimpl.so JNI kitaplığını içeren com.example.foo şunları kullanmalıdır: aşağıdaki sürüm komut dosyası:

LIBFOOIMPL {
global:
    JNI_OnLoad;
local:
    *;
};

Bu örnekte, JNI İpuçları'nda açıklandığı gibi JNI_OnLoad aracılığıyla registerNatives kullanılmaktadır minimum ABI yüzeyinin açığa çıkmasını ve kitaplık yükleme süresinin simge durumuna küçültülmüştür.