Çok çekirdekli cihazlar & Xamarin. Android

Android, çeşitli farklı bilgisayar mimarilerinde çalışabilir. Bu belgede, Xamarin. Android uygulaması için kullanılabilecek farklı CPU mimarileri açıklanmaktadır. Bu belge, Android uygulamalarının farklı CPU mimarilerini destekleyecek şekilde nasıl paketlendikleri de açıklanmaktadır. Uygulama Ikili arabirimi (ABı) tanıtılacaktır ve bir Xamarin. Android uygulamasında hangi ABR 'Nin kullanılacağı ile ilgili kılavuz sunulacaktır.

Genel Bakış

Android, .apk birden çok farklı CPU mimarilerini destekleyecek makine kodu içeren tek bir dosya olan "Fat ikili dosyaları" oluşturulmasına izin verir. Bu, her makine kodu parçasını bir uygulama Ikili arabirimiyleilişkilendirerek gerçekleştirilir. ABı, belirli bir donanım cihazında hangi makine kodunun çalıştırılacağını denetlemek için kullanılır. Örneğin, bir Android uygulamasının bir x86 cihazında çalışması için, uygulamayı derlerken x86 ABı desteğinin dahil olması gerekir.

Özellikle, her Android uygulaması, en az bir adet katıştırılmış uygulama ikili arabirimini (eabi) destekleyecektir. EABI, ekli yazılım programlarına özgü kurallardır. Tipik bir EABI, şöyle bir şey anlatmaktadır:

  • CPU yönerge kümesi.

  • Belleğin, çalışma zamanında mağazaların ve yüklerinin bitime sonucu.

  • Nesne dosyalarının ve program kitaplıklarının ikili biçimi ve bu dosya ve kitaplıklarda ne tür içeriklere izin verilir veya desteklenir.

  • Uygulama kodu ve sistem arasında veri geçirmek için kullanılan çeşitli kurallar (örneğin: işlevler çağrıldığında yazmaçların ve/veya yığının nasıl kullanıldığı, hizalama kısıtlamaları vb.)

  • Sabit listesi türleri, yapılar, alanlar ve diziler için hizalama ve boyut kısıtlamaları.

  • Çalışma zamanında, genellikle belirli bir seçili kitaplık kümesinden, makine kodunuzun kullanabildiği işlev sembolleri listesi.

armeabi ve Iş parçacığı güvenliği

Uygulama Ikili arabirimi aşağıda ayrıntılı olarak ele alınacaktır, ancak armeabi Xamarin. Android tarafından kullanılan çalışma zamanının armeabiolduğunu unutmamak önemlidir. Desteği olan bir uygulama armeabi cihaza dağıtılırsa armeabi-v7a birçok garip ve unexplainable özel durumu oluşur.

Android 4.0.0, 4.0.1, 4.0.2 ve 4.0.3 'deki bir hata nedeniyle, armeabiarmeabi-v7a mevcut bir dizin olsa ve cihaz bir cihaz olduğundan, Yerel Kitaplıklar dizinden alınacaktır armeabi-v7a .

Not

Xamarin. Android .so , APK 'ye doğru sırada eklendiğinden emin olur. Bu hata, Xamarin. Android kullanıcıları için bir sorun olmamalıdır.

ABı açıklamaları

Android tarafından desteklenen her ABı benzersiz bir ad ile tanımlanır.

armeabi

Bu, en az ARMv5TE yönerge kümesini destekleyen ARM tabanlı CPU 'Lar için EABI 'nin adıdır. Android, az endian ARM GNU/Linux ABı izler. Bu ABı, donanım yardımlı kayan nokta hesaplamaları desteklemez. Tüm FP işlemleri, derleyicinin statik kitaplığından gelen yazılım Yardımcısı işlevleri tarafından gerçekleştirilir libgcc.a . SMP cihazları tarafından desteklenmez armeabi .

Önemli

Xamarin. Android armeabi kodu iş parçacığı açısından güvenli değildir ve çok CPU armeabi-v7a cihazlarda kullanılmamalıdır (aşağıda açıklanmıştır). armeabiTek çekirdekli bir cihazda kod kullanılması armeabi-v7a güvenlidir.

