Bagikan melalui


Perangkat Multi-Core & Xamarin.Android

Android dapat berjalan pada beberapa arsitektur komputer yang berbeda. Dokumen ini membahas berbagai arsitektur CPU yang mungkin digunakan untuk aplikasi Xamarin.Android. Dokumen ini juga akan menjelaskan bagaimana aplikasi Android dimas untuk mendukung arsitektur CPU yang berbeda. Antarmuka Biner Aplikasi (ABI) akan diperkenalkan, dan panduan akan diberikan mengenai ABI mana yang akan digunakan dalam aplikasi Xamarin.Android.

Gambaran Umum

Android memungkinkan pembuatan "biner lemak", satu .apk file yang berisi kode mesin yang akan mendukung beberapa arsitektur CPU yang berbeda. Ini dicapai dengan mengaitkan setiap bagian kode mesin dengan Antarmuka Biner Aplikasi. ABI digunakan untuk mengontrol kode mesin mana yang akan berjalan pada perangkat keras tertentu. Misalnya, agar aplikasi Android berjalan pada perangkat x86, perlu menyertakan dukungan ABI x86 saat mengkompilasi aplikasi.

Secara khusus, setiap aplikasi Android akan mendukung setidaknya satu antarmuka biner aplikasi tersemat (EABI). EABI adalah konvensi khusus untuk program perangkat lunak yang disematkan. EABI yang khas akan menjelaskan hal-hal seperti:

  • Set instruksi CPU.

  • Endianness penyimpanan memori dan beban pada run time.

  • Format biner file objek dan pustaka program, serta jenis konten mana yang diizinkan atau didukung dalam file dan pustaka ini.

  • Berbagai konvensi yang digunakan untuk meneruskan data antara kode aplikasi dan sistem (misalnya: cara mendaftar dan/atau tumpukan digunakan ketika fungsi dipanggil, batasan penyelarasan, dll.)

  • Batasan perataan dan ukuran untuk jenis enum, struktur, bidang, dan array.

  • Daftar simbol fungsi yang tersedia untuk kode komputer Anda pada waktu proses, umumnya dari kumpulan pustaka yang sangat spesifik yang dipilih.

armeabi dan Thread Brankas ty

Antarmuka Biner Aplikasi akan dibahas secara rinci di bawah ini, tetapi penting untuk diingat bahwa runtime yang armeabi digunakan oleh Xamarin.Android tidak aman utas. Jika aplikasi yang memiliki armeabi dukungan disebarkan ke armeabi-v7a perangkat, banyak pengecualian aneh dan tidak dapat dijelaskan akan terjadi.

Karena bug di Android 4.0.0, 4.0.1, 4.0.2, dan 4.0.3, pustaka asli akan diambil dari armeabi direktori meskipun ada direktori yang ada armeabi-v7a dan perangkat adalah armeabi-v7a perangkat.

Catatan

Xamarin.Android akan memastikan bahwa .so ditambahkan ke APK dalam urutan yang benar. Bug ini seharusnya tidak menjadi masalah bagi pengguna Xamarin.Android.

Deskripsi ABI

Setiap ABI yang didukung oleh Android diidentifikasi dengan nama yang unik.

armeabi

Ini adalah nama EABI untuk CPU berbasis ARM yang mendukung setidaknya set instruksi ARMv5TE. Android mengikuti ABI ARM GNU/Linux little-endian. ABI ini tidak mendukung komputasi floating-point yang dibantu perangkat keras. Semua operasi FP dilakukan oleh fungsi pembantu perangkat lunak yang berasal dari pustaka statis kompilator libgcc.a . Perangkat SMP tidak didukung oleh armeabi.

Penting

Kode Xamarin.Android armeabi tidak aman dan tidak boleh digunakan pada perangkat multi-CPU armeabi-v7a (dijelaskan di bawah). Menggunakan armeabi kode pada perangkat inti armeabi-v7a tunggal aman.

armeabi-v7a

Ini adalah set instruksi CPU berbasis ARM lain yang memperluas EABI yang armeabi dijelaskan di atas. armeabi-v7a EABI memiliki dukungan untuk operasi floating-point perangkat keras dan beberapa perangkat CPU (SMP). Aplikasi yang menggunakan armeabi-v7a EABI dapat mengharapkan peningkatan performa yang substansial atas aplikasi yang menggunakan armeabi.

Catatan

armeabi-v7a kode mesin tidak akan berjalan pada perangkat ARMv5.

arm64-v8a

Ini adalah set instruksi 64-bit yang didasarkan pada arsitektur CPU ARMv8. Arsitektur ini digunakan dalam Nexus 9. Xamarin.Android 5.1 memperkenalkan dukungan untuk arsitektur ini (untuk informasi selengkapnya, lihat dukungan runtime 64-bit).

x86

Ini adalah nama ABI untuk CPU yang mendukung set instruksi yang umumnya bernama x86 atau IA-32. ABI ini sesuai dengan instruksi untuk set instruksi Pentium Pro, termasuk set instruksi MMX, SSE, SSE2, dan SSE3. Ini tidak termasuk ekstensi set instruksi IA-32 opsional lainnya seperti:

  • instruksi MOVBE.
  • Ekstensi SSE3 tambahan (SSSE3).
  • varian SSE4 apa pun.

Catatan

Google TV, meskipun berjalan di x86, tidak didukung oleh NDK Android.

x86_64

Ini adalah nama ABI untuk CPU yang mendukung set instruksi x86 64-bit (juga disebut sebagai x64 atau AMD64). Xamarin.Android 5.1 memperkenalkan dukungan untuk arsitektur ini (untuk informasi selengkapnya, lihat dukungan runtime 64-bit).

APK File Format

Paket Aplikasi Android adalah format file yang menyimpan semua kode, aset, sumber daya, dan sertifikat yang diperlukan untuk aplikasi Android. Ini adalah .zip file, tetapi menggunakan .apk ekstensi nama file. Saat diperluas, konten yang .apk dibuat oleh Xamarin.Android dapat dilihat pada cuplikan layar di bawah ini:

Contents of the .apk

Deskripsi singkat tentang konten .apk file:

  • AndroidManifest.xml – Ini adalah AndroidManifest.xml file, dalam format XML biner.

  • classes.dex – Ini berisi kode aplikasi, dikompilasi ke dalam dex format file yang digunakan oleh VM runtime Android.

  • resources.arsc – File ini berisi semua sumber daya yang telah dikommpilasikan sebelumnya untuk aplikasi.

  • lib – Direktori ini menyimpan kode yang dikompilasi untuk setiap ABI. Ini akan berisi satu subfolder untuk setiap ABI yang dijelaskan di bagian sebelumnya. Pada cuplikan layar di atas, yang bersangkutan .apk memiliki pustaka asli untuk dan armeabi-v7a untuk x86 .

  • META-INF – Direktori ini (jika ada) digunakan untuk menyimpan informasi penandatanganan, paket, dan data konfigurasi ekstensi.

  • res – Direktori ini menyimpan sumber daya yang tidak dikompilasi ke dalam resources.arsc .

Catatan

File libmonodroid.so adalah pustaka asli yang diperlukan oleh semua aplikasi Xamarin.Android.

Dukungan ABI Perangkat Android

Setiap perangkat Android mendukung eksekusi kode asli hingga dua ABI:

  • ABI "primer" - Ini sesuai dengan kode mesin yang digunakan dalam gambar sistem.

  • ABI "sekunder" - Ini adalah ABI opsional yang juga didukung oleh gambar sistem.

Misalnya, perangkat ARMv5TE yang khas hanya akan memiliki ABI armeabiutama , sementara perangkat ARMv7 akan menentukan ABI armeabi-v7a utama dan ABI sekunder dari armeabi. Perangkat x86 yang khas hanya akan menentukan ABI utama .x86

Penginstalan Android Native Library

Pada waktu penginstalan paket, pustaka asli dalam .apk diekstrak ke direktori pustaka asli aplikasi, biasanya /data/data/<package-name>/lib, dan setelahnya disebut sebagai $APP/lib.

Perilaku penginstalan pustaka asli Android bervariasi secara dramatis antar versi Android.

Menginstal Pustaka Asli: Pra-Android 4.0

Android sebelum 4.0 Ice Cream Sandwich hanya akan mengekstrak pustaka asli dari satu ABI dalam .apk. Aplikasi Android vintage ini pertama-tama akan mencoba mengekstrak semua pustaka asli untuk ABI utama, dan jika tidak ada pustaka seperti itu, Android kemudian akan mengekstrak semua pustaka asli untuk ABI sekunder. Tidak ada "penggabungan" yang dilakukan.

Misalnya, pertimbangkan situasi di mana aplikasi diinstal pada armeabi-v7a perangkat. .apk, yang mendukung armeabi dan armeabi-v7a, memiliki direktori dan file ABI lib berikut di dalamnya:

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

Setelah penginstalan, direktori pustaka asli akan berisi:

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

Dengan kata lain, tidak ada libone.so yang diinstal. Ini akan menyebabkan masalah, seperti libone.so yang tidak ada bagi aplikasi untuk dimuat pada waktu proses. Perilaku ini, meskipun tidak terduga, telah dicatat sebagai bug dan diklasifikasikan ulang sebagai "bekerja seperti yang dimaksudkan."

Akibatnya, ketika menargetkan versi Android sebelum 4.0, perlu untuk menyediakan semua pustaka asli untuk setiap ABI yang akan didukung aplikasi, yaitu, .apk harus berisi:

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

