Udostępnij za pośrednictwem


ProGuard

Xamarin.Android ProGuard to narzędzie do zmniejszania, optymalizatora i weryfikatora klasy Java. Wykrywa i usuwa nieużywany kod, analizuje i optymalizuje kod bajtowy. W tym przewodniku wyjaśniono, jak działa narzędzie ProGuard, jak ją włączyć w projekcie i jak go skonfigurować. Zawiera również kilka przykładów konfiguracji narzędzia ProGuard.

Omówienie

Narzędzie ProGuard wykrywa i usuwa nieużywane klasy, pola, metody i atrybuty z spakowanej aplikacji. Może to zrobić nawet w przypadku bibliotek, do których odwołuje się odwołanie (może to pomóc uniknąć limitu odwołania 64k). Narzędzie ProGuard z zestawu Android SDK zoptymalizuje również kod bajtowy i usunie nieużywane instrukcje dotyczące kodu. Narzędzie ProGuard odczytuje wejściowe pliki jar , a następnie zmniejsza, optymalizuje je i wstępnie weryfikuje; zapisuje wyniki w co najmniej jednym wyjściowym pliku jar.

Aplikacja ProGuard przetwarza dane wejściowe apk, wykonując następujące czynności:

  1. Krok zmniejszania — funkcja ProGuard rekursywnie określa, które klasy i składowe klas są używane. Wszystkie inne klasy i składowe klas są odrzucane.

  2. Krok optymalizacji — program ProGuard dodatkowo optymalizuje kod. Wśród innych optymalizacji, klas i metod, które nie są punktami wejścia, można dokonać prywatnych, statycznych lub końcowych, nieużywanych parametrów można usunąć, a niektóre metody mogą być podkreślone.

  3. Krok zaciemniania — w natywnym tworzeniu aplikacji dla systemu Android funkcja ProGuard zmienia nazwy klas i składowych klas, które nie są punktami wejścia. Zachowywanie punktów wejścia gwarantuje, że będą one nadal dostępne przy użyciu ich oryginalnych nazw. Jednak ten krok nie jest obsługiwany przez platformę Xamarin.Android, ponieważ aplikacja jest kompilowana w dół do języka pośredniego (IL).

  4. Krok preweryfikacji — przeprowadza kontrole kodów bajtów Java przed środowiskiem uruchomieniowym i dodawać adnotacje do plików klas, aby korzystać z maszyny wirtualnej Java. Jest to jedyny krok, który nie musi znać punktów wejścia.

Każdy z tych kroków jest opcjonalny. Jak wyjaśniono w następnej sekcji, narzędzie Xamarin.Android ProGuard używa tylko podzestawu tych kroków.

ProGuard na platformie Xamarin.Android

Konfiguracja narzędzia ProGuard platformy Xamarin.Android nie zaciemnia pliku APK. W rzeczywistości nie można włączyć zaciemnienia za pośrednictwem narzędzia ProGuard (nawet za pomocą niestandardowych plików konfiguracji). W związku z tym funkcja ProGuard platformy Xamarin.Android wykonuje tylko kroki zmniejszania i optymalizacji :

Shrinking and optimization steps

Ważnym elementem, który należy znać z wyprzedzeniem przed rozpoczęciem korzystania z narzędzia ProGuard, jest sposób jego działania w procesie kompilacji Xamarin.Android . Ten proces używa dwóch oddzielnych kroków:

  1. Xamarin Android Linker

  2. ProGuard

Każdy z tych kroków jest opisany w dalszej części.

Krok konsolidatora

Konsolidator Xamarin.Android wykorzystuje analizę statyczną aplikacji w celu określenia następujących elementów:

  • Które zestawy są rzeczywiście używane.

  • Które typy są rzeczywiście używane.

  • Które elementy członkowskie są rzeczywiście używane.

Konsolidator będzie zawsze uruchamiany przed krokiem Narzędzia ProGuard. W związku z tym konsolidator może usunąć zestaw/typ/element członkowski, na którym można oczekiwać uruchomienia narzędzia ProGuard. (Aby uzyskać więcej informacji na temat łączenia w środowisku Xamarin.Android, zobacz Łączenie w systemie Android).

