Dampak opsi pembuatan Xcode “Aktifkan bitcode” Ya / Tidak

239

Kemarin saya mengenali satu ton peringatan terkait parse.com library:

URGENT: semua bitcode akan dihapus karena '[path] /Parse.framework/Parse (PFAnalytics.o)' dibuat tanpa bitcode. Anda harus membangunnya kembali dengan diaktifkan bitcode (pengaturan Xcode ENABLE_BITCODE), dapatkan pustaka yang diperbarui dari vendor, atau nonaktifkan bitcode untuk target ini. Catatan: Ini akan menjadi kesalahan di masa mendatang.

Saya menyadari fakta bahwa saya dapat menghapus peringatan itu dengan jawaban ini, tetapi sekarang saya bertanya-tanya apakah itu akan memiliki dampak negatif sehubungan dengan pengajuan AppStore dan / atau kinerja aktual aplikasi saya.

Xcode memberi tahu Anda tentang bitcode

Mengaktifkan pengaturan ini menunjukkan bahwa target atau proyek harus menghasilkan bitcode selama kompilasi untuk platform dan arsitektur yang mendukungnya. Untuk pembuatan Arsip, bitcode akan dibuat dalam biner yang ditautkan untuk dikirim ke app store. Untuk bangunan lain, kompiler dan tautan akan memeriksa apakah kode tersebut sesuai dengan persyaratan untuk pembuatan bitcode, tetapi tidak akan menghasilkan bitcode yang sebenarnya. [ENABLE_BITCODE]

Tetapi saya tidak mendapatkan informasi yang benar-benar berguna dari teks ini.

  • Dapatkah saya menggunakan jawaban tertaut untuk menghindari masalah ini tanpa dampak negatif dan tanpa kompromi pengajuan AppStore di masa depan?
  • Apa yang ENABLE_BITCODEsebenarnya dilakukan, apakah itu akan menjadi persyaratan non-opsional di masa depan?
  • Apakah ada dampak kinerja jika saya mengaktifkan / menonaktifkannya?
luk2302
sumber

Jawaban:

399
  • Apa yang sebenarnya dilakukan ENABLE_BITCODE, apakah itu akan menjadi persyaratan non-opsional di masa mendatang?

Saya tidak yakin pada level apa Anda mencari jawaban, jadi mari kita melakukan perjalanan kecil. Beberapa di antaranya mungkin sudah Anda ketahui.

Ketika Anda membangun proyek Anda, Xcode meminta clangtarget Objective-C dan swift/ swiftcuntuk target Swift. Kedua kompiler ini mengkompilasi aplikasi ke representasi perantara (IR), salah satu IR ini adalah bitcode. Dari IR ini, sebuah program bernama LLVM mengambil alih dan menciptakan binari yang diperlukan untuk mode x86 32 dan 64 bit (untuk simulator) dan arm6 / arm7 / arm7s / arm64 (untuk perangkat). Biasanya, semua binari yang berbeda ini disatukan dalam satu file yang disebut fat binary .

Opsi ENABLE_BITCODE memotong langkah terakhir ini. Ini menciptakan versi aplikasi dengan binary bitcode IR. Ini memiliki sejumlah fitur bagus, tetapi satu kelemahan besar: tidak dapat berjalan di mana pun. Untuk mendapatkan aplikasi dengan binary bitcode untuk dijalankan, bitcode perlu dikompilasi ulang ( mungkin dirakit atau ditranskode ... Saya tidak yakin dengan kata kerja yang benar ) ke dalam biner x86 atau ARM.

Ketika aplikasi bitcode dikirimkan ke App Store, Apple akan melakukan langkah terakhir ini dan membuat binari yang sudah jadi.

Saat ini, aplikasi bitcode adalah opsional, tetapi sejarah telah menunjukkan Apple mengubah hal-hal opsional menjadi persyaratan (seperti dukungan 64 bit). Ini biasanya memakan waktu beberapa tahun, jadi pengembang pihak ketiga (seperti Parse) punya waktu untuk memperbarui.

  • dapatkah saya menggunakan metode di atas tanpa dampak negatif dan tanpa kompromi pengajuan appstore di masa depan?

