Bagikan melalui


Menautkan aplikasi Android .NET MAUI

Saat membangun aplikasi Anda, .NET Multi-platform App UI (.NET MAUI) dapat menggunakan linker yang disebut ILLink untuk mengurangi ukuran aplikasi secara keseluruhan. ILLink mengurangi ukuran dengan menganalisis kode perantara yang dihasilkan oleh kompilator. Ini menghapus metode, properti, bidang, peristiwa, struktur, dan kelas yang tidak digunakan untuk menghasilkan aplikasi yang hanya berisi dependensi kode dan perakitan yang diperlukan untuk menjalankan aplikasi.

Perilaku linker

Linker memungkinkan Anda untuk memangkas aplikasi Android .NET MAUI Anda. Saat pemangkasan diaktifkan, linker membiarkan rakitan Anda tidak tersentuh dan mengurangi ukuran rakitan SDK dengan menghapus jenis dan anggota yang tidak digunakan aplikasi Anda.

Perilaku linker dapat dikonfigurasi untuk setiap konfigurasi build aplikasi Anda. Secara default, pemangkasan dinonaktifkan untuk build debug dan diaktifkan untuk build rilis.

Peringatan

Mengaktifkan linker untuk konfigurasi debug aplikasi Anda dapat menghambat pengalaman penelusuran kesalahan Anda, karena dapat menghapus aksesor properti yang memungkinkan Anda memeriksa status objek Anda.

Untuk memastikan bahwa pemangkasan diaktifkan:

  1. Di Visual Studio, di Penjelajah Solusi, klik kanan pada proyek aplikasi .NET MAUI Anda dan pilih Properti. Kemudian, navigasikan ke tab Opsi Android > dan pastikan bahwa pemangkasan diaktifkan untuk konfigurasi build rilis:

    Cuplikan layar perilaku linker untuk Android di Visual Studio.

Mempertahankan kode

Ketika Anda menggunakan pemangkas, kadang-kadang menghapus kode yang mungkin telah Anda panggil secara dinamis, bahkan secara tidak langsung. Anda dapat menginstruksikan pemangkas untuk mempertahankan anggota dengan membuat anotasi dengan DynamicDependency atribut . Atribut ini dapat digunakan untuk mengekspresikan dependensi pada jenis dan subset anggota, atau pada anggota tertentu.

Penting

Setiap anggota di BCL yang tidak dapat ditentukan secara statis untuk digunakan oleh aplikasi akan dihapus.

Atribut DynamicDependency dapat diterapkan ke konstruktor, bidang, dan metode:

[DynamicDependency("Helper", "MyType", "MyAssembly")]
static void RunHelper()
{
    var helper = Assembly.Load("MyAssembly").GetType("MyType").GetMethod("Helper");
    helper.Invoke(null, null);
}

Dalam contoh ini, DynamicDependency memastikan bahwa Helper metode disimpan. Tanpa atribut , pemangkasan akan menghapus Helper dari MyAssembly atau menghapus MyAssembly sepenuhnya jika tidak dirujuk di tempat lain.

Atribut menentukan anggota untuk disimpan melalui string atau melalui DynamicallyAccessedMembers atribut . Jenis dan assembly adalah implisit dalam konteks atribut, atau secara eksplisit ditentukan dalam atribut (menurut Type, atau dengan strings untuk jenis dan nama rakitan).

String jenis dan anggota menggunakan variasi format string ID komentar dokumentasi C#, tanpa awalan anggota. String anggota tidak boleh menyertakan nama jenis deklarasikan, dan dapat menghilangkan parameter untuk mempertahankan semua anggota dari nama yang ditentukan. Contoh berikut menunjukkan penggunaan yang valid:

[DynamicDependency("Method()")]
[DynamicDependency("Method(System,Boolean,System.String)")]
[DynamicDependency("MethodOnDifferentType()", typeof(ContainingType))]
[DynamicDependency("MemberName")]
[DynamicDependency("MemberOnUnreferencedAssembly", "ContainingType", "UnreferencedAssembly")]
[DynamicDependency("MemberName", "Namespace.ContainingType.NestedType", "Assembly")]
// generics
[DynamicDependency("GenericMethodName``1")]
[DynamicDependency("GenericMethod``2(``0,``1)")]
[DynamicDependency("MethodWithGenericParameterTypes(System.Collections.Generic.List{System.String})")]
[DynamicDependency("MethodOnGenericType(`0)", "GenericType`1", "UnreferencedAssembly")]
[DynamicDependency("MethodOnGenericType(`0)", typeof(GenericType<>))]

Pertahankan rakitan

Dimungkinkan untuk menentukan rakitan yang harus dikecualikan dari proses pemangkasan, sambil memungkinkan rakitan lain dipangkas. Pendekatan ini dapat berguna ketika Anda tidak dapat dengan mudah menggunakan DynamicDependency atribut , atau tidak mengontrol kode yang sedang dipangkas.

Saat memangkas semua rakitan, Anda dapat memberi tahu pemangkas untuk melewati rakitan dengan mengatur TrimmerRootAssembly item MSBuild dalam file proyek:

<ItemGroup>
  <TrimmerRootAssembly Include="MyAssembly" />
</ItemGroup>

Catatan

