Ç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:
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,
.apksöz konusu soru için hem hem de için yerel kitaplıklar vardırarmeabi-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-v8ax86_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-v7ax86
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:

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:
Şu durumlarda olduğu gibi ek ABı desteğini bildirmek için gerekli olabilecek bazı durumlar vardır:
Uygulamayı bir
x86cihaza 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 .

