Udostępnij za pośrednictwem


Przygotowywanie aplikacji do wydania

Po zakodowaniu i przetestowaniu aplikacji należy przygotować pakiet do dystrybucji. Pierwszym zadaniem przygotowywania tego pakietu jest skompilowanie aplikacji do wydania, która wiąże się głównie z ustawieniem niektórych atrybutów aplikacji.

Aby skompilować aplikację do wydania, wykonaj następujące czynności:

  • Określ ikonę aplikacji — każda aplikacja platformy Xamarin.Android powinna mieć określoną ikonę aplikacji. Chociaż nie jest to technicznie konieczne, niektóre rynki, takie jak Google Play, wymagają tego.

  • Wersja aplikacji — ten krok obejmuje inicjowanie lub aktualizowanie informacji o wersji. Jest to ważne w przypadku przyszłych aktualizacji aplikacji i upewnienia się, że użytkownicy wiedzą, która wersja aplikacji została zainstalowana.

  • Zmniejsz pakiet APK — rozmiar końcowego pakietu APK można znacznie zmniejszyć przy użyciu konsolidatora Xamarin.Android w kodzie zarządzanym i narzędziu ProGuard w kodzie bajtowym Java.

  • Ochrona aplikacji — uniemożliwia użytkownikom lub osobom atakującym debugowanie, manipulowanie lub odwrotną inżynierię aplikacji przez wyłączenie debugowania, zaciemnianie kodu zarządzanego, dodawanie anty-debugowania i ochrony przed naruszeniami oraz używanie kompilacji natywnej.

  • Ustaw właściwości pakietu — właściwości pakietu pakietów kontrolują tworzenie pakietu aplikacji systemu Android (APK). Ten krok optymalizuje pakiet APK, chroni jego zasoby i modularyzuje opakowanie zgodnie z potrzebami. Ponadto możesz udostępnić użytkownikom pakiet aplikacji systemu Android zoptymalizowany pod kątem urządzeń.

  • Kompilowanie — ten krok kompiluje kod i zasoby, aby sprawdzić, czy jest on kompilowany w trybie wydania.

  • Archiwum publikowania — ten krok kompiluje aplikację i umieszcza ją w archiwum na potrzeby podpisywania i publikowania.

Każdy z tych kroków został opisany poniżej bardziej szczegółowo.

Określanie ikony aplikacji

Zdecydowanie zaleca się, aby każda aplikacja platformy Xamarin.Android określa ikonę aplikacji. Niektóre witryny marketplace aplikacji nie zezwalają na publikowanie aplikacji dla systemu Android bez nich. Właściwość Icon atrybutu Application służy do określania ikony aplikacji dla projektu platformy Xamarin.Android.

W programie Visual Studio 2017 lub nowszym określ ikonę aplikacji za pomocą sekcji Manifest systemu Android właściwości projektu, jak pokazano na poniższym zrzucie ekranu:

Set the application icon

W tych przykładach odwołuje się do pliku ikony znajdującego się w folderze Resources/drawable/icon.png (pamiętaj, @drawable/icon że rozszerzenie .png nie jest uwzględnione w nazwie zasobu). Ten atrybut można również zadeklarować w pliku Properties\AssemblyInfo.cs, jak pokazano w tym przykładowym fragmencie kodu:

[assembly: Application(Icon = "@drawable/icon")]

using Android.App Zwykle jest deklarowany w górnej części AssemblyInfo.cs (przestrzeń nazw atrybutu Application to Android.App); jednak może być konieczne dodanie tej using instrukcji, jeśli nie jest jeszcze obecny.

Wersja aplikacji

