Dikelola kode pengupasan
Kode reloading di Editor Unity

Linker Unity

Proses build Unity menggunakan alat yang disebut linker Unity untuk strip kode yang dikelola. Linker Unity adalah versi IL Linker yang disesuaikan untuk bekerja dengan Unity. Bagian khusus mesin Unity khusus dari linker Unity tidak tersedia secara publik.

Linker Unity bertanggung jawab atas pengupasan kode yang dikelola dan sebagian proses pengupasan kode mesin, yang merupakan proses terpisah yang tersedia melalui backend skrip IL2CPPBack-end scripting bersatu yang dapat Anda gunakan sebagai alternatif untuk Mono ketika proyek bangunan untuk beberapa platform. More info
Lihat di Glossary
yang menghapus kode mesin yang tidak digunakan. Untuk informasi lebih lanjut, lihat PlayerSettings.StripEngineCode].

Bagaimana linker Unity bekerja

Linker Unity menganalisis semua rakitan dalam proyek Anda. Pertama, itu menandai jenis akar, metode, sifat, dan bidang. Sebagai contoh, kelas monoBehaviour-derived yang Anda tambahkan ke GameObjectsObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary
pada SceneAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
Lihat di Glossary
adalah jenis akar. Linker Unity kemudian menganalisis akar yang telah ditandai untuk mengidentifikasi, dan menandai kode yang dikelola yang akar ini tergantung pada. Setelah menyelesaikan analisis statis ini, kode yang tersisa tidak ditandai tidak dapat dijangkau oleh jalur eksekusi melalui kode aplikasi Anda dan linker Unity menghapusnya dari perakitan.

Bagaimana garis penghubung Unity

Editor Unity menciptakan daftar rakitan yang mengandung jenis yang digunakan di salah satu adegan dalam proyek Unity Anda dan melewati daftar ini ke linker Unity. Linker Unity kemudian memproses rakitan tersebut, setiap referensi dari rakitan tersebut, setiap rakitan yang dinyatakan dalam file link.xml, dan setiap rakitan dengan atribut AlwaysLinkAssembly. Secara umum, linker Unity tidak memproses rakitan termasuk dalam proyek Anda yang tidak jatuh di bawah salah satu kategori ini, dan tidak termasuk dari build Pemain.

Untuk setiap proses penghubung Unity, berikut satu set aturan berdasarkan klasifikasi perakitan, apakah perakitan mengandung jenis yang digunakan dalam Adegan, dan Managed Stripping Level Anda telah memilih untuk membangun.

Untuk tujuan aturan ini, rakitan jatuh ke klasifikasi berikut:

  • Sitemap NET Class Library assemblies — Sertakan perpustakaan kelas Mono seperti mscorlib.dll dan System.dll, serta . NET kelas perpustakaan fasad perakitan seperti netstandard.dll.
  • Platform SDK perakitan — Sertakan rakitan yang dikelola khusus ke platform SDK. Misalnya, jendela. winmd perakitan yang merupakan bagian dari SDK Universal Windows PlatformFitur IAP yang mendukung simulator Pembelian Aplikasi Microsoft, yang memungkinkan Anda untuk menguji aliran pembelian IAP pada perangkat sebelum menerbitkan aplikasi Anda. More info
    Lihat di Glossary
    .
  • Mesin Unity Perakitan modul - Sertakan rakitan yang berhasil yang membuat Mesin UnityEngine, seperti UnityEngine. Core.dll.
  • Rakitan proyek - Sertakan rakitan khusus untuk proyek seperti:
    • Script perakitan seperti Assembly-CSharp.dll
    • Precompiled assemblies
    • Paket rakitan

Menandai aturan

Ketika Anda membangun proyek di Unity, proses build mengkompilasi kode C # Anda ke format .NET bytecode yang disebut Common Intermediate Language (CIL). Paket unity kode byte CIL ini menjadi file yang disebut perakitan. Perpustakaan framework .NET dan perpustakaan C# di plugin yang Anda gunakan di proyek Anda juga sudah dikemas sebagai perakitan kode bytecode CIL.

Ketika linker Unity melakukan analisis statis, berikut set aturan untuk menentukan bagian mana dari CIL bytecode tanda penghubung Unity yang diperlukan untuk membangun. Aturan penandaan akar menentukan bagaimana penghubung Unity mengidentifikasi dan melestarikan rakitan tingkat atas dalam pembangunan. Aturan penandaan ketergantungan menentukan bagaimana penghubung Unity mengidentifikasi dan melestarikan kode apa pun yang rakitan akar tergantung pada.

Properti Managed Stripping Level mengubah set aturan yang digunakan oleh tautan Unity. Bagian berikut menjelaskan aturan penandaan untuk setiap pengaturan yang mungkin untuk properti Managed Stripping Level.

