Udostępnij za pośrednictwem


Łą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:

  1. 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:

    Zrzut ekranu przedstawiający zachowanie konsolidatora dla systemu Android w programie Visual Studio.

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 strings 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 PackageReferenceelementu , 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.