armeabi-v7a

Bu, armeabi yukarıda açıklanan eabi 'yi genişleten başka BIR ARM tabanlı CPU yönerge kümesidir. armeabi-v7aEabi, donanım kayan nokta işlemleri ve birden çok CPU (SMP) cihazı için destek içerir. Eabi 'yi kullanan bir uygulama, armeabi-v7a tarafından kullanılan bir uygulama üzerinde önemli performans iyileştirmeleri bekleyebilir armeabi .

Not

armeabi-v7a makine kodu, ARMv5 cihazlarında çalıştırılmayacak.

arm64-v8a

Bu, ARMv8 CPU mimarisine dayalı olan 64 bitlik bir yönerge kümesidir. Bu mimari, Nexus 9' da kullanılır. Xamarin. Android 5,1 Bu mimari için destek sunmuştur (daha fazla bilgi için bkz. 64-bit çalışma zamanı desteği).

x86

Bu, genellikle x86 veya IA-32olarak adlandırılan yönerge kümesini destekleyen CPU 'lar için bir ABI adıdır. bu abı,, MMX, SSE, SSE2 ve SSE3 yönerge kümeleri de dahil olmak üzere Pentium Pro yönerge kümesi yönergelerine karşılık gelir. Aşağıdakiler gibi herhangi bir isteğe bağlı IA-32 yönerge kümesi uzantısı içermez:

  • MOVBE yönergesi.
  • Ek SSE3 uzantısı (SSSE3).
  • Tüm SSE4 türevleri.

Not

Google TV, x86 üzerinde çalışır, ancak Android 'nin NDK tarafından desteklenmez.

x86_64

Bu, 64 bit x86 yönerge kümesini ( x64 veya AMD64olarak da bilinir) destekleyen CPU 'lar için bir ABI adıdır. Xamarin. Android 5,1 Bu mimari için destek sunmuştur (daha fazla bilgi için bkz. 64-bit çalışma zamanı desteği).

APK dosya biçimi

Android uygulama paketi, Android uygulaması için gerekli tüm kodu, varlıkları, kaynakları ve sertifikaları tutan dosya biçimidir. Bu bir .zip dosyadır, ancak .apk dosya adı uzantısını kullanır. Genişletildiğinde, .apk Xamarin. Android tarafından oluşturulan bir içerik aşağıdaki ekran görüntüsünde görülebilir:

. Apk içeriği

Dosyanın içeriğini hızlı bir şekilde açıklama .apk :

  • AndroidManifest.xml : Bu dosya ikili XML biçiminde.

  • Classes. Dex – bu, Android çalışma zamanı sanal makinesi tarafından kullanılan dosya biçiminde derlenen uygulama kodunu içerir.

  • Resources. ARSC : Bu dosya, uygulamanın önceden derlenmiş tüm kaynaklarını içerir.

  • lib – bu dizin, her ABI için derlenen kodu barındırır. Bu, önceki bölümde açıklanan her bir ABı için bir alt klasör içerir. Yukarıdaki ekran görüntüsünde, .apk söz konusu soru için hem hem de için yerel kitaplıklar vardır armeabi-v7ax86 .

  • Meta-INF – bu dizin (varsa) imzalama bilgilerini, paketini ve uzantı yapılandırma verilerini depolamak için kullanılır.

  • res – bu dizin, içine derlenmemiş kaynakları barındırır .

Not

Bu dosya, libmonodroid.so Tüm Xamarin. Android uygulamaları için gerekli olan yerel kitaplıktır.

Android cihaz ABı desteği

Her bir Android cihazı, yerel kodun en fazla iki ABR 'yi yürütmeyi destekler:

  • "Birincil" ABI – bu, sistem görüntüsünde kullanılan makine koduna karşılık gelir.

  • "İkincil" ABI – bu, sistem görüntüsü tarafından da desteklenen isteğe bağlı bir ABI.