Przechowywanie wersji jest ważne w przypadku konserwacji i dystrybucji aplikacji systemu Android. Bez jakiegoś rodzaju przechowywania wersji trudno jest określić, czy lub jak należy zaktualizować aplikację. Aby ułatwić przechowywanie wersji, system Android rozpoznaje dwa różne typy informacji:

  • Numer wersji — wartość całkowita (używana wewnętrznie przez system Android i aplikację), która reprezentuje wersję aplikacji. Większość aplikacji zaczyna się od tej wartości ustawionej na 1, a następnie zwiększa się wraz z każdą kompilacją. Ta wartość nie ma relacji ani koligacji z atrybutem nazwy wersji (patrz poniżej). Aplikacje i usługi publikowania nie powinny wyświetlać tej wartości użytkownikom. Ta wartość jest przechowywana w pliku AndroidManifest.xml jako android:versionCode.

  • Nazwa wersji — ciąg używany tylko do przekazywania informacji użytkownikowi o wersji aplikacji (zgodnie z instalacją na określonym urządzeniu). Nazwa wersji ma być wyświetlana użytkownikom lub w sklepie Google Play. Ten ciąg nie jest używany wewnętrznie przez system Android. Nazwa wersji może być dowolną wartością ciągu, która pomoże użytkownikowi zidentyfikować kompilację zainstalowaną na urządzeniu. Ta wartość jest przechowywana w pliku AndroidManifest.xml jako android:versionName.

W programie Visual Studio te wartości można ustawić w sekcji Manifest systemu Android we właściwościach projektu, jak pokazano na poniższym zrzucie ekranu:

Set the version number

Zmniejszanie pakietu APK

