Skip to content

Most visited

Recently visited

navigation

Manajemen ABI

Handset Android yang berbeda menggunakan CPU yang berbeda pula, yang pada gilirannya mendukung set petunjuk yang berbeda pula. Setiap kombinasi CPU dan set petunjuk memiliki Application Binary Interface, atau ABI sendiri. ABI mendefinisikan, dengan akurasi sangat bagus, bagaimana seharusnya kode mesin aplikasi berinteraksi dengan sistem pada waktu proses. Anda harus menetapkan ABI untuk setiap arsitektur CPU yang ingin digunakan bersama aplikasi Anda.

Umumnya ABI menyertakan informasi berikut:

  • Set instruksi CPU yang harus digunakan oleh kode mesin.
  • Tingkat endian memori menyimpan dan memuat pada waktu proses.
  • Format biner yang dapat dieksekusi, misalnya program dan pustaka bersama, dan tipe materi yang didukung.
  • Beragam konvensi untuk meneruskan data antara kode Anda dan sistem. Konvensi ini berisi batasan penyejajaran, serta bagaimana sistem menggunakan tumpukan dan register saat memanggil fungsi.
  • Daftar simbol fungsi yang tersedia untuk kode mesin Anda pada waktu proses, umumnya dari set pustaka yang sangat spesifik.

Laman ini menyebutkan ABI yang didukung NDK, dan menyediakan informasi tentang cara kerja setiap ABI.

ABI yang Didukung

Setiap ABI mendukung satu atau beberapa set petunjuk. Tabel 1 menyediakan ringkasani set petunjuk yang didukung setiap ABI.

Tabel 1. ABI dan set petunjuk yang didukungnya.

