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.
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
Saat Anda menggunakan linker, kadang-kadang menghapus kode yang mungkin telah Anda panggil secara dinamis, bahkan secara tidak langsung. Anda dapat menginstruksikan linker 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 , penautan 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 penautan, sambil memungkinkan rakitan lain ditautkan. Pendekatan ini dapat berguna ketika Anda tidak dapat dengan mudah menggunakan DynamicDependency
atribut , atau tidak mengontrol kode yang sedang ditautkan.
Saat menautkan semua rakitan, Anda dapat memberi tahu linker untuk melewati perakitan dengan mengatur TrimmerRootAssembly
properti MSBuild dalam <ItemGroup>
tag dalam file proyek:
<ItemGroup>
<TrimmerRootAssembly Include="MyAssembly" />
</ItemGroup>
Catatan
.dll
Ekstensi tidak diperlukan saat mengatur TrimmerRootAssembly
properti MSBuild.
Jika linker melewati assembly, 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 linker yang menentukan rakitan, jenis, dan anggota mana yang perlu dipertahankan.
Untuk mengecualikan anggota dari proses penautan saat menautkan semua rakitan, atur TrimmerRootDescriptor
properti MSBuild dalam <ItemGroup>
tag 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 dari penautan:
<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 penautan.
Ketika rakitan, jenis, atau anggota tercantum dalam XML, tindakan default adalah pelestarian, yang berarti bahwa terlepas dari apakah linker berpikir itu digunakan atau tidak, itu 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 assembly sebagai aman linker
Jika Anda memiliki pustaka di proyek Anda, atau Anda adalah pengembang pustaka yang dapat digunakan kembali dan Anda ingin linker memperlakukan rakitan Anda sebagai dapat ditautkan, Anda dapat menandai perakitan sebagai pengtaut dengan aman dengan menambahkan IsTrimmable
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 linker diaktifkan, itu 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 perakitan sebagai penghubung aman, 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 penghubung aman, 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.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk