Saya memiliki masalah dengan istilah bitcode tertanam.
Apa itu bitcode tertanam?
Kapan mengaktifkan, ENABLE_BITCODE
di Xcode baru?
Apa yang terjadi pada biner saat diaktifkan, ENABLE_BITCODE
di Xcode 7?
Bitcode mengacu pada jenis kode: "LLVM Bitcode" yang dikirim ke iTunes Connect. Ini memungkinkan Apple untuk menggunakan perhitungan tertentu untuk mengoptimalkan kembali aplikasi lebih lanjut (mis: kemungkinan ukuran yang dapat dieksekusi lebih kecil). Jika Apple perlu mengubah executable Anda maka mereka dapat melakukan ini tanpa bangunan baru diunggah.
Ini berbeda dari: Mengiris yang merupakan proses Apple mengoptimalkan aplikasi Anda untuk perangkat pengguna berdasarkan resolusi dan arsitektur perangkat. Mengiris tidak memerlukan Bitcode. (Mis: hanya menyertakan @ 2x gambar pada 5d)
App Thinning adalah kombinasi sumber daya slicing, bitcode, dan on-demand
Bitcode adalah representasi perantara dari program yang dikompilasi. Aplikasi yang Anda unggah ke iTunes Connect yang mengandung bitcode akan dikompilasi dan ditautkan di App Store. Termasuk bitcode akan memungkinkan Apple untuk mengoptimalkan kembali biner aplikasi Anda di masa depan tanpa perlu mengirimkan versi baru aplikasi Anda ke toko.
Apa itu bitcode tertanam?
Menurut dokumen :
Pembaruan: Frasa ini dalam "Fitur Baru di Xcode 7" membuat saya berpikir untuk waktu yang lama bahwa Bitcode diperlukan untuk Mengiris untuk mengurangi ukuran aplikasi:
Namun itu tidak benar, Bitcode dan Slicing bekerja secara independen: Slicing adalah tentang mengurangi ukuran aplikasi dan menghasilkan varian bundel aplikasi, dan Bitcode adalah tentang optimasi biner tertentu. Saya telah memverifikasi ini dengan memeriksa arsitektur yang disertakan dalam aplikasi non-bitcode yang dapat dieksekusi dan menemukan bahwa mereka hanya menyertakan yang diperlukan.
Bitcode memungkinkan komponen App Thinning lainnya yang disebut Slicing untuk menghasilkan varian bundel aplikasi dengan executable tertentu untuk arsitektur tertentu, misal varian iPhone 5S hanya akan mencakup executable arm64, iPad Mini armv7 dan sebagainya.Kapan harus mengaktifkan ENABLE_BITCODE dalam Xcode baru?
Apa yang terjadi pada biner ketika ENABLE_BITCODE diaktifkan di Xcode baru?
Dari referensi Xcode 7:
Berikut adalah beberapa tautan yang akan membantu Anda memahami Bitcode lebih dalam :
sumber
Karena pertanyaan persisnya adalah "apa yang memungkinkan bitcode lakukan", saya ingin memberikan beberapa detail teknis tipis yang telah saya temukan sejauh ini. Sebagian besar dari ini praktis tidak mungkin untuk mencari tahu dengan kepastian 100% sampai Apple merilis kode sumber untuk kompiler ini
Pertama, bitcode Apple tampaknya tidak sama dengan bytecode LLVM. Setidaknya, saya tidak bisa menemukan kemiripan di antara mereka. Tampaknya memiliki header berpemilik (selalu dimulai dengan "xar!") Dan mungkin beberapa sihir referensi waktu tautan yang mencegah duplikasi data. Jika Anda menulis string hardcoded, string ini hanya akan dimasukkan ke dalam data satu kali, bukan dua kali seperti yang diharapkan jika itu bytecode LLVM normal.
Kedua, bitcode tidak benar-benar dikirimkan dalam arsip biner sebagai arsitektur terpisah seperti yang diharapkan. Itu tidak dikirim dengan cara yang sama seperti mengatakan x86 dan ARM dimasukkan ke dalam satu biner (arsip FAT). Sebagai gantinya, mereka menggunakan bagian khusus dalam biner MachO khusus arsitektur bernama "__LLVM" yang dikirimkan dengan setiap arsitektur yang didukung (yaitu, diduplikasi). Saya berasumsi ini adalah kedatangan singkat dengan sistem kompiler mereka dan mungkin diperbaiki di masa depan untuk menghindari duplikasi.
Kode C (dikompilasi dengan
clang -fembed-bitcode hi.c -S -emit-llvm
):Output LLVM IR:
Array data yang ada di IR juga berubah tergantung pada pengoptimalan dan pengaturan pembuatan kode dentang lainnya. Saya sama sekali tidak tahu format apa atau apa ini.
EDIT:
Mengikuti petunjuk di Twitter, saya memutuskan untuk mengunjungi kembali ini dan mengkonfirmasinya. Saya mengikuti posting blog ini dan menggunakan alat ekstraktor bitcode-nya untuk mengeluarkan biner Arsip Apple dari executable MachO. Dan setelah mengekstraksi Apple Archive dengan utilitas xar, saya mendapatkan ini (dikonversi ke teks dengan llvm-dis tentu saja)
Satu-satunya perbedaan penting antara IR non-bitcode dan bitcode IR adalah bahwa nama file telah dilucuti menjadi hanya 1, 2, dll untuk setiap arsitektur.
Saya juga mengkonfirmasi bahwa bitcode yang tertanam dalam biner dihasilkan setelah optimisasi. Jika Anda mengkompilasi dengan -O3 dan mengekstrak bitcode, itu akan berbeda dari jika Anda mengkompilasi dengan -O0.
Dan hanya untuk mendapatkan kredit tambahan, saya juga mengonfirmasi bahwa Apple tidak mengirimkan bitcode ke perangkat ketika Anda mengunduh aplikasi iOS 9. Mereka menyertakan sejumlah bagian aneh lainnya yang saya tidak kenali seperti __LINKEDIT, tetapi mereka tidak menyertakan __LLVM .__ bundel, dan dengan demikian sepertinya tidak menyertakan bitcode dalam biner terakhir yang berjalan pada perangkat. Anehnya, Apple masih mengirimkan binari gemuk dengan kode 32 / 64bit yang terpisah ke perangkat iOS 8.
sumber
xar!
adalah format file arsip Apple.Pada dasarnya konsep ini agak mirip dengan java di mana kode byte dijalankan pada JVM yang berbeda dan dalam hal ini bitcode ditempatkan pada iTune store dan alih-alih memberikan kode perantara ke berbagai platform (perangkat), ia menyediakan kode kompilasi yang tidak perlu setiap mesin virtual untuk dijalankan.
Jadi kita perlu membuat bitcode sekali dan itu akan tersedia untuk perangkat yang ada atau yang akan datang. Sakit kepala Apple untuk mengkompilasi membuatnya kompatibel dengan setiap platform yang mereka miliki.
Pengembang tidak perlu melakukan perubahan dan mengirimkan aplikasi lagi untuk mendukung platform baru.
Mari kita ambil contoh iPhone 5s ketika apple memperkenalkan
x64
chip di dalamnya. Meskipunx86
aplikasi benar-benar kompatibel denganx64
arsitektur tetapi untuk sepenuhnya memanfaatkanx64
platform pengembang harus mengubah arsitektur atau beberapa kode. Setelah selesai, aplikasi diserahkan ke toko aplikasi untuk ditinjau.Jika konsep bitcode ini diluncurkan sebelumnya maka kami para pengembang tidak perlu melakukan perubahan apa pun untuk mendukung
x64
arsitektur bit.sumber
Memperbarui
Apple telah mengklarifikasi bahwa pengirisan terjadi terlepas dari mengaktifkan bitcode. Saya telah mengamati ini dalam praktiknya juga ketika aplikasi yang diaktifkan non-bitcode hanya akan diunduh sebagai arsitektur yang sesuai untuk perangkat target.
Asli
Lebih khusus :
Cara saya membaca ini, jika Anda mendukung bitcode, pengunduh aplikasi Anda hanya akan mendapatkan arsitektur yang dikompilasi yang diperlukan untuk perangkat mereka sendiri.
sumber