Menginstal Native Libraries: Android 4.0 – Android 4.0.3

Android 4.0 Ice Cream Sandwich mengubah logika ekstraksi. Ini akan menghitung semua pustaka asli, lihat apakah nama dasar file telah diekstraksi, dan jika kedua kondisi berikut terpenuhi, maka pustaka akan diekstraksi:

  • Ini belum diekstraksi.

  • ABI pustaka asli cocok dengan ABI primer atau sekunder target.

Memenuhi kondisi ini memungkinkan perilaku "penggabungan"; artinya, jika kita memiliki .apk dengan konten berikut:

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

Kemudian setelah penginstalan, direktori pustaka asli akan berisi:

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

Sayangnya, perilaku ini tergantung pada urutan, seperti yang dijelaskan dalam dokumen berikut - Masalah 24321: Galaxy Nexus 4.0.2 menggunakan kode asli armeabi ketika armeabi dan armeabi-v7a disertakan dalam apk.

Pustaka asli diproses "dalam urutan" (seperti yang tercantum oleh, misalnya, unzip), dan kecocokan pertama diekstraksi. .apk Karena berisi armeabi dan armeabi-v7a versi libtwo.so, dan armeabi tercantum terlebih dahulu, ini adalah armeabi versi yang diekstrak, bukanarmeabi-v7a versi:

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

Selain itu, bahkan jika ABI armeabi dan armeabi-v7a ditentukan (seperti yang dijelaskan di bawah ini di bagian Mendeklarasikan ABI yang Didukung), Xamarin.Android akan membuat elemen berikut di . csproj:

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

Akibatnya, armeabilibmonodroid.so akan ditemukan terlebih dahulu dalam .apk, danlibmonodroid.soarmeabiakan menjadi yang diekstraksi, meskipun armeabi-v7alibmonodroid.so ada dan dioptimalkan untuk target. Ini juga dapat mengakibatkan kesalahan run-time yang tidak aman, karena armeabi tidak aman SMP.

Menginstal Native Libraries: Android 4.0.4 dan yang lebih baru

Android 4.0.4 mengubah logika ekstraksi: ini akan menghitung semua pustaka asli, membaca nama dasar file, lalu mengekstrak versi ABI utama (jika ada), atau ABI sekunder (jika ada). Ini memungkinkan perilaku "penggabungan"; artinya, jika kita memiliki .apk dengan konten berikut:

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

Kemudian setelah penginstalan, direktori pustaka asli akan berisi:

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

Xamarin.Android dan ARI

Xamarin.Android mendukung arsitektur 64-bit berikut:

  • arm64-v8a
  • x86_64

Catatan

Mulai Agustus 2018, aplikasi baru akan diperlukan untuk menargetkan API level 26, dan mulai Agustus 2019 aplikasi akan diperlukan untuk menyediakan versi 64-bit selain versi 32-bit.

Xamarin.Android mendukung arsitektur 32-bit ini:

  • armeabi ^
  • armeabi-v7a
  • x86

Catatan

^ Pada Xamarin.Android 9.2, armeabi tidak lagi didukung.

Xamarin.Android saat ini tidak memberikan dukungan untuk mips.

Mendeklarasikan ABI yang Didukung

Secara default, Xamarin.Android akan default ke armeabi-v7a untuk Build rilis , dan ke armeabi-v7a dan x86 untuk build Debug . Dukungan untuk ARI yang berbeda dapat diatur melalui Opsi Proyek untuk proyek Xamarin.Android. Di Visual Studio, ini dapat diatur di halaman Opsi Android properti proyek, di bawah tab Tingkat Lanjut, seperti yang ditunjukkan pada cuplikan layar berikut:

Android Options Advanced properties

Di Visual Studio untuk Mac, arsitektur yang didukung dapat dipilih di halaman Android Build Opsi Proyek, di bawah tab Tingkat Lanjut, seperti yang ditunjukkan pada cuplikan layar berikut:

Android Build Supported ABIs

Ada beberapa situasi ketika mungkin perlu untuk menyatakan dukungan ABI tambahan seperti ketika:

  • Menyebarkan aplikasi ke x86 perangkat.

  • Menyebarkan aplikasi ke armeabi-v7a perangkat untuk memastikan keamanan utas.

Ringkasan

Dokumen ini membahas berbagai arsitektur CPU yang mungkin dijalankan oleh aplikasi Android. Ini memperkenalkan Antarmuka Biner Aplikasi dan bagaimana hal itu digunakan oleh Android untuk mendukung arsitektur CPU yang berbeda. Kemudian melanjutkan untuk membahas cara menentukan dukungan ABI dalam aplikasi Xamarin.Android dan menyoroti masalah yang muncul saat menggunakan aplikasi Xamarin.Android pada armeabi-v7a perangkat yang hanya ditujukan untuk armeabi.