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:
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:
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 string
s 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.