Zestawy API platformy Xamarin.Android można zmniejszyć za pomocą kombinacji konsolidatora platformy Xamarin.Android, która usuwa niepotrzebny kod zarządzany , oraz narzędzie ProGuard z zestawu Sdk systemu Android, które usuwa nieużywany kod bajtowy Java. Proces kompilacji najpierw używa konsolidatora Xamarin.Android do optymalizacji aplikacji na poziomie kodu zarządzanego (C#), a następnie używa narzędzia ProGuard (jeśli jest włączone) w celu optymalizacji pakietu APK na poziomie kodu bajtowego Języka Java.

Konfigurowanie konsolidatora

Tryb wydania wyłącza środowisko uruchomieniowe udostępnione i włącza łączenie, tak aby aplikacja dostarczała tylko elementy platformy Xamarin.Android wymagane w czasie wykonywania. Konsolidator na platformie Xamarin.Android używa analizy statycznej w celu określenia, które zestawy, typy i składowe typu są używane lub przywołysowane przez aplikację platformy Xamarin.Android. Konsolidator odrzuca następnie wszystkie nieużywane zestawy, typy i elementy członkowskie, które nie są używane (lub przywoływane). Może to spowodować znaczne zmniejszenie rozmiaru pakietu. Rozważmy na przykład przykład HelloWorld , który doświadcza 83% zmniejszenia końcowego rozmiaru pakietu APK:

  • Konfiguracja: Brak — rozmiar Xamarin.Android 4.2.5 = 17,4 MB.

  • Konfiguracja: Tylko zestawy SDK — rozmiar zestawu Xamarin.Android 4.2.5 = 3,0 MB.

Ustaw opcje konsolidatora za pomocą sekcji Opcje systemu Android we właściwościach projektu:

Linker options

Menu rozwijane Łączenie zawiera następujące opcje kontrolowania konsolidatora:

  • Brak — spowoduje to wyłączenie konsolidatora; nie zostanie wykonane żadne łączenie.

  • Tylko zestawy SDK — spowoduje to połączenie tylko zestawów wymaganych przez platformę Xamarin.Android. Inne zestawy nie będą połączone.

  • Zestawy sdk i zestawy użytkowników — spowoduje to połączenie wszystkich zestawów wymaganych przez aplikację, a nie tylko tych wymaganych przez platformę Xamarin.Android.

Łączenie może spowodować pewne niezamierzone skutki uboczne, dlatego ważne jest, aby aplikacja była ponownie testowana w trybie wydania na urządzeniu fizycznym.

ProGuard

ProGuard to narzędzie zestawu SDK systemu Android, które łączy i zaciemnia kod Java. Aplikacja ProGuard jest zwykle używana do tworzenia mniejszych aplikacji przez zmniejszenie śladu dużych dołączonych bibliotek (takich jak usługi Google Play) w zestawie APK. Narzędzie ProGuard usuwa nieużywany kod bajtowy Java, co sprawia, że wynikowa aplikacja jest mniejsza. Na przykład użycie narzędzia ProGuard w małych aplikacjach platformy Xamarin.Android zwykle osiąga około 24% zmniejszenie rozmiaru — użycie narzędzia ProGuard w przypadku większych aplikacji z wieloma zależnościami biblioteki zwykle osiąga jeszcze większy rozmiar.

ProGuard nie jest alternatywą dla konsolidatora Xamarin.Android. Konsolidator Xamarin.Android łączy kod zarządzany , a narzędzie ProGuard łączy kod bajtowy Java. Proces kompilacji najpierw używa konsolidatora Xamarin.Android do optymalizacji zarządzanego kodu (C#) w aplikacji, a następnie używa narzędzia ProGuard (jeśli jest włączone) w celu zoptymalizowania pakietu APK na poziomie kodu bajtowego Języka Java.

Po zaznaczeniu opcji Włącz narzędzie ProGuard platforma Xamarin.Android uruchamia narzędzie ProGuard w wynikowym pliku APK. Plik konfiguracji narzędzia ProGuard jest generowany i używany przez usługę ProGuard w czasie kompilacji. Platforma Xamarin.Android obsługuje również niestandardowe akcje kompilacji ProguardConfiguration . Możesz dodać niestandardowy plik konfiguracji Narzędzia ProGuard do projektu, kliknąć go prawym przyciskiem myszy i wybrać go jako akcję kompilacji, jak pokazano w tym przykładzie:

Funkcja ProGuard jest domyślnie wyłączona. Opcja Włącz proguard jest dostępna tylko wtedy, gdy projekt jest ustawiony na tryb wydania. Wszystkie akcje kompilacji Narzędzia ProGuard są ignorowane, chyba że zaznaczono opcję Włącz funkcję ProGuard . Konfiguracja Xamarin.Android ProGuard nie zaciemnia pliku APK i nie można włączyć zaciemnienia, nawet w przypadku plików konfiguracji niestandardowych. Jeśli chcesz użyć zaciemnienia, zobacz Application Protection with Dotfuscator (Ochrona aplikacji za pomocą narzędzia Dotfuscator).

Aby uzyskać bardziej szczegółowe informacje na temat korzystania z narzędzia ProGuard, zobacz ProGuard.

Ochrona aplikacji

Wyłączanie debugowania

Podczas opracowywania aplikacji systemu Android debugowanie odbywa się przy użyciu protokołu Java Debug Wire Protocol (JDWP). Jest to technologia umożliwiająca narzędziom takim jak adb komunikowanie się z maszyną wirtualną JVM na potrzeby debugowania. Zestaw JDWP jest domyślnie włączony dla kompilacji debugowania aplikacji platformy Xamarin.Android. Chociaż JDWP jest ważne podczas opracowywania, może stanowić problem z zabezpieczeniami dla wydanych aplikacji.

Ważne

Zawsze wyłączaj stan debugowania w wydanej aplikacji, ponieważ jest to możliwe (za pośrednictwem JDWP), aby uzyskać pełny dostęp do procesu Java i wykonać dowolny kod w kontekście aplikacji, jeśli ten stan debugowania nie jest wyłączony.

Manifest systemu Android zawiera android:debuggable atrybut, który kontroluje, czy aplikacja może być debugowana. Dobrym rozwiązaniem jest ustawienie atrybutu android:debuggable na false. Najprostszym sposobem na to jest dodanie instrukcji kompilacji warunkowej w AssemblyInfo.cs:

#if DEBUG
[assembly: Application(Debuggable=true)]
#else
[assembly: Application(Debuggable=false)]
#endif

Pamiętaj, że kompilacje debugowania automatycznie ustawiają pewne uprawnienia, aby ułatwić debugowanie (np . Internet i ReadExternalStorage). Kompilacje wydania używają jednak tylko uprawnień, które jawnie konfigurujesz. Jeśli okaże się, że przejście do kompilacji wydania powoduje utratę uprawnień, które było dostępne w kompilacji debugowania, sprawdź, czy jawnie włączono to uprawnienie na liście Wymagane uprawnienia zgodnie z opisem w sekcji Uprawnienia.

Ochrona aplikacji za pomocą programu Dotfuscator

Nawet w przypadku wyłączenia debugowania osoby atakujące mogą ponownie spakować aplikację, dodając lub usuwając opcje konfiguracji lub uprawnienia. Dzięki temu mogą oni odtwarzać, debugować lub modyfikować aplikację. Program Dotfuscator Community Edition (CE) może służyć do zaciemniania kodu zarządzanego i wstrzykiwania kodu wykrywania stanu zabezpieczeń środowiska uruchomieniowego do aplikacji platformy Xamarin.Android w czasie kompilacji w celu wykrywania i reagowania, czy aplikacja jest uruchomiona na urządzeniu z odblokowanym dostępem do konta root.

Program Dotfuscator CE jest dołączony do programu Visual Studio 2017. Aby użyć programu Dotfuscator, kliknij pozycję Narzędzia > Przedemptive Protection — Dotfuscator.

Aby skonfigurować program Dotfuscator CE, zobacz Using Dotfuscator Community Edition with Xamarin (Korzystanie z programu Dotfuscator Community Edition z platformą Xamarin). Po skonfigurowaniu programu Dotfuscator CE będzie automatycznie chronić każdą utworzoną kompilację.

Tworzenie pakietów zestawów w kod natywny

Po włączeniu tej opcji zestawy są umieszczane w natywnej bibliotece udostępnionej. Dzięki temu zestawy mogą być kompresowane, zezwalając na mniejsze .apk pliki. Kompresja zestawu zapewnia również minimalną formę zaciemnienia; takie zaciemnianie nie powinno być uzależnione od.

Ta opcja wymaga licencji Enterprise i jest dostępna tylko wtedy, gdy opcja Użyj szybkiego wdrażania jest wyłączona. Zestawy pakietów do kodu natywnego są domyślnie wyłączone.

Należy pamiętać, że opcja Pakiet do kodu natywnego nie oznacza, że zestawy są kompilowane w kodzie natywnym. Nie można używać kompilacji AOT do kompilowania zestawów w kodzie natywnym.

Kompilacja AOT

Opcja Kompilacja AOT (na stronie Właściwości pakowania) umożliwia kompilację zestawów przed czasem (AOT). Po włączeniu tej opcji obciążenie uruchamiania just in time (JIT) jest zminimalizowane przez wstępne komkompilowanie zestawów przed środowiskiem uruchomieniowym. Wynikowy kod natywny jest zawarty w pliku APK wraz z zestawami bez kompilacji. Powoduje to krótszy czas uruchamiania aplikacji, ale kosztem nieco większych rozmiarów apk.

Opcja Kompilacja AOT wymaga licencji Enterprise lub nowszej. Kompilacja AOT jest dostępna tylko wtedy, gdy projekt jest skonfigurowany dla trybu wydania i jest domyślnie wyłączony. Aby uzyskać więcej informacji na temat kompilacji AOT, zobacz AOT.

Optymalizacja kompilatora LLVM

Funkcja LLVM Optymalizowanie kompilatora tworzy mniejszy i szybszy skompilowany kod i konwertuje skompilowane zestawy AOT na kod natywny, ale kosztem wolniejszych czasów kompilacji. Kompilator LLVM jest domyślnie wyłączony. Aby użyć kompilatora LLVM, należy najpierw włączyć opcję Kompilacja AOT (na stronie Właściwości pakowania).

Uwaga

Opcja Optymalizowanie kompilatora LLVM wymaga licencji Enterprise.

Ustawianie właściwości tworzenia pakietów

Właściwości pakowania można ustawić w sekcji Opcje projektu Android Właściwości, jak pokazano na poniższym zrzucie ekranu:

Packaging Properties

Wiele z tych właściwości, takich jak Używanie środowiska uruchomieniowego udostępnionego i Używanie szybkiego wdrażania, jest przeznaczonych do trybu debugowania . Jeśli jednak aplikacja jest skonfigurowana dla trybu wydania, istnieją inne ustawienia, które określają, jak aplikacja jest zoptymalizowana pod kątem rozmiaru i szybkości wykonywania, jak jest chroniona przed manipulowaniem i jak można ją spakować w celu obsługi różnych architektur i ograniczeń rozmiaru.

Określanie obsługiwanych architektur

Podczas przygotowywania aplikacji platformy Xamarin.Android do wydania należy określić obsługiwane architektury procesora CPU. Pojedynczy plik APK może zawierać kod maszyny do obsługi wielu, różnych architektur. Aby uzyskać szczegółowe informacje na temat obsługi wielu architektur procesora CPU, zobacz Architektury procesora CPU.

Generowanie jednego pakietu (. APK) na wybraną ABI

Po włączeniu tej opcji dla każdego z obsługiwanych interfejsów ABI zostanie utworzony jeden plik APK (wybrany na karcie Zaawansowane , zgodnie z opisem w temacie Architektury procesora) zamiast pojedynczego, dużego pakietu APK dla wszystkich obsługiwanych interfejsów ABI. Ta opcja jest dostępna tylko wtedy, gdy projekt jest skonfigurowany dla trybu wydania i jest domyślnie wyłączony.

Multi-Dex

Po włączeniu opcji Włącz multi-Dex narzędzia zestawu SDK systemu Android są używane do obejścia limitu metody 65K formatu pliku dex . Ograniczenie metody 65K opiera się na liczbie metod Języka Java, do których odwołuje się aplikacja (w tym w bibliotekach, od których zależy aplikacja) — nie jest oparta na liczbie metod napisanych w kodzie źródłowym. Jeśli aplikacja definiuje tylko kilka metod, ale używa wielu (lub dużych bibliotek), możliwe, że limit 65K zostanie przekroczony.

Istnieje możliwość, że aplikacja nie używa każdej metody w każdej bibliotece, do których się odwołuje; w związku z tym istnieje możliwość, że narzędzie takie jak ProGuard (patrz powyżej) może usunąć nieużywane metody z kodu. Najlepszym rozwiązaniem jest włączenie włączania funkcji Multi-Dex tylko wtedy, gdy jest to absolutnie konieczne, tj. aplikacja nadal odwołuje się do ponad 65 000 metod Języka Java nawet po użyciu narzędzia ProGuard.

Aby uzyskać więcej informacji na temat funkcji Multi-Dex, zobacz Configure Apps with Over 64K Methods (Konfigurowanie aplikacji za pomocą metod ponad 64K).

Pakiety aplikacji systemu Android

Pakiety aplikacji różnią się od zestawów API, ponieważ nie można ich wdrażać bezpośrednio na urządzeniu. Zamiast tego jest to format, który ma zostać przekazany ze wszystkimi skompilowanymi kodem i zasobami. Po przekazaniu podpisanego pakietu aplikacji sklep Google Play będzie miał wszystko, czego potrzebuje do skompilowania i podpisania zestawów API aplikacji, a następnie udostępni je użytkownikom przy użyciu usługi Dynamic Delivery.

Aby włączyć obsługę pakietów aplikacji systemu Android, musisz wyrazić zgodę na bundle wartość właściwości Format pakietu systemu Android w opcjach projektu systemu Android. Przed wykonaniem tej czynności upewnij się, że projekt zostanie zmieniony na konfigurację Release , ponieważ pakiety aplikacji są przeznaczone tylko dla pakietów wydań.

Teraz możesz wygenerować pakiet aplikacji, postępując zgodnie z przepływem archiwum. Spowoduje to wygenerowanie pakietu aplikacji dla aplikacji.

Aby uzyskać więcej informacji na temat pakietów aplikacji systemu Android, zobacz Pakiety aplikacji systemu Android.

Kompiluj

Po zakończeniu wszystkich powyższych kroków aplikacja jest gotowa do kompilacji. Wybierz pozycję Kompiluj > ponownie rozwiązanie , aby sprawdzić, czy kompiluje się pomyślnie w trybie wydania. Należy pamiętać, że ten krok nie generuje jeszcze pakietu APK.

Podpisywanie pakietu aplikacji zawiera bardziej szczegółowe omówienie tworzenia pakietów i logowania.

Archiwum do publikowania

Aby rozpocząć proces publikowania, kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań i wybierz element menu kontekstowego Archiwum... :

Archive app

Archiwum... uruchamia Menedżera archiwum i rozpoczyna proces archiwizowania pakietu aplikacji, jak pokazano na poniższym zrzucie ekranu:

Archive Manager

Innym sposobem utworzenia archiwum jest kliknięcie prawym przyciskiem myszy rozwiązania w Eksplorator rozwiązań i wybranie pozycji Zarchiwizuj wszystko..., które kompiluje rozwiązanie i archiwizuje wszystkie projekty platformy Xamarin, które mogą wygenerować archiwum:

Archive All

Zarówno Archiwum, jak i Zarchiwizujwszystkie automatycznie uruchom Menedżera archiwum. Aby uruchomić Menedżera archiwum bezpośrednio, kliknij element menu Narzędzia > Archiwum Menedżera... :

Launch Archive Manager

Archiwa rozwiązania w dowolnym momencie, klikając prawym przyciskiem myszy węzeł Rozwiązanie i wybierając pozycję Wyświetl archiwa:

View Archives

Menedżer archiwum

Menedżer archiwum składa się z okienka Lista rozwiązań, listy archiwów i panelu szczegółów:

Archive Manager Panes

Na liście rozwiązań są wyświetlane wszystkie rozwiązania z co najmniej jednym zarchiwizowanym projektem. Lista rozwiązań zawiera następujące sekcje:

  • Bieżące rozwiązanie — wyświetla bieżące rozwiązanie. Należy pamiętać, że ten obszar może być pusty, jeśli bieżące rozwiązanie nie ma istniejącego archiwum.
  • Wszystkie archiwa — wyświetla wszystkie rozwiązania, które mają archiwum.
  • Pole tekstowe wyszukiwania (u góry) — filtruje rozwiązania wymienione na liście Wszystkie archiwa zgodnie z ciągiem wyszukiwania wprowadzonym w polu tekstowym.

Lista archiwów zawiera listę wszystkich archiwów dla wybranego rozwiązania. Lista archiwów zawiera następujące sekcje:

  • Wybrana nazwa rozwiązania — wyświetla nazwę rozwiązania wybranego na liście rozwiązań. Wszystkie informacje wyświetlane na liście archiwów odnoszą się do tego wybranego rozwiązania.
  • Filtr platform — to pole umożliwia filtrowanie archiwów według typu platformy (np. iOS lub Android).
  • Zarchiwizowane elementy — lista archiwów dla wybranego rozwiązania. Każdy element na tej liście zawiera nazwę projektu, datę utworzenia i platformę. Może również wyświetlać dodatkowe informacje, takie jak postęp podczas archiwizowania lub publikowania elementu.

Panel szczegółów zawiera dodatkowe informacje o każdym archiwum. Umożliwia również użytkownikowi uruchomienie przepływu pracy dystrybucji lub otwarcie folderu, w którym została utworzona dystrybucja. Sekcja Komentarze do kompilacji umożliwia uwzględnienie komentarzy kompilacji w archiwum.

Dystrybucja

Gdy zarchiwizowana wersja aplikacji jest gotowa do opublikowania, wybierz archiwum w Menedżerze archiwum i kliknij przycisk Rozpowszechnij... :

Distribute button

Okno dialogowe Kanał dystrybucji zawiera informacje o aplikacji, wskazanie postępu przepływu pracy dystrybucji i wybór kanałów dystrybucji. W pierwszym uruchomieniu są prezentowane dwie opcje:

Select Distribution Channel

Można wybrać jeden z następujących kanałów dystrybucji:

  • Ad-Hoc — zapisuje podpisany plik APK na dysku, który można załadować bezpośrednio na urządzenia z systemem Android. Kontynuuj podpisywanie pakietu aplikacji, aby dowiedzieć się, jak utworzyć tożsamość podpisywania systemu Android, utworzyć nowy certyfikat podpisywania dla aplikacji systemu Android i opublikować wersję ad hoc aplikacji na dysku. Jest to dobry sposób na utworzenie pakietu APK do testowania.

  • Google Play — publikuje podpisany plik APK w sklepie Google Play. Kontynuuj publikowanie w sklepie Google Play, aby dowiedzieć się, jak podpisać i opublikować plik APK w sklepie Google Play.