ABI Set Petunjuk yang Didukung Catatan
armeabi
  • ARMV5TE dan yang lebih baru
  • Thumb-1
  • Bukan hard-float.
    armeabi-v7a
  • armeabi
  • Thumb-2
  • VFPv3-D16
  • Lainnya, opsional
  • Tidak kompatibel dengan perangkat ARMv5 dan v6.
    arm64-v8a
  • AArch-64
  • x86
  • x86 (IA-32)
  • MMX
  • SSE/2/3
  • SSSE3
  • Tidak ada dukungan untuk MOVBE atau SSE4.
    x86_64
  • x86-64
  • MMX
  • SSE/2/3
  • SSSE3
  • SSE4.1, 4.2
  • POPCNT
  • mips
  • MIPS32r1 dan yang lebih baru
  • Menggunakan hard-float, dan beranggapan rasio jam CPU:FPU sebesar 2:1 demi kompatibilitas maksimum. Tidak menyediakan micromips maupun MIPS16.
    mips64
  • MIPS64r6
  • Informasi lebih detail tentang setiap ABI muncul di bawah ini.

    armeabi

    ABI ini adalah untuk CPU berbasis ARM yang setidaknya mendukung set petunjuk ARMv5TE. Lihat dokumentasi berikut untuk detail selengkapnya:

    Standar AAPCS mendefinisikan EABI sebagai keluarga ABI yang serupa namun tidak sama. Selain itu, Android mengikuti little-endian ARM GNU/Linux ABI.

    ABI ini tidak mendukung komputasi titik-mengambang yang dibantu perangkat keras. Sebagai gantinya, semua operasi titik-mengambang menggunakan fungsi helper perangkat lunak dari pustaka statis libgcc.a compiler.

    armeabi ABI mendukung set petunjuk Thumb (alias Thumb-1) ARM. NDK menghasilkan kode Thumb secara default kecuali jika Anda menetapkan perilaku yang berbeda menggunakan variabel LOCAL_ARM_MODE dalam file Android.mk Anda.

    armeabi-v7a

    ABI ini memperluas armeabi untuk menyertakan sejumlah ekstensi set petunjuk CPU. Ekstensi petunjuk yang didukung ABI spesifik Android ini adalah:

    • Ekstensi set petunjuk Thumb-2, yang memberikan kinerja yang sebanding dengan petunjuk ARM 32-bit dengan kekompakan serupa dengan Thumb-1.
    • Petunjuk FPU perangkat keras VFP. Lebih spesifik, VFPv3-D16, yang menyertakan 16 register khusus titik-mengambang 64-bit, sebagai tambahan untuk 16 register 32-bit dari inti ARM.

    Ekstensi lainnya yang dijelaskan spesifikasi v7-a ARM, termasuk Advanced SIMD (alias NEON), VFPv3-D32, dan ThumbEE, bersifat opsional pada ABI ini. Karena kehadirannya tidak dijamin, sistem harus memeriksa pada waktu proses apakah ekstensi tersedia. Jika tidak ada, Anda harus menggunakan jalur kode alternatif. Pemeriksaan ini serupa dengan yang biasanya dilakukan sistem untuk memeriksa atau menggunakan set petunjuk MMX, SSE2, dan set petunjuk khusus lainnya di CPU x86.

    Untuk informasi tentang cara melakukan pemeriksaan waktu proses ini, lihat Pustaka cpufeatures. Juga, untuk informasi tentang dukungan NDK untuk membangun kode mesin bagi NEON, lihat Dukungan NEON.

    ABI armeabi-v7a menggunakan switch -mfloat-abi=softfp untuk memberlakukan aturan bahwa compiler harus meneruskan semua nilai ganda dalam pasangan register inti selama panggilan fungsi, sebagai ganti register titik-mengambang yang dikhususkan. Sistem bisa melakukan semua komputasi internal menggunakan register titik-mengambang. Hal itu akan sangat mempercepat komputasi.

    arm64-v8a

    ABI ini adalah untuk CPU berbasis ARMv8 yang mendukung AArch64. Juga menyertakan set petunjuk NEON dan VFPv4.

    Untuk informasi selengkapnya, lihat ARMv8 Technology Preview, dan hubungi ARM untuk detail lebih lanjut.

    x86

    ABI ini adalah untuk CPU yang mendukung set petunjuk yang biasanya disebut dengan "x86" atau "IA-32". Karakteristik ABI ini antara lain:

    • Petunjuk biasanya dihasilkan oleh GCC dengan flag compiler misalnya seperti berikut ini:
      -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32
      

      Semua flag ini menargetkan set petunjuk Pentium Pro, bersama ekstensi set petunjuk MMX, SSE, SSE2, SSE3, dan SSSE3. Kode yang dihasilkan adalah optimalisasi yang diseimbangkan ke semua CPU teratas Intel 32-bit.

      Untuk informasi selengkapnya mengenai flag compiler, terutama yang berkaitan dengan optimalisasi kinerja, lihat Petunjuk kinerja GCC x86.

    • Gunakan konvensi pemanggilan x86 32-bit Linux standar, sebagai lawan dari konvensi untuk SVR. Untuk informasi selengkapnya, lihat bagian 6, "Penggunaan Register", pada Konvensi pemanggilan untuk compiler C++ dan sistem operasi yang berbeda.

    ABI tidak menyertakan ekstensi set petunjuk IA-32 opsional lainnya, misalnya:

    • MOVBE
    • Semua varian SSE4.

    Anda tetap bisa menggunakan semua ekstensi ini, asal menggunakan pendeteksian fitur waktu proses untuk mengaktifkannya, dan menyediakan fallback bagi perangkat yang tidak mendukungnya.

    Toolchain NDK mengasumsikan penyelarasan tumpukan 16-byte sebelum panggilan fungsi. Alat dan opsi default akan memberlakukan aturan ini. Jika Anda sedang menulis kode assembly, Anda harus memastikan menjaga keselarasan tumpukan, dan memastikan bahwa compiler lain juga mematuhi aturan ini.

    Lihat dokumen berikut untuk detail selengkapnya:

    x86_64

    ABI ini adalah untuk CPU yang mendukung set petunjuk yang biasanya disebut dengan "x86-64". ABI ini mendukung petunjuk yang biasanya dihasilkan GCC dengan flag compiler berikut:

    -march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel
    

    Semua flag ini menargetkan set petunjuk x86-64, sesuai dengan dokumentasi GCC, bersama ekstensi set petunjuk MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, dan POPCNT. Kode yang dihasilkan adalah optimalisasi yang diseimbangkan ke seluruh CPU 64-bit Intel teratas.

    Untuk informasi selengkapnya mengenai flag compiler, terutama yang berkaitan dengan optimalisasi kinerja, lihat Kinerja GCC x86.

    ABI ini tidak menyertakan ekstensi set petunjuk x86-64 opsional lainnya, misalnya:

    • MOVBE
    • SHA
    • AVX
    • AVX2

    Anda tetap bisa menggunakan semua ekstensi ini, asal menggunakan pendeteksian fitur waktu proses untuk mengaktifkannya, dan menyediakan fallback bagi perangkat yang tidak mendukungnya.

    Lihat dokumen berikut untuk detail selengkapnya:

    mips

    ABI ini adalah untuk CPU berbasis MIPS yang setidaknya mendukung set petunjuk MIPS32r1. ABI ini menyertakan fitur berikut:

    • MIPS32 revisi 1 ISA
    • Little-endian
    • O32
    • Hard-float
    • Tidak ada ekstensi aplikasi spesifik DSP

    Untuk informasi selengkapnya, lihat dokumentasi berikut:

    Untuk detail yang lebih spesifik, lihat Arsitektur MIPS32. Jawaban untuk pertanyaan umum dalam FAQ MIPS.

    mips64

    ABI ini untuk MIPS64 R6. Untuk informasi selengkapnya, lihat Arsitektur MIPS64.

    Menghasilkan Kode untuk ABI Tertentu

    Secara default, NDK menghasilkan kode mesin untuk armeabi ABI. Anda bisa menghasilkan kode mesin yang kompatibel dengan ARMv7, sebagai gantinya, dengan menambahkan baris berikut ke file Application.mk.

    APP_ABI := armeabi-v7a
    

    Untuk membangun kode mesin bagi dua atau beberapa ABI yang berbeda, gunakan spasi sebagai pemisah. Misalnya :

    APP_ABI := armeabi armeabi-v7a
    

    Setelan ini memberi tahu NDK untuk membangun dua versi kode mesin: masing-masing satu untuk ABI yang dicantumkan pada baris ini. Untuk informasi selengkapnya mengenai nilai yang bisa Anda tetapkan untuk variabel APP_ABI, lihat Android.mk.

    Bila Anda membangun beberapa versi kode mesin, sistem pembangunan akan menyalin pustaka ke jalur proyek aplikasi Anda, dan terakhir memaketkannya ke dalam APK, sehingga membuat sebuah biner gemuk. Biner gemuk lebih besar dari biner yang hanya berisi kode mesin untuk sistem tunggal; konsekuensinya adalah menghasilkan kompatibilitas lebih luas, namun mengakibatkan APK jadi lebih besar.

    Pada waktu pemasangan, Package Manager akan membuka kode mesin yang paling sesuai dengan perangkat target saja. Untuk detailnya, lihat Ekstraksi otomatis kode asli pada waktu pemasangan.

    Manajemen ABI pada Platform Android

    Bagian ini menyediakan detail tentang cara platform Android mengelola kode asli dalam APK.

    Kode asli dalam paket aplikasi

    Baik Play Store maupun Package Manager berharap menemukan pustaka yang dihasilkan NDK pada jalur file di dalam APK yang cocok dengan pola berikut:

    /lib/<abi>/lib<name>.so
    

    Di sini, <abi> adalah salah satu nama ABI yang dicantumkan pada ABI yang Didukung, dan <name> adalah nama pustaka yang Anda definisikan untuk variabel LOCAL_MODULE dalam file Android.mk. Karena file APK cuma file zip, maka merupakan hal sepele membukanya dan memastikannya berada di pustaka asli bersama.

    Jika sistem tidak menemukan pustaka bersama asli di tempat ia diharapkan berada, maka ia tidak bisa digunakan. Dalam hal demikian, aplikasi itu sendiri harus menyalin pustaka berkali-kali, kemudian melakukan dlopen().

    Di biner gemuk, setiap pustaka berada pada direktori yang namanya sama dengan ABI yang bersangkutan. Misalnya, sebuah biner gemuk dapat berisi:

    /lib/armeabi/libfoo.so
    /lib/armeabi-v7a/libfoo.so
    /lib/arm64-v8a/libfoo.so
    /lib/x86/libfoo.so
    /lib/x86_64/libfoo.so
    /lib/mips/libfoo.so
    /lib/mips64/libfoo.so
    

    Catatan: Perangkat Android berbasis ARMv7 yang menjalankan versi 4.0.3 atau sebelumnya akan memasang pustaka asli dari direktori armeabi sebagai ganti direktori armeabi-v7a jika kedua direktori ada. Ini karena /lib/armeabi/ mengikuti /lib/armeabi-v7a/ di APK. Masalah ini telah diperbaiki mulai versi 4.0.4.

    Dukungan ABI Platform Android

    Sistem Android mengetahui pada waktu proses ABI mana yang didukungnya, karena properti sistem pembangunan spesifik akan menunjukkan:

    • ABI utama untuk perangkat, sesuai dengan kode mesin yang digunakan dalam citra sistem itu sendiri.
    • ABI sekunder, opsional, sesuai dengan ABI lain yang juga didukung citra sistem.

    Mekanisme ini memastikan bahwa sistem akan mengekstrak kode mesin terbaik dari paket pada waktu pemasangan.

    Untuk mendapatkan kinerja terbaik, Anda harus mengompilasi langsung untuk ABI utama. Misalnya, perangkat berbasis ARMv5TE umumnya hanya akan mendefinisikan ABI utama: armeabi. Sebaliknya, perangkat berbasis ARMv7 umumnya akan mendefinisikan ABI utama sebagai armeabi-v7a dan ABI sekunder sebagai armeabi, karena ia bisa menjalankan biner asli aplikasi yang dihasilkan untuk masing-masing perangkat.

    Banyak perangkat keras berbasis x86 yang juga bisa menjalankan biner NDK armeabi-v7a dan armeabi. Untuk perangkat tersebut, ABI utama akan menjadi x86, dan yang kedua, armeabi-v7a.

    Perangkat berbasis MIPS umumnya hanya mendefinisikan ABI utama: mips.

    Ekstraksi otomatis kode asli pada waktu pemasangan

    Saat memasang aplikasi, layanan Package Manager akan memindai APK, dan mencari pustaka bersama yang berbentuk:

    lib/<primary-abi>/lib<name>.so
    

    Jika tidak ada yang ditemukan, dan Anda telah mendefinisikan ABI sekunder, layanan tersebut akan memindai pustaka bersama yang berbentuk:

    lib/<secondary-abi>/lib<name>.so
    

    Bila menemukan pustaka yang dicarinya, Package Manager akan menyalinnya ke /lib/lib<name>.so, pada direktori data aplikasi (data/data/<package_name>/lib/).

    Jika sama sekali tidak ada file objek bersama, aplikasi akan membangun dan memasang, namun akan mogok pada waktu proses.

    This site uses cookies to store your preferences for site-specific language and display options.

    Get the latest Android developer news and tips that will help you find success on Google Play.

    * Required Fields

    Hooray!

    Follow Google Developers on WeChat

    Browse this site in ?

    You requested a page in , but your language preference for this site is .

    Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

    This class requires API level or higher

    This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

    For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

    Take a short survey?
    Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)