.dll Ekstensi tidak diperlukan saat mengatur TrimmerRootAssembly properti MSBuild.

Jika pemangkas melompati rakitan, itu dianggap berakar, yang berarti bahwa itu dan semua dependensi yang dipahami secara statis disimpan. Anda dapat melewati rakitan tambahan dengan menambahkan lebih banyak TrimmerRootAssembly properti MSBuild ke <ItemGroup>.

Mempertahankan rakitan, jenis, dan anggota

Anda dapat meneruskan file deskripsi XML pemangkas yang menentukan rakitan, jenis, dan anggota mana yang perlu dipertahankan.

Untuk mengecualikan anggota dari proses pemangkasan saat memangkas semua rakitan, atur TrimmerRootDescriptor item MSBuild dalam file proyek ke file XML yang menentukan anggota untuk dikecualikan:

<ItemGroup>
  <TrimmerRootDescriptor Include="MyRoots.xml" />
</ItemGroup>

File XML kemudian menggunakan format deskriptor pemangkas untuk menentukan anggota mana yang akan dikecualikan:

<linker>
  <assembly fullname="MyAssembly">
    <type fullname="MyAssembly.MyClass">
      <method name="DynamicallyAccessedMethod" />
    </type>
  </assembly>
</linker>

Dalam contoh ini, file XML menentukan metode yang diakses secara dinamis oleh aplikasi, yang dikecualikan dari pemangkasan.

Ketika rakitan, jenis, atau anggota tercantum dalam XML, tindakan default adalah pelestarian, yang berarti bahwa terlepas dari apakah pemangkas menganggapnya digunakan atau tidak, tindakan tersebut dipertahankan dalam output.

Catatan

Tag pelestarian secara ambigu inklusif. Jika Anda tidak memberikan tingkat detail berikutnya, itu akan mencakup semua anak. Jika rakitan tercantum tanpa jenis apa pun, maka semua jenis dan anggota assembly akan dipertahankan.

Menandai rakitan sebagai aman pemangkasan

Jika Anda memiliki pustaka di proyek Anda, atau Anda adalah pengembang pustaka yang dapat digunakan kembali dan Anda ingin pemangkas memperlakukan rakitan Anda sebagai dapat dipangkas, Anda dapat menandai rakitan sebagai aman pemangkasan IsTrimmable dengan menambahkan properti MSBuild ke file proyek untuk rakitan:

<PropertyGroup>
    <IsTrimmable>true</IsTrimmable>
</PropertyGroup>

Ini menandai rakitan Anda sebagai "dapat dipangkas" dan memungkinkan peringatan pemangkasan untuk proyek tersebut. Menjadi "dapat dipangkas" berarti rakitan Anda dianggap kompatibel dengan pemangkasan dan seharusnya tidak memiliki peringatan pemangkasan saat rakitan dibangun. Saat digunakan dalam aplikasi yang dipangkas, anggota assembly yang tidak digunakan akan dihapus dalam output akhir.

IsTrimmable Mengatur properti MSBuild ke true dalam file proyek Anda menyisipkan AssemblyMetadata atribut ke dalam rakitan Anda:

[assembly: AssemblyMetadata("IsTrimmable", "True")]

Atau, Anda dapat menambahkan AssemblyMetadata atribut ke assembly Anda tanpa menambahkan IsTrimmable properti MSBuild ke file proyek untuk assembly Anda.

Catatan

IsTrimmable Jika properti MSBuild diatur untuk rakitan, ini akan mengambil alih AssemblyMetadata("IsTrimmable", "True") atribut. Ini memungkinkan Anda untuk memilih assembly ke dalam pemangkasan meskipun tidak memiliki atribut , atau untuk menonaktifkan pemangkasan rakitan yang memiliki atribut .

Menyembunyikan peringatan analisis

Ketika pemangkas diaktifkan, pemangkas akan menghapus IL yang tidak dapat dijangkau secara statis. Aplikasi yang menggunakan pantulan atau pola lain yang membuat dependensi dinamis dapat rusak sebagai akibatnya. Untuk memperingatkan tentang pola tersebut SuppressTrimAnalysisWarnings , saat menandai rakitan sebagai aman pangkas, penulis pustaka harus mengatur properti MSBuild ke false:

<PropertyGroup>
  <SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
</PropertyGroup>

Tidak menekan peringatan analisis pemangkasan akan mencakup peringatan tentang seluruh aplikasi, termasuk kode, kode pustaka, dan kode SDK Anda sendiri.

Tampilkan peringatan terperinci

Analisis pemangkasan menghasilkan paling banyak satu peringatan untuk setiap rakitan yang berasal dari PackageReference, yang menunjukkan bahwa internal rakitan tidak kompatibel dengan pemangkasan. Sebagai penulis pustaka, ketika Anda menandai rakitan sebagai aman pemangkasan, Anda harus mengaktifkan peringatan individual untuk semua rakitan dengan mengatur TrimmerSingleWarn properti MSBuild ke false:

<PropertyGroup>
  <TrimmerSingleWarn>false</TrimmerSingleWarn>
</PropertyGroup>

Pengaturan ini menunjukkan semua peringatan terperinci, alih-alih menciutkannya ke satu peringatan per perakitan.