Ya, Anda dapat mematikan ENABLE_BITCODE dan semuanya akan berfungsi seperti sebelumnya. Sampai Apple membuat aplikasi bitcode sebagai persyaratan untuk App Store, Anda akan baik-baik saja.

  • Apakah ada dampak kinerja jika saya mengaktifkan / menonaktifkannya?

Tidak akan pernah ada dampak kinerja negatif untuk mengaktifkannya, tetapi distribusi internal aplikasi untuk pengujian mungkin menjadi lebih rumit.

Adapun dampak positif ... yah itu rumit.

Untuk distribusi di App Store, Apple akan membuat versi terpisah dari aplikasi Anda untuk setiap arsitektur mesin (arm6 / arm7 / arm7s / arm64) alih-alih satu aplikasi dengan biner yang gemuk. Ini berarti aplikasi yang diinstal pada perangkat iOS akan lebih kecil.

Selain itu, ketika bitcode dikompilasi ulang ( mungkin dirakit atau ditranskode ... sekali lagi, saya tidak yakin dengan kata kerja yang benar ), itu dioptimalkan. LLVM selalu berupaya menciptakan optimalisasi baru yang lebih baik. Secara teori, App Store dapat membuat ulang versi aplikasi yang terpisah di App Store dengan setiap rilis baru LLVM, sehingga aplikasi Anda dapat dioptimalkan kembali dengan teknologi LLVM terbaru.

Jeffery Thomas
sumber
19
"Apple akan membuat versi terpisah dari aplikasi Anda untuk setiap arsitektur mesin (arm6 / arm7 / arm7s / arm64) alih-alih satu aplikasi dengan biner gemuk. Ini berarti aplikasi yang diinstal pada perangkat iOS akan lebih kecil." Itulah yang dilakukan Slicing. Ini tidak terkait dengan Bitcode.
user102008
10
"Opsi ENABLE_BITCODE memotong langkah terakhir ini." Itu tidak memotong langkah apa pun. Semua binari arsitektur masih diproduksi. Informasi bitcode PLUS kemudian ditambahkan untuk arsitektur SETIAP. Lihat stackoverflow.com/a/31030741/102008
user102008
6
Lihat developer.apple.com/library/prerelease/watchos/documentation/... "Mengiris adalah proses membuat dan mengirim varian bundel aplikasi untuk perangkat target yang berbeda. Varian hanya berisi arsitektur yang dapat dieksekusi dan sumber daya yang diperlukan untuk target. alat."
user102008
7
Ini bukan pernyataan yang benar bahwa mengaktifkan Bitcode akan membuat aplikasi yang diinstal pada perangkat lebih kecil dibandingkan dengan ketika Bitcode dinonaktifkan. Tidak ada yang mengatakan itu.
user102008
7
@ onmyway133 Tidak semua vendor menyediakan sumber. Jika semua yang disediakan vendor adalah lib statis dan file header (atau Kerangka), maka vendor harus meminta barang-barang mereka dikompilasi dengan bitcode diaktifkan.
Jeffery Thomas
65

Pastikan untuk memilih "Semua" untuk menemukan pengaturan aktifkan pembuatan bitcode:

Bangun pengaturan

Gamma-Point
sumber
35

Bitcode adalah fitur baru iOS 9

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.

Catatan: Untuk aplikasi iOS, bitcode adalah default, tetapi opsional. Jika Anda memberikan bitcode, semua aplikasi dan kerangka kerja dalam bundel aplikasi harus menyertakan bitcode. Untuk aplikasi watchOS, bitcode diperlukan

Jadi, Anda harus menonaktifkan bitcode sampai semua kerangka kerja aplikasi Anda mengaktifkan bitcode.

agy
sumber
'Optimalkan ulang biner aplikasi Anda di masa mendatang' - dapatkah Anda menjelaskan lebih banyak?
genaks
Di sini dikatakan bahwa: "Bitcode adalah fitur baru iOS 9" dan bahwa "[...] Untuk aplikasi watchOS, bitcode diperlukan [...]". Jadi, bagaimana jika saya ingin membuat aplikasi WatchOS di iOS 8?
superpuccio
33