Krok ProGuard

Po pomyślnym zakończeniu kroku konsolidatora ProGuard zostanie uruchomiona w celu usunięcia nieużywanego kodu bajtowego Języka Java. Jest to krok, który optymalizuje plik APK.

Korzystanie z narzędzia ProGuard

Aby użyć narzędzia ProGuard w projekcie aplikacji, musisz najpierw włączyć usługę ProGuard. Następnie możesz zezwolić procesowi kompilacji platformy Xamarin.Android na użycie domyślnego pliku konfiguracji narzędzia ProGuard lub utworzyć własny niestandardowy plik konfiguracji narzędzia ProGuard do użycia.

Włączanie narzędzia ProGuard

Aby włączyć aplikację ProGuard w projekcie aplikacji, wykonaj następujące kroki:

  1. Upewnij się, że projekt został ustawiony na konfigurację wydania (jest to ważne, ponieważ konsolidator musi działać w celu uruchomienia narzędzia ProGuard):

    Select Release configuration

  2. Wybierz pozycję ProGuard z listy rozwijanej Zmniejszanie kodu w oknie Właściwości > opcji systemu Android:

    Proguard code shrinker selected

W przypadku większości aplikacji platformy Xamarin.Android domyślny plik konfiguracji Narzędzia ProGuard dostarczony przez platformę Xamarin.Android będzie wystarczający do usunięcia wszystkich (i tylko) nieużywanego kodu. Aby wyświetlić domyślną konfigurację narzędzia ProGuard, otwórz plik w folderze obj\Release\proguard\proguard_xamarin.cfg.

Poniższy przykład ilustruje typowy wygenerowany plik proguard_xamarin.cfg :

# This is Xamarin-specific (and enhanced) configuration.

-dontobfuscate

-keep class mono.MonoRuntimeProvider { *; <init>(...); }
-keep class mono.MonoPackageManager { *; <init>(...); }
-keep class mono.MonoPackageManager_Resources { *; <init>(...); }
-keep class mono.android.** { *; <init>(...); }
-keep class mono.java.** { *; <init>(...); }
-keep class mono.javax.** { *; <init>(...); }
-keep class opentk.platform.android.AndroidGameView { *; <init>(...); }
-keep class opentk.GameViewBase { *; <init>(...); }
-keep class opentk_1_0.platform.android.AndroidGameView { *; <init>(...); }
-keep class opentk_1_0.GameViewBase { *; <init>(...); }

-keep class android.runtime.** { <init>(***); }
-keep class assembly_mono_android.android.runtime.** { <init>(***); }
# hash for android.runtime and assembly_mono_android.android.runtime.
-keep class md52ce486a14f4bcd95899665e9d932190b.** { *; <init>(...); }
-keepclassmembers class md52ce486a14f4bcd95899665e9d932190b.** { *; <init>(...); }

# Android's template misses fluent setters...
-keepclassmembers class * extends android.view.View {
   *** set*(***);
}

# also misses those inflated custom layout stuff from xml...
-keepclassmembers class * extends android.view.View {
   <init>(android.content.Context,android.util.AttributeSet);
   <init>(android.content.Context,android.util.AttributeSet,int);
}

W następnej sekcji opisano sposób tworzenia dostosowanego pliku konfiguracji narzędzia ProGuard.

Dostosowywanie narzędzia ProGuard

Opcjonalnie możesz dodać niestandardowy plik konfiguracji Narzędzia ProGuard, aby mieć większą kontrolę nad narzędziami ProGuard. Na przykład możesz jawnie poinformować proguard, które klasy mają być zachowywane. W tym celu utwórz nowy plik cfg i zastosuj ProGuardConfiguration akcję kompilacji w okienku Właściwości Eksplorator rozwiązań:

ProguardConfiguration build action selected

