Sdílet prostřednictvím


Propojení aplikace .NET MAUI pro Android

Když sestaví aplikaci, může uživatelské rozhraní .NET Multi-Platform App UI (.NET MAUI) použít linker, který zavolá, ILLink aby se snížila celková velikost aplikace. ILLink zmenšuje velikost analýzou zprostředkujícího kódu vytvořeného kompilátorem. Odebere nepoužívané metody, vlastnosti, pole, události, struktury a třídy a vytvoří aplikaci, která obsahuje pouze závislosti kódu a sestavení, které jsou nezbytné ke spuštění aplikace.

Chování linkeru

Linker umožňuje oříznout aplikace .NET MAUI pro Android. Když je oříznutí povolené, linker opustí vaše sestavení nedotčená a zmenší velikost sestavení sady SDK odebráním typů a členů, které vaše aplikace nepoužívá.

Chování linkeru je možné nakonfigurovat pro každou konfiguraci sestavení vaší aplikace. Ve výchozím nastavení je oříznutí pro sestavení ladění zakázané a povolené pro sestavení vydaných verzí.

Upozorňující

Povolení linkeru pro konfiguraci ladění vaší aplikace může bránit ladění prostředí, protože může odebrat přístupové objekty vlastností, které umožňují zkontrolovat stav objektů.

Abyste měli jistotu, že je povolené oříznutí:

  1. V sadě Visual Studio v Průzkumník řešení klikněte pravým tlačítkem na projekt aplikace .NET MAUI a vyberte Vlastnosti. Pak přejděte na kartu Možnosti Androidu > a ujistěte se, že je pro konfiguraci sestavení vydané verze povolené oříznutí:

    Snímek obrazovky s chováním linkeru pro Android v sadě Visual Studio

Zachování kódu

Když použijete zatřižovač, někdy se odebere kód, který jste mohli volat dynamicky, dokonce i nepřímo. Můžete dát pokyn, aby se členové zachovali tak, že je označíte atributem DynamicDependency . Tento atribut lze použít k vyjádření závislosti na typu a podmnožině členů nebo na konkrétních členech.

Důležité

Každý člen seznamu BCL, který nelze staticky určit, aby ji aplikace používala, se může odebrat.

Atribut DynamicDependency lze použít u konstruktorů, polí a metod:

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

V tomto příkladu DynamicDependency zajistíte, že Helper se metoda zachová. Bez atributu by oříznutí odebralo Helper MyAssembly nebo úplně odebralo MyAssembly , pokud není odkazováno jinde.

Atribut určuje člena, který má být zachován prostřednictvím string atributu nebo prostřednictvím atributu DynamicallyAccessedMembers . Typ a sestavení jsou buď implicitní v kontextu atributu, nebo explicitně zadané v atributu (podle Type, nebo podle strings pro typ a název sestavení).

Typ a členské řetězce používají variantu formátu řetězce ID komentáře dokumentace jazyka C# bez předpony člena. Řetězec člena by neměl obsahovat název deklarujícího typu a může vynechat parametry pro zachování všech členů zadaného názvu. Následující příklady ukazují platné použití:

[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<>))]

Zachování sestavení

Je možné určit sestavení, která by měla být vyloučena z procesu oříznutí, a zároveň umožnit oříznutí jiných sestavení. Tento přístup může být užitečný, když atribut nemůžete snadno použít DynamicDependency nebo neřídíte kód, který je oříznutý.

Když ořízne všechna sestavení, můžete říct, že oříznutí přeskočí sestavení nastavením TrimmerRootAssembly položky NÁSTROJE MSBuild v souboru projektu:

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

Poznámka:

Rozšíření .dll není nutné při nastavování TrimmerRootAssembly vlastnosti MSBuild.

Pokud se vystřihovač přeskočí sestavení, považuje se za kořenové, což znamená, že se zachovávají všechny jeho staticky pochopitelné závislosti. Další sestavení můžete přeskočit přidáním dalších TrimmerRootAssembly vlastností nástroje MSBuild do objektu <ItemGroup>.

Zachování sestavení, typů a členů

Můžete předat soubor popisu XML, který určuje, která sestavení, typy a členy je třeba zachovat.

Chcete-li vyloučit člena z procesu oříznutí při oříznutí všech sestavení, nastavte TrimmerRootDescriptor položku MSBuild v souboru projektu na soubor XML, který definuje členy, které mají vyloučit:

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

Soubor XML pak pomocí formátu popisovače popisovače definuje, které členy mají být vyloučeny:

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

V tomto příkladu soubor XML určuje metodu, která je dynamicky přístupná aplikací, která je vyloučena z oříznutí.

Pokud je sestavení, typ nebo člen uveden v souboru XML, výchozí akce je zachování, což znamená, že bez ohledu na to, jestli se používá nebo ne, je ve výstupu zachována.

Poznámka:

Značky zachování jsou nejednoznačně inkluzivní. Pokud nezadáte další úroveň podrobností, bude obsahovat všechny podřízené položky. Pokud je sestavení uvedené bez jakýchkoli typů, zachovají se všechny typy a členy sestavení.

Označení sestavení jako bezpečného oříznutí

Pokud máte v projektu knihovnu nebo jste vývojář opakovaně použitelné knihovny a chcete, aby se sestavení ořízly jako oříznutelné, můžete sestavení označit jako bezpečné oříznutí přidáním IsTrimmable vlastnosti MSBuild do souboru projektu pro sestavení:

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

Tím se vaše sestavení označí jako "oříznutelné" a povolí oříznutí upozornění pro daný projekt. Být "oříznutelný", znamená to, že vaše sestavení je považováno za kompatibilní s oříznutím a při sestavení sestavení by nemělo obsahovat žádná upozornění na oříznutí. Při použití v oříznuté aplikaci se nepoužívané členy sestavení odeberou v konečném výstupu.

IsTrimmable Nastavení vlastnosti MSBuild do true souboru projektu vloží AssemblyMetadata atribut do sestavení:

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

Alternativně můžete přidat AssemblyMetadata atribut do sestavení bez přidání IsTrimmable vlastnosti MSBuild do souboru projektu pro sestavení.

Poznámka:

IsTrimmable Pokud je vlastnost MSBuild nastavena pro sestavení, přepíše AssemblyMetadata("IsTrimmable", "True") atribut. To umožňuje vyjádřit výslovný souhlas se sestavením do oříznutí, i když nemá atribut, nebo zakázat oříznutí sestavení, které má atribut.

Potlačení upozornění analýzy

Když je zatřižovač povolený, odebere il, který není staticky dostupný. Aplikace, které používají reflexi nebo jiné vzory, které vytvářejí dynamické závislosti, můžou být v důsledku toho porušené. Chcete-li upozornit na takové vzory, při označení sestavení jako bezpečné oříznutí by autoři knihovny měli nastavit SuppressTrimAnalysisWarnings vlastnost MSBuild na false:

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

Upozornění analýzy oříznutí potlačí upozornění na celou aplikaci, včetně vlastního kódu, kódu knihovny a kódu sady SDK.

Zobrazit podrobná upozornění

Analýza oříznutí vytvoří pro každé sestavení, které pochází z PackageReference, maximálně jedno upozornění, které indikuje, že vnitřní hodnoty sestavení nejsou kompatibilní s oříznutím. Když jako autor knihovny označíte sestavení jako bezpečné oříznutí, měli byste povolit jednotlivá upozornění pro všechna sestavení nastavením TrimmerSingleWarn vlastnosti MSBuild na false:

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

Toto nastavení zobrazuje všechna podrobná upozornění místo jejich sbalení do jednoho upozornění na každé sestavení.