Bitcode membuat pelaporan kerusakan lebih sulit . Berikut adalah kutipan dari HockeyApp (yang juga berlaku untuk solusi pelaporan kerusakan lainnya ):

Saat mengunggah aplikasi ke App Store dan membiarkan kotak centang "Bitcode" diaktifkan, Apple akan menggunakan Bitcode build itu dan mengkompilasi ulang pada akhirnya sebelum mendistribusikannya ke perangkat. Ini akan menghasilkan biner mendapatkan UUID baru dan ada opsi untuk mengunduh dSYM yang sesuai melalui Xcode.

Catatan: jawabannya diedit pada Jan 2016 untuk mencerminkan perubahan terbaru

Alexander Vasenin
sumber
2
Antara September dan Desember, ini berhasil diperbaiki melalui opsi ekspor Xcode Organizer baru (lihat pembaruan dalam HA howto yang dikutip) dan rusak lagi (lihat pertanyaan HA saya yang dipecahkan )
Pavel Zdenek
13

@ vj9 thx. Saya memperbarui ke xcode 7. Ini menunjukkan kepada saya kesalahan yang sama. Bangun dengan baik setelah set "TIDAK"

masukkan deskripsi gambar di sini

atur "TIDAK" itu bekerja dengan baik.

masukkan deskripsi gambar di sini

zszen
sumber
1
@Strtronic Jika Anda ingin memilih YA. Anda perlu memeriksa semua kerangka kerja ketiga Anda mendukung ini.
zszen
Target Anda minimum versi iOS yang didukung harus iOS 6 atau lebih tinggi.
shallowThought
9

Di sini Anda dapat menemukan semua solusi mengenai Bitcode

Sesuai Apple Doc

Bitcode adalah representasi perantara dari program yang dikompilasi. Aplikasi yang Anda unggah ke iTunes Connect yang mengandung bitcode akan dikompilasi dan ditautkan di toko. Termasuk bitcode akan memungkinkan Apple untuk mengoptimalkan kembali biner aplikasi Anda di masa depan tanpa perlu mengirimkan versi baru aplikasi Anda ke toko.

Xcode menyembunyikan simbol yang dihasilkan selama waktu pembuatan secara default, sehingga tidak dapat dibaca oleh Apple. Hanya jika Anda memilih untuk memasukkan simbol saat mengunggah aplikasi Anda ke iTunes Connect, simbol tersebut akan dikirim ke Apple. Anda harus menyertakan simbol untuk menerima laporan kerusakan dari Apple.

Catatan: Untuk aplikasi iOS, bitcode adalah default, tetapi opsional. Untuk aplikasi watchOS dan tvOS, bitcode diperlukan. Jika Anda memberikan bitcode, semua aplikasi dan kerangka kerja dalam bundel aplikasi (semua target dalam proyek) harus menyertakan bitcode. Setelah Anda mendistribusikan aplikasi menggunakan iTunes Connect, Anda dapat mengunduh file dSYMs untuk build, dijelaskan dalam Melihat dan Mengimpor Gangguan di Jendela Perangkat

Peluncuran awal Apple dari bitcode dan layanan penipisan aplikasi ditunda, karena masalah dalam meningkatkan dari satu jenis perangkat keras ke jenis perangkat keras yang berbeda tidak mengembalikan versi binari yang tepat. Masalah ini kemudian diperbaiki dengan iOS 9.0.2 dan fitur diaktifkan kembali.

Bitcode selalu menjadi bagian dari tahap kompilasi dan optimisasi LLVM, tetapi dengan memindahkan logika back-end ke server Apple, Bitcode memindahkan fase optimisasi dan merakit dari waktu kompilasi pengembang ke penyebaran App Store. Ini membuka potensi optimisasi ulang di masa depan atau terjemahan ulang untuk mendukung prosesor yang lebih baru dan lebih cepat di masa depan. Penerapan bitcode diperlukan untuk deploments watchOS dan tvOS, dan dapat diaktifkan secara kondisional untuk penyebaran iOS yang ada dengan opsi "Aktifkan Bitcode" di pengaturan proyek. Ini akan menambahkan flag-embed-bitcode-marker untuk debug builds, dan embed-bitcode untuk build arsip / perangkat. Ini dapat diteruskan ke kompiler Swift dengan -embed-bitcode atau dengan menggunakan dentang dengan -fembed-bitcode.