Örneğin, tipik bir ARMv5TE cihazı yalnızca birincil ABı olur armeabi , ancak bir ARMv7 cihaz BIRINCIL ABI armeabi-v7a ve IKINCIL bir ABI belirler armeabi . Tipik bir x86 cihazı yalnızca birincil ABı belirtebilir x86 .

Android yerel kitaplık yüklemesi

Paket yükleme süresi içinde, içindeki yerel kitaplıklar .apk uygulamanın yerel kitaplık dizinine ayıklanır, genellikle /data/data/<package-name>/lib ve daha sonra olarak adlandırılır $APP/lib .

Android 'in yerel kitaplık yükleme davranışı, Android sürümleri arasında önemli ölçüde farklılık gösterir.

Yerel kitaplıkları yükleme: Android öncesi 4,0

4,0 buz Kresından önce Android yalnızca içindeki tek BIR ABI yerel kitaplıklarını ayıklar . Bu Vina 'nın Android uygulamaları öncelikle birincil ABı tüm yerel kitaplıkları ayıklamayı dener ve böyle bir kitaplık yoksa, Android ikincil ABı için tüm yerel kitaplıkları ayıklar. "Birleştirme" işlemi yapılmaz.

Örneğin, bir uygulamanın bir cihaza yüklendiği bir durum düşünün armeabi-v7a . Hem hem de .apk, destekleyen, armeabiarmeabi-v7a içinde aşağıdaki ABI lib dizinlere ve dosyalara sahiptir:

lib/armeabi/libone.so
lib/armeabi/libtwo.so
lib/armeabi-v7a/libtwo.so

Yüklemeden sonra yerel Kitaplık dizini şunları içerir:

$APP/lib/libtwo.so # from the armeabi-v7a directory in the apk

Diğer bir deyişle, Hayır libone.so yüklü değildir. Bu, libone.so uygulamanın çalışma zamanında yüklenmesi için mevcut olmadığından, soruna neden olur. Beklenmeyen, bu davranış bir hata olarak günlüğe kaydedilir ve "istendiği gibi çalışıyor" olarak yeniden sınıflandırmıştır.

Sonuç olarak, 4,0 ' dan önceki Android sürümlerini hedeflerken, uygulamanın destekleyeceği her bir ABI için Tüm yerel kitaplıkların sağlanması gerekir, yani şunları içermelidir:

lib/armeabi/libone.so
lib/armeabi/libtwo.so
lib/armeabi-v7a/libone.so
lib/armeabi-v7a/libtwo.so

Yerel kitaplıkları yükleme: Android 4,0 – Android 4.0.3

Android 4,0 Ice krem, ayıklama mantığını değiştirir. Tüm yerel kitaplıkları numaralandırır, bkz. dosyanın baseName zaten ayıklanmışsa ve aşağıdaki koşulların her ikisi karşılanıyorsa, kitaplığın ayıklanabilmesi gerekir:

  • Zaten ayıklanmamıştır.

  • Yerel kitaplığın ABı, hedefin birincil veya ikincil ABı ile eşleşiyor.

Bu koşulları karşılamak "birleştirme" davranışına izin verir; diğer bir deyişle, .apk aşağıdaki içeriğe sahip olduysa:

lib/armeabi/libone.so
lib/armeabi/libtwo.so
lib/armeabi-v7a/libtwo.so

Yüklemeden sonra yerel Kitaplık dizini şunları içerir:

$APP/lib/libone.so
$APP/lib/libtwo.so

Ne yazık ki, bu davranış aşağıdaki belgede açıklandığı gibi sırasıyla sipariş bağımlıdır : 24321: Galaxy Nexus 4.0.2, APK 'ye hem armeabi hem de armeabi-V7A dahil edildiğinde armeabi Native Code kullanır.

Yerel Kitaplıklar "sırayla" işlenir (örneğin, unzip gibi) ve ilk eşleşme ayıklanır. Ve .apkarmeabi ' nin içerdiği ve armeabi-v7a sürümleri libtwo.so ilk olarak armeabi listelendiğinden, armeabi sürümü .apk , ayıklanmış olan sürümdür armeabi-v7a :

$APP/lib/libone.so # armeabi
$APP/lib/libtwo.so # armeabi, NOT armeabi-v7a!

Ayrıca, hem hem de her ikisi de belirtilmiş olsa da armeabiarmeabi-v7a ( armeabibölümünde açıklandığı gibi), Xamarin. Android içinde aşağıdaki öğeyi oluşturacaktır. csproj:

<AndroidSupportedAbis>armeabi,armeabi-v7a</AndroidSupportedAbis>

Sonuç olarak,, armeabilibmonodroid.so içinde ilk olarak bulunur .apk ve armeabilibmonodroid.soarmeabi-v7alibmonodroid.so hedef için mevcut ve en iyi duruma getirilmiş olmasına rağmen ayıklanacaktır. Bu aynı zamanda SMP güvenli olmadığı için, daha da belirsiz çalışma zamanı hatalarına neden olabilir armeabi .

Yerel kitaplıkları yükleme: Android 4.0.4 ve üzeri

Android 4.0.4, ayıklama mantığını değiştirir: tüm yerel kitaplıkları numaralandırır, dosyanın baseName ' ını okur, sonra birincil ABı sürümünü (varsa) veya ikincil ABı (varsa) ayıklar. Bu, "birleştirme" davranışına izin verir; diğer bir deyişle, .apk aşağıdaki içeriğe sahip olduysa:

lib/armeabi/libone.so
lib/armeabi/libtwo.so
lib/armeabi-v7a/libtwo.so

Yüklemeden sonra yerel Kitaplık dizini şunları içerir:

$APP/lib/libone.so # from armeabi
$APP/lib/libtwo.so # from armeabi-v7a

Xamarin. Android ve Absıs

Xamarin. Android aşağıdaki 64 bit mimarilerini destekler:

  • arm64-v8a
  • x86_64

Not

2018 Ağustos 'tan yeni uygulamaların API düzeyi 26 ' i hedeflemesi ve Ağustos 2019 ' den itibaren, 32-bit sürümüne ek olarak 64 bit sürümler sağlaması gerekir.

Xamarin. Android Bu 32 bit mimarilerini destekler:

  • armeabi ^
  • armeabi-v7a
  • x86

Not

^^itibariyle, armeabi artık desteklenmemektedir.

Xamarin. Android şu anda için destek sağlamaz mips .

Desteklenen ABı ' i bildirme

Varsayılan olarak, Xamarin. Android varsayılan olarak armeabi-v7aarmeabi-v7a yapıları için, armeabi-v7a ve için ve x86armeabi-v7a derlemeleri için varsayılan olarak kullanılır. farklı abr 'ler için destek bir Xamarin. Android projesi Project seçenekleri aracılığıyla ayarlanabilir. Visual Studio, bu, aşağıdaki ekran görüntüsünde gösterildiği gibi, gelişmiş sekmesinin altındaki proje özelliklerininAndroid seçenekleri sayfasında ayarlanabilir:

Android seçenekleri Gelişmiş Özellikler

Mac için Visual Studio, aşağıdaki ekran görüntüsünde gösterildiği gibi, gelişmiş sekmesinin altındaki Project seçeneklerininAndroid derleme sayfasında desteklenen mimariler seçilebilir:

Android derlemesi desteklenen ABR 'ler

Şu durumlarda olduğu gibi ek ABı desteğini bildirmek için gerekli olabilecek bazı durumlar vardır:

  • Uygulamayı bir x86 cihaza dağıtma.

  • armeabi-v7aİş parçacığı güvenliğini sağlamak için uygulamayı bir cihaza dağıtma.

Özet

Bu belge, bir Android uygulamasının üzerinde çalışacağı farklı CPU mimarilerini ele alınmaktadır. Uygulama Ikili arabirimini ve farklı CPU mimarilerini desteklemek için Android tarafından nasıl kullanıldığını ortaya sunmuştur. Daha sonra Xamarin. Android uygulamasında ABı desteğinin nasıl belirtildikleri hakkında tartışmak ve yalnızca için tasarlanan bir cihazda Xamarin. Android Uygulamaları kullanılırken ortaya çıkan sorunları vurguladım armeabi-v7aarmeabi .