Łączenie aplikacji .NET MAUI dla systemu Android
Podczas kompilowania aplikacji interfejs użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) może używać konsolidatora wywoływanego ILLink w celu zmniejszenia ogólnego rozmiaru aplikacji. ILLink zmniejsza rozmiar, analizując kod pośredni utworzony przez kompilator. Usuwa nieużywane metody, właściwości, pola, zdarzenia, struktury i klasy, aby utworzyć aplikację zawierającą tylko zależności kodu i zestawu niezbędne do uruchomienia aplikacji.
Zachowanie konsolidatora
Konsolidator umożliwia przycinanie aplikacji .NET MAUI dla systemu Android. Po włączeniu przycinania konsolidator pozostawia zestawy nietknięte i zmniejsza rozmiar zestawów SDK, usuwając typy i elementy członkowskie, których aplikacja nie używa.
Zachowanie konsolidatora można skonfigurować dla każdej konfiguracji kompilacji aplikacji. Domyślnie przycinanie jest wyłączone dla kompilacji debugowania i włączone dla kompilacji wydania.
Ostrzeżenie
Włączenie konsolidatora dla konfiguracji debugowania aplikacji może utrudnić debugowanie, ponieważ może to spowodować usunięcie metod dostępu do właściwości, które umożliwiają inspekcję stanu obiektów.
Aby upewnić się, że przycinanie jest włączone:
W programie Visual Studio w Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt aplikacji .NET MAUI i wybierz pozycję Właściwości. Następnie przejdź do karty Opcje systemu Android > i upewnij się, że przycinanie jest włączone dla konfiguracji kompilacji wydania:
Zachowaj kod
Gdy używasz trymeru, czasami usuwa kod, który mógł być wywoływany dynamicznie, nawet pośrednio. Możesz poinstruować trimmer, aby zachować elementy członkowskie, dodając adnotacje do atrybutu DynamicDependency
. Ten atrybut może służyć do wyrażania zależności od typu i podzestawu elementów członkowskich lub w określonych elementach członkowskich.
Ważne
Każdy element członkowski w liście BCL, który nie może być statycznie określany jako używany przez aplikację, podlega usunięciu.
Atrybut DynamicDependency
można zastosować do konstruktorów, pól i metod:
[DynamicDependency("Helper", "MyType", "MyAssembly")]
static void RunHelper()
{
var helper = Assembly.Load("MyAssembly").GetType("MyType").GetMethod("Helper");
helper.Invoke(null, null);
}
W tym przykładzie zapewnia DynamicDependency
, że Helper
metoda jest przechowywana. Bez atrybutu przycinanie spowoduje całkowite usunięcie Helper
z MyAssembly
lub usunięcie MyAssembly
, jeśli nie odwołuje się do niego w innym miejscu.
Atrybut określa element członkowski, który ma być zachowany za pośrednictwem string
atrybutu DynamicallyAccessedMembers
lub . Typ i zestaw są niejawne w kontekście atrybutu lub jawnie określone w atrybucie (przez Type
, lub przez string
s dla typu i nazwy zestawu).
Ciągi typów i składowych używają odmiany formatu ciągu identyfikatora komentarza dokumentacji języka C# bez prefiksu elementu członkowskiego. Ciąg składowy nie powinien zawierać nazwy typu deklarowanego i może pominąć parametry, aby zachować wszystkie elementy członkowskie określonej nazwy. W poniższych przykładach pokazano prawidłowe zastosowania:
[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<>))]
Zachowywanie zestawów
Można określić zestawy, które powinny zostać wykluczone z procesu przycinania, jednocześnie zezwalając na przycinanie innych zestawów. Takie podejście może być przydatne, gdy nie można łatwo użyć atrybutu DynamicDependency
lub nie kontrolować kodu, który jest przycinany.
Po przycinaniu wszystkich zestawów można poinformować trymer o pominięcie zestawu, ustawiając TrimmerRootAssembly
element MSBuild w pliku projektu:
<ItemGroup>
<TrimmerRootAssembly Include="MyAssembly" />
</ItemGroup>
Uwaga
Rozszerzenie .dll
nie jest wymagane podczas ustawiania TrimmerRootAssembly
właściwości MSBuild.
Jeśli trimmer pomija zestaw, jest uważany za zakorzeniony, co oznacza, że i wszystkie jego statycznie zrozumiałe zależności są przechowywane. Dodatkowe zestawy można pominąć, dodając więcej TrimmerRootAssembly
właściwości programu MSBuild do elementu <ItemGroup>
.
Zachowywanie zestawów, typów i elementów członkowskich
Można przekazać trimmer plik opisu XML, który określa, które zestawy, typy i elementy członkowskie należy zachować.
Aby wykluczyć element członkowski z procesu przycinania podczas przycinania wszystkich zestawów, ustaw TrimmerRootDescriptor
element MSBuild w pliku projektu na plik XML, który definiuje elementy członkowskie do wykluczenia:
<ItemGroup>
<TrimmerRootDescriptor Include="MyRoots.xml" />
</ItemGroup>
Następnie plik XML używa formatu deskryptora trimmer do zdefiniowania elementów członkowskich do wykluczenia:
<linker>
<assembly fullname="MyAssembly">
<type fullname="MyAssembly.MyClass">
<method name="DynamicallyAccessedMethod" />
</type>
</assembly>
</linker>
W tym przykładzie plik XML określa metodę, która jest dynamicznie uzyskiwana przez aplikację, która jest wykluczona z przycinania.
Gdy zestaw, typ lub element członkowski jest wymieniony w kodzie XML, domyślna akcja to zachowywanie, co oznacza, że niezależnie od tego, czy trimmer uważa, że jest używany, czy nie, jest zachowywany w danych wyjściowych.
Uwaga
Tagi zachowywania są niejednoznacznie inkluzywne. Jeśli nie podasz następnego poziomu szczegółów, zostaną uwzględnione wszystkie elementy podrzędne. Jeśli zestaw jest wymieniony bez żadnych typów, wszystkie typy i składowe zestawu zostaną zachowane.
Oznacz zestaw jako bezpieczny przycinanie
Jeśli masz bibliotekę w projekcie lub jesteś deweloperem biblioteki wielokrotnego użytku i chcesz, aby trymer traktować zestaw jako przycinany, możesz oznaczyć zestaw jako bezpieczny przycinanie, dodając IsTrimmable
właściwość MSBuild do pliku projektu dla zestawu:
<PropertyGroup>
<IsTrimmable>true</IsTrimmable>
</PropertyGroup>
Oznacza to zestaw jako "możliwość przycinania" i włącza ostrzeżenia dotyczące przycinania dla tego projektu. "Przycinanie" oznacza, że zestaw jest uznawany za zgodny z przycinaniem i nie powinien mieć ostrzeżeń dotyczących przycinania podczas kompilowania zestawu. W przypadku użycia w przyciętej aplikacji nieużywane elementy członkowskie zestawu są usuwane w końcowych danych wyjściowych.
IsTrimmable
Ustawienie właściwości MSBuild na true
w pliku projektu wstawia AssemblyMetadata
atrybut do zestawu:
[assembly: AssemblyMetadata("IsTrimmable", "True")]
Alternatywnie możesz dodać AssemblyMetadata
atrybut do zestawu bez konieczności dodawania IsTrimmable
właściwości MSBuild do pliku projektu dla zestawu.
Uwaga
IsTrimmable
Jeśli właściwość MSBuild jest ustawiona dla zestawu, spowoduje to zastąpienie atrybutuAssemblyMetadata("IsTrimmable", "True")
. Dzięki temu można zdecydować się na przycinanie zestawu, nawet jeśli nie ma atrybutu, lub wyłączyć przycinanie zestawu, który ma atrybut.
Pomijanie ostrzeżeń dotyczących analizy
Gdy trimmer jest włączony, usuwa il, który nie jest statycznie osiągalny. Aplikacje korzystające z odbicia lub innych wzorców tworzących zależności dynamiczne mogą zostać przerwane w wyniku. Aby ostrzec o takich wzorcach, podczas oznaczania zestawu jako bezpiecznego przycinania autorzy bibliotek powinni ustawić SuppressTrimAnalysisWarnings
właściwość MSBuild na false
:
<PropertyGroup>
<SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
</PropertyGroup>
Nie pomijanie ostrzeżeń analizy przycinania będzie zawierać ostrzeżenia dotyczące całej aplikacji, w tym własny kod, kod biblioteki i kod zestawu SDK.
Pokaż szczegółowe ostrzeżenia
Analiza przycinania generuje co najwyżej jedno ostrzeżenie dla każdego zestawu pochodzącego z PackageReference
elementu , co oznacza, że elementy wewnętrzne zestawu nie są zgodne z przycinaniem. Jako autor biblioteki, po oznaczeniu zestawu jako bezpiecznego przycinania należy włączyć poszczególne ostrzeżenia dla wszystkich zestawów, ustawiając TrimmerSingleWarn
właściwość MSBuild na false
:
<PropertyGroup>
<TrimmerSingleWarn>false</TrimmerSingleWarn>
</PropertyGroup>
To ustawienie pokazuje wszystkie szczegółowe ostrzeżenia, zamiast zwijać je do pojedynczego ostrzeżenia dla każdego zestawu.