Bagikan melalui


Menautkan Aplikasi Xamarin.iOS

Saat membangun aplikasi Anda, Visual Studio untuk Mac atau Visual Studio memanggil alat yang disebut mtouch yang menyertakan linker untuk kode terkelola. Ini digunakan untuk menghapus dari pustaka kelas fitur yang tidak digunakan aplikasi. Tujuannya adalah untuk mengurangi ukuran aplikasi, yang akan dikirim hanya dengan bit yang diperlukan.

Linker menggunakan analisis statis untuk menentukan berbagai jalur kode yang rentan diikuti aplikasi Anda. Ini agak berat karena harus melalui setiap detail setiap perakitan, untuk memastikan bahwa tidak ada yang dapat ditemukan dihapus. Ini tidak diaktifkan secara default pada build simulator untuk mempercepat waktu build saat penelusuran kesalahan. Namun karena menghasilkan aplikasi yang lebih kecil, ia dapat mempercepat kompilasi AOT dan mengunggah ke perangkat, semua build perangkat (Rilis ) menggunakan linker secara default.

Karena linker adalah alat statis, itu tidak dapat menandai untuk jenis dan metode inklusi yang dipanggil melalui pantulan, atau dibuat secara dinamis. Ada beberapa opsi untuk mengatasi batasan ini.

Perilaku Linker

Proses penautan dapat disesuaikan melalui dropdown perilaku linker di Opsi Proyek. Untuk mengakses ini klik dua kali pada proyek iOS dan telusuri opsi Build Linker iOS>, seperti yang diilustrasikan di bawah ini:

Linker Options

Tiga opsi utama yang ditawarkan dijelaskan di bawah ini:

Menonaktifkan penautan akan memastikan bahwa tidak ada rakitan yang dimodifikasi. Untuk alasan performa, ini adalah pengaturan default saat IDE Anda menargetkan simulator iOS. Untuk perangkat, build ini hanya boleh digunakan sebagai solusi setiap kali linker berisi bug yang mencegah aplikasi Anda dijalankan. Jika aplikasi Anda hanya berfungsi dengan -nolink, kirimkan laporan bug.

Ini sesuai dengan opsi -nolink saat menggunakan alat baris perintah mtouch.

Dalam mode ini, linker akan membiarkan rakitan Anda tidak tersentuh, dan akan mengurangi ukuran rakitan SDK (yaitu apa yang dikirim dengan Xamarin.iOS) dengan menghapus semua yang tidak digunakan aplikasi Anda. Ini adalah pengaturan default saat IDE Anda menargetkan perangkat iOS.

Ini adalah opsi paling sederhana, karena tidak memerlukan perubahan apa pun dalam kode Anda. Perbedaan dengan menautkan semuanya adalah bahwa linker tidak dapat melakukan beberapa pengoptimalan dalam mode ini, jadi ini adalah trade-off antara pekerjaan yang diperlukan untuk menautkan semuanya dan ukuran aplikasi akhir.

Ini sesuai dengan opsi -linksdk saat menggunakan alat baris perintah mtouch.

Saat menautkan semuanya, linker dapat menggunakan seluruh set pengoptimalannya untuk membuat aplikasi sesedikit mungkin. Ini akan mengubah kode pengguna, yang dapat rusak setiap kali kode menggunakan fitur dengan cara yang tidak dapat dideteksi oleh analisis statis linker. Dalam kasus seperti itu, misalnya layanan web, refleksi, atau serialisasi, beberapa penyesuaian mungkin diperlukan dalam aplikasi Anda untuk menautkan semuanya.

Ini sesuai dengan opsi -linkall saat menggunakan alat baris perintah mtouch.

Mengontrol Linker

Ketika Anda menggunakan linker, terkadang akan menghapus kode yang mungkin telah Anda panggil secara dinamis, bahkan secara tidak langsung. Untuk mencakup kasus-kasus tersebut, linker menyediakan beberapa fitur dan opsi untuk memungkinkan Anda mengontrol tindakannya dengan lebih besar.

Mempertahankan Kode

Ketika Anda menggunakan linker, terkadang dapat menghapus kode yang mungkin telah Anda panggil secara dinamis baik menggunakan System.Reflection.MemberInfo.Invoke, atau dengan mengekspor metode Anda untuk Objective-C menggunakan [Export] atribut lalu memanggil pemilih secara manual.

Dalam kasus tersebut, Anda dapat menginstruksikan linker untuk mempertimbangkan seluruh kelas yang akan digunakan atau anggota individual untuk dipertahankan dengan menerapkan [Xamarin.iOS.Foundation.Preserve] atribut baik di tingkat kelas atau tingkat anggota. Setiap anggota yang tidak secara statis ditautkan oleh aplikasi akan dihapus. Atribut ini digunakan untuk menandai anggota yang tidak dirujuk secara statis, tetapi itu masih diperlukan oleh aplikasi Anda.

Misalnya, jika Anda membuat instans jenis secara dinamis, Anda mungkin ingin mempertahankan konstruktor default jenis Anda. Jika Anda menggunakan serialisasi XML, Anda mungkin ingin mempertahankan properti jenis Anda.

Anda dapat menerapkan atribut ini pada setiap anggota jenis, atau pada jenis itu sendiri. Jika Anda ingin mempertahankan seluruh jenis, Anda dapat menggunakan sintaks [Preserve (AllMembers = true)] pada jenis .

Terkadang Anda ingin mempertahankan anggota tertentu, tetapi hanya jika jenis yang berisi dipertahankan. Dalam kasus tersebut, gunakan [Preserve (Conditional=true)]

Jika Anda tidak ingin mengambil dependensi pada pustaka Xamarin -misalnya, katakanlah Anda membangun pustaka kelas portabel lintas platform (PCL) - Anda masih dapat menggunakan atribut ini.

Untuk melakukan ini, Anda harus mendeklarasikan kelas PreserveAttribute, dan menggunakannya dalam kode Anda, seperti ini:

public sealed class PreserveAttribute : System.Attribute {
    public bool AllMembers;
    public bool Conditional;
}

Tidak masalah di mana namespace ini ditentukan, linker melihat atribut ini berdasarkan nama jenis.

Melompati Rakitan

Dimungkinkan untuk menentukan rakitan yang harus dikecualikan dari proses linker, sambil memungkinkan rakitan lain ditautkan secara normal. Ini berguna jika menggunakan [Preserve] pada beberapa rakitan tidak mungkin (misalnya kode pihak ke-3) atau sebagai solusi sementara untuk bug.

Ini sesuai dengan --linkskip opsi saat menggunakan alat baris perintah mtouch.

Saat menggunakan opsi Tautkan Semua Rakitan, jika Anda ingin memberi tahu linker untuk melewati seluruh rakitan, letakkan yang berikut ini di opsi Argumen mtouch tambahan dari rakitan tingkat atas Anda:

--linkskip=NameOfAssemblyToSkipWithoutFileExtension

Jika Anda ingin linker melewati beberapa rakitan, Anda menyertakan beberapa linkskip argumen:

--linkskip=NameOfFirstAssembly --linkskip=NameOfSecondAssembly

Tidak ada antarmuka pengguna untuk menggunakan opsi ini tetapi dapat disediakan dalam dialog Opsi Proyek Visual Studio untuk Mac atau panel Properti proyek Visual Studio, di dalam bidang teks argumen mtouch tambahan. (Misalnya --linkskip=mscorlib tidak akan menautkan mscorlib.dll tetapi akan menautkan rakitan lain dalam solusi).

Linker akan menghapus kode yang sangat tidak mungkin digunakan pada perangkat, misalnya tidak didukung atau tidak diizinkan. Dalam kesempatan yang jarang terjadi, ada kemungkinan bahwa aplikasi atau pustaka bergantung pada kode ini (berfungsi atau tidak). Karena Xamarin.iOS 5.0.1, linker dapat diinstruksikan untuk melewati pengoptimalan ini.

Ini sesuai dengan opsi -nolinkaway saat menggunakan alat baris perintah mtouch.

Tidak ada antarmuka pengguna untuk menggunakan opsi ini tetapi dapat disediakan dalam dialog Opsi Proyek Visual Studio untuk Mac atau panel Properti proyek Visual Studio, dalam bidang teks Argumen mtouch tambahan. (Misalnya --nolinkaway tidak akan menghapus kode tambahan (sekitar 100kb)).

Menandai Assembly Anda sebagai Linker-ready

Pengguna dapat memilih untuk hanya menautkan rakitan SDK, dan tidak melakukan penautan apa pun ke kode mereka. Ini juga berarti bahwa pustaka pihak ketiga mana pun yang bukan bagian dari SDK inti Xamarin tidak akan ditautkan.

Ini biasanya terjadi, karena mereka tidak ingin menambahkan [Preserve] atribut secara manual ke kode mereka. Efek sampingnya adalah bahwa pustaka pihak ketiga tidak akan ditautkan, dan ini secara umum adalah default yang baik, karena tidak mungkin untuk mengetahui apakah pustaka pihak ketiga ramah tautan atau tidak.

Jika Anda memiliki pustaka dalam proyek Anda, atau Anda adalah pengembang pustaka yang dapat digunakan kembali dan Anda ingin linker memperlakukan rakitan Anda sebagai dapat ditautkan, yang harus Anda lakukan adalah menambahkan atribut LinkerSafetingkat perakitan , seperti ini:

[assembly:LinkerSafe]

Pustaka Anda sebenarnya tidak perlu mereferensikan pustaka Xamarin untuk ini. Misalnya, jika Anda membangun Pustaka Kelas Portabel yang akan berjalan di platform lain, Anda masih dapat menggunakan LinkerSafe atribut . Linker Xamarin mencari LinkerSafe atribut berdasarkan nama, bukan dengan jenis aktualnya. Ini berarti Anda dapat menulis kode ini dan juga akan berfungsi:

[assembly:LinkerSafe]
// ... assembly attribute should be at top, before source
class LinkerSafeAttribute : System.Attribute {}

Konfigurasi Linker Kustom

Ikuti instruksi untuk membuat file konfigurasi linker.