Aturan penandaan akar

Tabel berikut menjelaskan bagaimana penghubung Unity mengidentifikasi jenis tingkat atas dalam perakitan:

Assembly type: Marking rules:
Minimal Low Medium High
.NET Class & Platform SDK and UnityEngine Assemblies Berlaku pelestarian pencegahan dan setiap pelestarian yang didefinisikan dalam setiap file link.xml. Berlaku pelestarian pencegahan dan setiap pelestarian yang didefinisikan dalam setiap file link.xml. Berlaku setiap pelestarian yang didefinisikan dalam setiap file link.xml. Berlaku setiap pelestarian yang didefinisikan dalam setiap file link.xml.
Assemblies with types referenced in a scene Tandai semua jenis dan anggota dalam perakitan. Tandai semua jenis dan anggota dalam perakitan. Tandai berikut:
• Semua metode yang memiliki atribut [RuntimeInitializeOnLoadMethod] atau [Preserve].
•Preservations didefinisikan dalam setiap file link.xml. Login Tandai semua jenis yang berasal dari MonoBehaviour dan ScriptableObject di precompiled, paket, Script Unity atau assemblies definisi perakitan.
•Marks all types derived from MonoBehaviour and ScriptableObject in precompiled, package, Unity Script or assembly definition assemblies.
Tandai berikut:
• Semua metode yang memiliki atribut [RuntimeInitializeOnLoadMethod] atau [Preserve].
•Preservations didefinisikan dalam setiap file link.xml. Login Tandai semua jenis yang berasal dari MonoBehaviour dan ScriptableObject di precompiled, paket, Script Unity atau assemblies definisi perakitan.
•Marks all types derived from MonoBehaviour and ScriptableObject in precompiled, package, Unity Script or assembly definition assemblies.
All other Tandai semua jenis dan anggota dalam perakitan. Tandai berikut:
• Semua jenis publik dan anggota publik dari jenis-jenis tersebut. Login Semua metode yang memiliki atribut
atau [RuntimeInitializeOnLoadMethod].[Preserve]•Preservations didefinisikan dalam setiap file link.xml. Login Semua jenis yang berasal dari MonoBehaviour dan ScriptableObject di precompiled, paket, Script Unity atau perakitan definisi Majelis.
•Preservations defined in any link.xml file.
•All types derived from MonoBehaviour and ScriptableObject in precompiled, package, Unity Script or assembly definition assemblies.
Tandai berikut:
• Semua jenis publik dan anggota publik dari jenis-jenis tersebut. Login Semua metode yang memiliki atribut
atau [RuntimeInitializeOnLoadMethod].[Preserve]•Preservations didefinisikan dalam setiap file link.xml. Login Semua jenis yang berasal dari MonoBehaviour dan ScriptableObject di precompiled, paket, Script Unity atau perakitan definisi Majelis.
•Preservations defined in any link.xml file.
•All types derived from MonoBehaviour and ScriptableObject in precompiled, package, Unity Script or assembly definition assemblies.
Tandai berikut:
• Semua metode yang memiliki atribut [RuntimeInitializeOnLoadMethod] atau [Preserve].
•Preservations didefinisikan dalam setiap file link.xml. Login Semua jenis yang berasal dari MonoBehaviour dan ScriptableObject di precompiled, paket, Script Unity atau perakitan definisi Majelis.
•All types derived from MonoBehaviour and ScriptableObject in precompiled, package, Unity Script or assembly definition assemblies.
Test Tandai metode apa pun dengan atribut [UnityTest] dan metode apa pun yang ditentukan oleh Attribute pada NUnit. Login

Aturan penandaan ketergantungan

Setelah linker Unity mengidentifikasi akar dalam perakitan, perlu mengidentifikasi kode apa pun yang akarnya tergantung. Tabel berikut menjelaskan bagaimana penghubung Unity mengidentifikasi ketergantungan jenis akar dalam perakitan:

Rule Target Action at each stripping level
Minimal Low Medium High
MonoBehaviour Linker Unity menandai semua anggota tipe MonoBehavior ketika menandai jenis.
ScriptableObject Linker Unity menandai semua anggota tipe ScriptableObject ketika menandai jenis.
Attributes Ketika linker Unity menandai perakitan, jenis atau struktur kode lainnya, itu juga menandai semua atribut dari struktur tersebut. Ketika linker Unity menandai perakitan, jenis atau struktur kode lainnya, itu juga menandai semua atribut dari struktur tersebut. Ketika linker Unity menandai perakitan, jenis atau struktur kode lainnya, itu hanya menandai atribut struktur tersebut jika jenis atribut juga ditandai. Ketika linker Unity menandai perakitan, jenis atau struktur kode lainnya, itu hanya menandai atribut struktur tersebut jika jenis atribut juga ditandai.
Debugging Attributes Ketika script debugging diaktifkan, Unity linker menandai semua anggota yang memiliki atribut [DebuggerDisplay], bahkan ketika tidak ada jalur kode yang menggunakan anggota tersebut. Ketika script debugging diaktifkan, Unity linker menandai semua anggota yang memiliki atribut [DebuggerDisplay], bahkan ketika tidak ada jalur kode yang menggunakan anggota tersebut. Linker Unity selalu menghilangkan atribut debugging seperti DustggerDisplayAttribute dan DustggerTypeProxyAttribute. Linker Unity selalu menghilangkan atribut debugging seperti DustggerDisplayAttribute dan DustggerTypeProxyAttribute.
.NET Facade Class Library Hapus rakitan fasad karena mereka tidak perlu di runtime.

Link XML fitur tag pengecualian

file mendukung atribut XML yang tidak biasa digunakan. Dalam contoh, file mscorlib.xml tertanam di mscorlib.dll menggunakan atribut ini, tetapi Anda dapat menggunakannya dalam file link.xml, ketika tepat.

Ketika Anda menggunakan tingkat pengupasan High, tautan Unity tidak termasuk pelestarian fitur yang tidak didukung berdasarkan pengaturan untuk membangun saat ini:

  1. IL2CPP scripting backendKerangka kerja yang skrip di Unity. Unity mendukung tiga backend scripting yang berbeda tergantung pada platform target: Mono, .NET dan IL2CPP. Platform Windows Universal, namun hanya mendukung dua: .NET dan IL2CPP. More info
    Lihat di Glossary
    .
  2. sre — Excluded when targeting the IL2CPP scripting backend.
  3. com — Excluded when targeting platforms that don’t support COM.

Misalnya, file link berikut.xml mempertahankan satu metode tipe pada platform yang mendukung COM, dan satu metode pada semua platform:

<linker>

    &lt;assembly fullname="Foo">

        &lt;type fullname="Type1">

            &lt;!--Preserve FeatureOne on platforms that support COM-->

            &lt;method signature="System.Void FeatureOne()" feature="com"/>

            &lt;!--Preserve FeatureTwo on all platforms-->

            &lt;method signature="System.Void FeatureTwo()"/>

        &lt;/type>

    &lt;/assembly>

</linker>

Mengedit badan metode

Ketika Anda menggunakan tingkat pengupasan High, pengedit penghubung Unity badan metode untuk lebih mengurangi ukuran kode. Bagian ini meringkas beberapa pengeditan yang tidak dapat dikonsepkan bahwa penghubung Unity membuat untuk mengedepankan tubuh.

Linker Unity hanya mengedit badan metode di rakitan Perpustakaan Kelas .NET. Setelah metode pengeditan tubuh, kode sumber perakitan tidak lagi cocok dengan kode yang disusun dalam perakitan, yang dapat membuat debugging lebih sulit.

Daftar berikut menjelaskan tindakan yang dapat dilakukan oleh Unity linker untuk mengedit tubuh metode:

  • Hapus cabang yang tidak dapat dijangkau - Penghubung Unity menghapus blok If-statement yang memeriksa Sistem. Sitemap Login Platform dan tidak dapat dijangkau untuk platform yang ditargetkan saat ini.
  • Metode inline yang hanya mengakses bidang - Linker Unity menggantikan panggilan ke metode yang mendapatkan atau mengatur lapangan dengan akses langsung ke lapangan. Hal ini sering memungkinkan untuk melucuti metode sepenuhnya. Ketika Anda menggunakan backend Mono, linker Unity hanya membuat perubahan ini ketika pemanggil metode diperbolehkan untuk langsung mengakses lapangan, berdasarkan visibilitas lapangan. Untuk IL2CPP, aturan visibilitas tidak berlaku, sehingga tautan Unity membuat perubahan ini di mana tepat.
  • Metode inline yang mengembalikan nilai const - Unity linker inlines panggilan ke metode yang hanya mengembalikan nilai const.
  • Hapus panggilan non-returning kosong - Linker Unity menghapus panggilan ke metode yang kosong dan memiliki jenis pengembalian.
  • Lepaskan ruang lingkup kosong - Penghubung Unity menghapus blok Coba/Finally ketika blok Terakhir kosong. Menghapus dapat membuat blok akhir kosong. Ketika itu terjadi selama pengeditan metode, penghubung Unity menghapus seluruh blok Try/Finally. Satu skenario di mana ini dapat terjadi adalah ketika kompiler menghasilkan blok Coba/Finally sebagai bagian dari loop foreach untuk memanggil Dispose().
Dikelola kode pengupasan
Kode reloading di Editor Unity