Bitcode juga memiliki beberapa kelemahan.Pengembang dapat men-debug laporan kerusakan dari aplikasi dengan menyimpan salinan simbol debug yang sesuai dengan biner yang dikirimkan ke Apple. Ketika terjadi kerusakan dalam tumpukan yang diberikan, pengembang dapat mengembalikan jejak tumpukan asli dengan menyimbolkan laporan kerusakan, menggunakan simbol debug ini. Namun, simbol adalah produk sampingan dari menerjemahkan bentuk perantara ke biner; tetapi jika langkah itu dilakukan di server, informasi ini hilang. Apple menyediakan layanan pelaporan kerusakan yang dapat memainkan bagian debugger, asalkan pengembang telah mengunggah simbol debug pada saat publikasi aplikasi. Fakta bahwa pengembang tidak pernah melihat biner yang tepat berarti bahwa mereka mungkin tidak dapat menguji masalah spesifik saat perangkat keras baru berevolusi.

Akhirnya, bitcode pada server dapat diterjemahkan untuk mendukung arsitektur baru dan set instruksi saat mereka berevolusi. Asalkan mereka mempertahankan konvensi panggilan dan ukuran penyelarasan dan kata-kata, aplikasi bitcode dapat diterjemahkan ke dalam jenis arsitektur yang berbeda dan dioptimalkan secara khusus untuk prosesor baru. Jika pustaka standar untuk rutinitas matematika dan vektor digunakan, ini dapat dioptimalkan ke dalam instruksi vektor khusus prosesor untuk mendapatkan kinerja terbaik untuk aplikasi yang diberikan. Pengoptimal bahkan dapat menghasilkan beberapa pengkodean dan penilaian yang berbeda berdasarkan ukuran atau kecepatan eksekusi.

Untuk info lebih lanjut Silakan cek Di Sini dan Di Sini

Rex
sumber
6

Dari dokumen

  • dapatkah saya menggunakan metode di atas tanpa dampak negatif dan tanpa kompromi pengajuan appstore di masa depan?

Bitcode akan memungkinkan apple untuk mengoptimalkan aplikasi tanpa Anda harus mengirimkan bangunan lain. Namun, Anda hanya dapat mengaktifkan fitur ini jika semua kerangka kerja dan aplikasi dalam bundel aplikasi mengaktifkan fitur ini. Memiliki itu membantu, tetapi tidak memilikinya seharusnya tidak berdampak negatif.

  • Apa yang sebenarnya dilakukan ENABLE_BITCODE, apakah itu akan menjadi persyaratan non-opsional di masa mendatang?

Untuk aplikasi iOS, bitcode adalah default, tetapi opsional. Jika Anda memberikan bitcode, semua aplikasi dan kerangka kerja dalam bundel aplikasi harus menyertakan bitcode. Untuk aplikasi watchOS, bitcode diperlukan.

  • Apakah ada dampak kinerja jika saya mengaktifkan / menonaktifkannya?

App Store dan sistem operasi mengoptimalkan pemasangan aplikasi iOS dan watchOS dengan menyesuaikan pengiriman aplikasi dengan kemampuan perangkat khusus pengguna, dengan jejak minimal. Optimalisasi ini, yang disebut penipisan aplikasi, memungkinkan Anda membuat aplikasi yang menggunakan sebagian besar fitur perangkat, menempati ruang disk minimum, dan mengakomodasi pembaruan di masa mendatang yang dapat diterapkan oleh Apple. Unduhan yang lebih cepat dan lebih banyak ruang untuk aplikasi dan konten lain memberikan pengalaman pengguna yang lebih baik.

Seharusnya tidak ada dampak kinerja.

vj9
sumber