Megosztás a következőn keresztül:


.NET MAUI Android-alkalmazás csatolása

Az alkalmazás létrehozásakor a .NET többplatformos alkalmazás felhasználói felülete (.NET MAUI) használhat egy ILLink nevű linkert az alkalmazás általános méretének csökkentéséhez. ILLink csökkenti a méretet a fordító által létrehozott köztes kód elemzésével. Eltávolítja a nem használt metódusokat, tulajdonságokat, mezőket, eseményeket, szerkezeteket és osztályokat egy olyan alkalmazás létrehozásához, amely csak az alkalmazás futtatásához szükséges kód- és szerelvényfüggőségeket tartalmazza.

Összekötő viselkedése

A linkerrel levághatja a .NET MAUI Android-alkalmazásait. Ha a vágás engedélyezve van, a csatoló érintetlenül hagyja a szerelvényeket, és az alkalmazás által nem használt típusok és tagok eltávolításával csökkenti az SDK-szerelvények méretét.

A Linker viselkedése az alkalmazás minden buildkonfigurációjához konfigurálható. Alapértelmezés szerint a vágás le van tiltva a hibakeresési buildek esetében, és engedélyezve van a kiadási buildekhez.

Figyelmeztetés

Ha engedélyezi a hivatkozáskezelőt az alkalmazás hibakeresési konfigurációjához, azzal akadályozhatja a hibakeresési élményt, mivel eltávolíthatja azokat a tulajdonság-tartozékokat, amelyek lehetővé teszik az objektumok állapotának vizsgálatát.

Hogy a trimmelés engedélyezett legyen:

  1. A Visual Studióban a Megoldáskezelőterületen kattintson a jobb gombbal a .NET MAUI-alkalmazásprojektre, és válassza a Tulajdonságoklehetőséget. Ezután lépjen az Android > Beállítások lapra, és győződjön meg arról, hogy a kiadás buildkonfigurációjához engedélyezve van a vágás:

    Képernyőkép az Android linker viselkedéséről a Visual Studióban.

Kód megőrzése

Amikor a trimmert használja, az néha eltávolítja a kódot, amelyet dinamikusan vagy akár közvetett módon is meghívhatott. Megadhatja a vágónak, hogy őrizze meg a tagokat azzal, hogy ellátja őket a DynamicDependency attribútummal. Ez az attribútum a tagok típusától és részhalmazától, illetve adott tagoktól való függőség kifejezésére használható.

Fontos

A BCL minden olyan tagja el van távolításra jelölve, amelyről nem állapítható meg statikusan, hogy használja az alkalmazás.

A DynamicDependency attribútum konstruktorokra, mezőkre és metódusokra alkalmazható:

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

Ebben a példában a DynamicDependency biztosítja, hogy a Helper metódus megmarad. Az attribútum nélkül a vágás eltávolítaná Helper-t MyAssembly-ből, vagy teljesen eltávolítaná MyAssembly-t, amennyiben máshol nem hivatkoznak rá.

Az attribútum egy string vagy a DynamicallyAccessedMembers attribútumon keresztül adja meg a megtartandó tagot. A típus és a szerelvény implicit módon szerepel az attribútumkörnyezetben, vagy explicit módon meg van adva az attribútumban (Typevagy strings a típus és a szerelvény neve alapján).

A típus- és tag stringek a C# dokumentáció megjegyzésazonosító stringjének egy változatát használják ésformátumban, előtag nélkül. A tagsztring nem tartalmazhatja a deklarálási típus nevét, és kihagyhatja a paramétereket a megadott név összes tagjának megtartásához. Az alábbi példák érvényes felhasználási módokat mutatnak be:

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

Szerelvények megőrzése

Megadhatja azokat a szerelvényeket, amelyeket ki kell zárni a vágási folyamatból, miközben más szerelvényeket is levághat. Ez a módszer akkor lehet hasznos, ha nem tudja könnyen használni a DynamicDependency attribútumot, vagy nem tudja szabályozni a levágott kódot.

Ha az összes szerelvényt levágja, megadhatja a vágónak, hogy hagyja ki a szerelvényt, ha beállít egy TrimmerRootAssembly MSBuild elemet a projektfájlban:

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

Jegyzet

A .dll bővítmény nem szükséges az TrimmerRootAssembly MSBuild tulajdonság beállításakor.

Ha a nyíró kihagy egy összetevőt, akkor gyökerezőnektekinthető, ami azt jelenti, hogy az és az összes statikusan értelmezhető függősége megmarad. Kihagyhatja a további szerelvényeket, ha hozzáad több TrimmerRootAssembly MSBuild tulajdonságot a <ItemGroup>-hez.

Szerelvények, típusok és tagok megőrzése