Należy pamiętać, że ten plik konfiguracji nie zastępuje pliku Xamarin.Android proguard_xamarin.cfg , ponieważ oba są używane przez narzędzie ProGuard.

Mogą wystąpić przypadki, w których usługa ProGuard nie może prawidłowo przeanalizować aplikacji; potencjalnie może usunąć kod, którego aplikacja potrzebuje. W takim przypadku możesz dodać wiersz do niestandardowego -keep pliku konfiguracji narzędzia ProGuard:

-keep public class MyClass

W tym przykładzie MyClass ustawiono rzeczywistą nazwę klasy, którą ma pominąć ProGuard.

Możesz również zarejestrować własne nazwy przy [Register] użyciu adnotacji i użyć tych nazw, aby dostosować reguły narzędzia ProGuard. Można rejestrować nazwy kart, widoków, emisjiReceivers, usług, ContentProviders, Działań i Fragmentów. Aby uzyskać więcej informacji na temat używania atrybutu niestandardowego, zobacz Praca z interfejsem [Register] JNI.

Opcje narzędzia ProGuard

Narzędzie ProGuard oferuje wiele opcji, które można skonfigurować w celu zapewnienia bardziej precyzyjnej kontroli nad jego działaniem. Podręcznik ProGuard zawiera kompletną dokumentację referencyjną dotyczącą korzystania z narzędzia ProGuard.

Platforma Xamarin.Android obsługuje następujące opcje narzędzia ProGuard:

Następujące opcje są ignorowane przez platformę Xamarin.Android:

ProGuard i Android Nougat

Jeśli próbujesz użyć narzędzia ProGuard w systemie Android 7.0 lub nowszym, musisz pobrać nowszą wersję narzędzia ProGuard, ponieważ zestaw Android SDK nie dostarcza nowej wersji zgodnej z zestawem JDK 1.8.

Możesz użyć tego pakietu NuGet, aby zainstalować nowszą wersję programu proguard.jar. Aby uzyskać więcej informacji na temat aktualizowania domyślnego zestawu Android SDK proguard.jar, zobacz tę dyskusję na temat rozwiązania Stack Overflow .

Wszystkie wersje narzędzia ProGuard można znaleźć na stronie SourceForge.

Przykładowe konfiguracje narzędzia ProGuard

Poniżej wymieniono dwa przykładowe pliki konfiguracji narzędzia ProGuard. Należy pamiętać, że w takich przypadkach proces kompilacji platformy Xamarin.Android dostarczy pliki jar danych wejściowych, wyjściowych i biblioteki . W związku z tym można skupić się na innych opcjach, takich jak -keep.

Proste działanie systemu Android

Poniższy przykład ilustruje konfigurację prostego działania systemu Android:

-injars  bin/classes
-outjars bin/classes-processed.jar
-libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic

-keep public class mypackage.MyActivity

Kompletna aplikacja systemu Android

Poniższy przykład ilustruje konfigurację kompletnej aplikacji systemu Android:

-injars  bin/classes
-injars  libs
-outjars bin/classes-processed.jar
-libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * implements android.os.Parcelable {
static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
public static <fields>;
}

ProGuard i proces kompilacji platformy Xamarin.Android

W poniższych sekcjach opisano sposób działania narzędzia ProGuard podczas kompilacji wersji platformy Xamarin.Android.

Jakie polecenie jest uruchomione za pomocą narzędzia ProGuard?

ProGuard jest po prostu dostarczany z zestawem .jar Android SDK. W związku z tym jest wywoływany w poleceniu:

java -jar proguard.jar options ...

Zadanie ProGuard

Zadanie ProGuard znajduje się wewnątrz zestawu Xamarin.Android.Build.Tasks.dll . Jest to część _CompileToDalvikWithDx celu, która jest częścią _CompileDex celu.

Poniższa lista zawiera przykład domyślnych parametrów generowanych po utworzeniu nowego projektu przy użyciu polecenia Plik > nowy projekt:

ProGuardJarPath = C:\Android\android-sdk\tools\proguard\lib\proguard.jar
AndroidSdkDirectory = C:\Android\android-sdk\
JavaToolPath = C:\Program Files (x86)\Java\jdk1.8.0_92\\bin
ProGuardToolPath = C:\Android\android-sdk\tools\proguard\
JavaPlatformJarPath = C:\Android\android-sdk\platforms\android-25\android.jar
ClassesOutputDirectory = obj\Release\android\bin\classes
AcwMapFile = obj\Release\acw-map.txt
ProGuardCommonXamarinConfiguration = obj\Release\proguard\proguard_xamarin.cfg
ProGuardGeneratedReferenceConfiguration = obj\Release\proguard\proguard_project_references.cfg
ProGuardGeneratedApplicationConfiguration = obj\Release\proguard\proguard_project_primary.cfg
ProGuardConfigurationFiles

    {sdk.dir}tools\proguard\proguard-android.txt;
    {intermediate.common.xamarin};
    {intermediate.references};
    {intermediate.application};
    ;

JavaLibrariesToEmbed = C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v7.0\mono.android.jar
ProGuardJarInput = obj\Release\proguard\__proguard_input__.jar
ProGuardJarOutput = obj\Release\proguard\__proguard_output__.jar
DumpOutput = obj\Release\proguard\dump.txt
PrintSeedsOutput = obj\Release\proguard\seeds.txt
PrintUsageOutput = obj\Release\proguard\usage.txt
PrintMappingOutput = obj\Release\proguard\mapping.txt

W następnym przykładzie pokazano typowe polecenie Narzędzia ProGuard uruchamiane ze środowiska IDE:

C:\Program Files (x86)\Java\jdk1.8.0_92\\bin\java.exe -jar C:\Android\android-sdk\tools\proguard\lib\proguard.jar -include obj\Release\proguard\proguard_xamarin.cfg -include obj\Release\proguard\proguard_project_references.cfg -include obj\Release\proguard\proguard_project_primary.cfg "-injars 'obj\Release\proguard\__proguard_input__.jar';'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v7.0\mono.android.jar'" "-libraryjars 'C:\Android\android-sdk\platforms\android-25\android.jar'" -outjars "obj\Release\proguard\__proguard_output__.jar" -optimizations !code/allocation/variable

Rozwiązywanie problemów

Problemy z plikiem

Podczas odczytu pliku konfiguracji narzędzia ProGuard może zostać wyświetlony następujący komunikat o błędzie:

Unknown option '-keep' in line 1 of file 'proguard.cfg'

Ten problem zwykle występuje w systemie Windows, ponieważ .cfg plik ma nieprawidłowe kodowanie. Usługa ProGuard nie może obsłużyć znacznika kolejności bajtów (BOM), który może być obecny w plikach tekstowych. Jeśli BOM jest obecny, proguard zakończy działanie z powyższym błędem.

Aby zapobiec temu problemowi, zmodyfikuj niestandardowy plik konfiguracji z edytora tekstów, który umożliwi zapisanie pliku bez modelu BOM. Aby rozwiązać ten problem, upewnij się, że edytor tekstów ma ustawioną wartość UTF-8. Na przykład edytor tekstów Notatnik++ może zapisywać pliki bez modelu BOM, wybierając kodowanie kodowania > w formacie UTF-8 bez BOM podczas zapisywania pliku.

Inne problemy

Na stronie Rozwiązywania problemów z narzędziem ProGuard omówiono typowe problemy, które mogą wystąpić (i rozwiązania) podczas korzystania z narzędzia ProGuard.

Podsumowanie

W tym przewodniku wyjaśniono, jak działa narzędzie ProGuard na platformie Xamarin.Android, jak ją włączyć w projekcie aplikacji i jak ją skonfigurować. Podano przykładowe konfiguracje narzędzia ProGuard i opisano rozwiązania typowych problemów. Aby uzyskać więcej informacji na temat narzędzia ProGuard i systemu Android, zobacz Zmniejszanie kodu i zasobów.