A vágónak átadhat egy XML-leírásfájlt, amely meghatározza, hogy mely szerelvényeket, típusokat és tagokat kell megőrizni.

Ha ki szeretne zárni egy tagot a vágási folyamatból az összes szerelvény levágásakor, állítsa a TrimmerRootDescriptor MSBuild elemet a projektfájlban arra az XML-fájlra, amely meghatározza a kizárni kívánt tagokat:

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

Aztán az XML-fájl a metsző leíró formátumot használja annak meghatározására, hogy mely tagokat zárják ki:

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

Ebben a példában az XML-fájl egy olyan metódust határoz meg, amelyet az alkalmazás dinamikusan elér, és amely nincs kizárva a vágásból.

Ha egy szerelvény, típus vagy tag szerepel az XML-ben, az alapértelmezett művelet a megőrzés, ami azt jelenti, hogy függetlenül attól, hogy a vágó azt használja-e vagy sem, megmarad a kimenetben.

Jegyzet

A tartósítási címkék nem egyértelműek. Ha nem adja meg a következő részletességi szintet, az az összes gyermekre kiterjed. Ha egy szerelvény típusok nélkül szerepel a listán, akkor a rendszer megőrzi a szerelvény összes típusát és tagját.

Szerelvény megjelölése vágásbiztosként

Ha van egy kódtár a projektben, vagy Ön egy újrafelhasználható kódtár fejlesztője, és azt szeretné, hogy a vágó a szerelvényt vághatóként kezelje, a szerelvényt vágásbiztosként megjelölheti úgy, hogy hozzáadja a IsTrimmable MSBuild tulajdonságot a szerelvény projektfájljához:

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

Ez "vághatóként" jelöli meg a szerelvényt, és engedélyezi az adott projektre vonatkozó vágási figyelmeztetéseket. A "vágható" állapot azt jelenti, hogy a szerelvény kompatibilisnek tekinthető a vágással, és a szerelvény létrehozásakor nem lehetnek vágási figyelmeztetések. Ha csökkentett alkalmazásban használják, a szerelvény kihasználatlan elemei el lesznek távolítva a végső kimenetből.

Ha natív AOT-telepítést használ a .NET 9+-ban, a IsAotCompatible MSBuild tulajdonság beállítása true a IsTrimmable tulajdonsághoz is hozzárendel egy true értéket, és további AOT-elemző buildtulajdonságokat tesz lehetővé. További információ az AOT-elemzőkről: AOT-kompatibilis elemzők. A .NET MAUI natív AOT-telepítéséről szóló további információkért lásd: natív AOT-telepítés.

A(z) IsTrimmable MSBuild tulajdonság true-re állítása a projektfájlban beilleszti a AssemblyMetadata attribútumot az assembly-be.

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

Másik lehetőségként hozzáadhatja a AssemblyMetadata attribútumot a szerelvényhez anélkül, hogy hozzáadta volna a IsTrimmable MSBuild tulajdonságot a szerelvény projektfájljához.

Jegyzet

Ha a IsTrimmable MSBuild tulajdonság be van állítva egy szerelvényhez, ez felülbírálja a AssemblyMetadata("IsTrimmable", "True") attribútumot. Ez lehetővé teszi, hogy a szerelvényt akkor is levágja, ha nem rendelkezik az attribútummal, vagy letiltsa az attribútummal rendelkező szerelvény levágását.

Elemzési figyelmeztetések mellőzése

Ha a vágóegység engedélyezve van, eltávolítja a statikusan nem elérhető IL-t. A dinamikus függőségeket létrehozó tükröződéseket vagy más mintákat használó alkalmazások emiatt megszakadhatnak. Az ilyen mintákra való figyelmeztetéshez, amikor egy szerelvényt vágásbiztosként jelöl meg, a könyvtárszerzőknek a SuppressTrimAnalysisWarnings MSBuild tulajdonságot false-re kell állítaniuk.

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

A vágáselemzési figyelmeztetések el nem nyomása figyelmeztetéseket fog eredményezni az egész alkalmazásra vonatkozóan, beleértve a saját kódját, a könyvtári kódot és az SDK-kódot.

Részletes figyelmeztetések megjelenítése

A metszéselemzés legfeljebb egy figyelmeztetést eredményez minden olyan összeállításhoz, amely egy PackageReferenceszármazik, ami azt jelzi, hogy az összeállítás belső elemei nem kompatibilisek a metszéssel. Kódtár-szerzőként, ha egy szerelvényt vágásbiztosként jelöl meg, az TrimmerSingleWarn MSBuild tulajdonság falsebeállításával engedélyezheti az egyes szerelvényekre vonatkozó figyelmeztetéseket:

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

Ez a beállítás az összes részletes figyelmeztetést megjeleníti ahelyett, hogy szerelvényenként egyetlen figyelmeztetésre összecsukja őket.