Podpisz plik APK. Publikujemy aplikacje w Google Play i zarabiamy miliony. Co zrobić, jeśli klucz zostanie zgubiony lub zhakowany

Czasami niektóre aplikacje na Androida z jakiegoś powodu nie odpowiadają użytkownikowi. Przykładem są irytujące reklamy. I tak się dzieje - wszyscy są dobrzy w programie, ale tylko tłumaczenie w nim jest albo krzywe, albo całkowicie nieobecne. Lub na przykład program jest próbny, ale nie ma możliwości uzyskania pełnej wersji. Jak zmienić sytuację?

Wstęp

W tym artykule porozmawiamy o tym, jak zdemontować plik APK za pomocą aplikacji, przyjrzeć się jego wewnętrznej strukturze, zdemontować i zdekompilować kod bajtowy, a także spróbować wprowadzić kilka zmian w aplikacjach, które mogą przynieść nam tę lub inną korzyść.

Aby zrobić to wszystko samodzielnie, będziesz potrzebować przynajmniej podstawowej znajomości języka Java, w którym pisane są aplikacje na Androida, oraz języka XML, który jest używany wszędzie w Androidzie – od opisu samej aplikacji i jej praw dostępu, po przechowywanie ciągów znaków który zostanie wyświetlony na ekranie. Będziesz także potrzebować umiejętności obsługi specjalistycznego oprogramowania konsoli.

Czym więc jest pakiet APK, w którym dystrybuowane jest absolutnie całe oprogramowanie dla Androida?

Dekompilacja aplikacji

W artykule pracowaliśmy tylko ze zdezasemblowanym kodem aplikacji, jednak jeśli wprowadzisz poważniejsze zmiany w dużych aplikacjach, zrozumienie małego kodu będzie znacznie trudniejsze. Na szczęście możemy zdekompilować kod dex do kodu Java, który choć nie jest oryginalny i nie da się go ponownie skompilować, jest znacznie łatwiejszy do odczytania i zrozumienia logiki aplikacji. Aby to zrobić, potrzebujemy dwóch narzędzi:

  • dex2jar - tłumacz kodu bajtowego Dalvik na kod bajtowy JVM, na podstawie którego możemy uzyskać kod Java;
  • jd-gui sam w sobie jest dekompilatorem, który pozwala uzyskać czytelny kod Java z kodu bajtowego JVM. Alternatywnie możesz użyć Jad (www.varanecas.com/jad); chociaż jest dość stary, w niektórych przypadkach generuje bardziej czytelny kod niż Jd-gui.

Należy ich używać w ten sposób. Najpierw uruchamiamy dex2jar, podając jako argument ścieżkę do pakietu apk:

%dex2jar.sh mail.apk

W rezultacie pakiet Java mail.jar pojawi się w bieżącym katalogu, który można już otworzyć w jd-gui, aby wyświetlić kod Java.

Aranżowanie pakietów APK i ich otrzymywanie

Pakiet aplikacji na Androida to zasadniczo zwykły plik ZIP, który nie wymaga żadnych specjalnych narzędzi do przeglądania zawartości i rozpakowywania. Wystarczy mieć archiwizator - 7zip dla Windowsa lub rozpakowanie konsoli w Linuksie. Ale chodzi o opakowanie. Co jest w środku? Wewnątrz mamy ogólnie następującą strukturę:

  • META-INF/- zawiera cyfrowy certyfikat aplikacji, poświadczający jej twórcę oraz sumy kontrolne plików pakietu;
  • res/ - różne zasoby, które aplikacja wykorzystuje w swojej pracy, takie jak obrazy, deklaratywny opis interfejsu i inne dane;
  • AndroidManifest.xml- opis aplikacji. Obejmuje to na przykład listę wymaganych uprawnień, wymaganą wersję Androida i wymaganą rozdzielczość ekranu;
  • klasy.dex- skompilowany kod bajtowy aplikacji dla maszyny wirtualnej Dalvik;
  • zasoby.arsc- także zasoby, ale innego rodzaju - w szczególności stringi (tak, ten plik może być użyty do rusyfikacji!).

Wymienione pliki i katalogi znajdują się, jeśli nie we wszystkich, to być może w zdecydowanej większości plików APK. Istnieje jednak kilka mniej popularnych plików/katalogów, o których warto wspomnieć:

  • aktywa- analog zasobów. Główna różnica polega na tym, że dostęp do zasobu wymaga znajomości jego identyfikatora, natomiast listę zasobów można uzyskać dynamicznie za pomocą metody AssetManager.list() w kodzie aplikacji;
  • lib- natywne biblioteki Linuksa napisane przy pomocy NDK (Native Development Kit).

Z tego katalogu korzystają producenci gier, gdzie umieszczają swój silnik gry napisany w C/C++, a także twórcy wysokowydajnych aplikacji (np. Google Chrome). Zrozumiał urządzenie. Ale jak uzyskać plik pakietu aplikacji będącej przedmiotem zainteresowania? Ponieważ nie jest możliwe pobranie plików APK z urządzenia bez rootowania (znajdują się one w katalogu / data / app), a rootowanie nie zawsze jest wskazane, istnieją co najmniej trzy sposoby na pobranie pliku aplikacji na komputer:

  • Rozszerzenie APK Downloader dla Chrome;
  • Prawdziwa aplikacja APK Leecher;
  • różne hostingi plików i warezniki.

Którego użyć, to kwestia gustu; wolimy korzystać z osobnych aplikacji, więc opiszemy użycie Real APK Leecher, zwłaszcza, że ​​​​jest napisany w Javie, a zatem będzie działał nawet w systemie Windows, nawet w nix.

Po uruchomieniu programu należy wypełnić trzy pola: E-mail, Hasło i Identyfikator urządzenia - oraz wybrać język. Pierwsze dwa to adres e-mail i hasło do konta Google, którego używasz na urządzeniu. Trzeci to identyfikator urządzenia, który można uzyskać, wybierając kod na dialerze # #8255## a następnie znalezienie wiersza Identyfikator urządzenia. Podczas wypełniania wystarczy podać identyfikator bez prefiksu android-.

Po wypełnieniu i zapisaniu często wyskakuje komunikat „Błąd podczas łączenia z serwerem”. Nie ma to nic wspólnego z Google Play, więc możesz je zignorować i poszukać pakietów, które Cię interesują.

Przegląd i modyfikacja

Powiedzmy, że znalazłeś interesujący Cię pakiet, pobrałeś go, rozpakowałeś... i kiedy próbowałeś wyświetlić plik XML, ze zdziwieniem stwierdziłeś, że plik nie jest plikiem tekstowym. Jak go zdekompilować i jak ogólnie pracować z pakietami? Czy naprawdę konieczne jest zainstalowanie SDK? Nie, nie musisz instalować SDK. W rzeczywistości do wszystkich kroków rozpakowywania, modyfikowania i pakowania pakietów APK potrzebne są następujące narzędzia:

  • Archiwizator ZIP do rozpakowywania i pakowania;
  • mały- asembler/deasembler kodu bajtowego maszyny wirtualnej Dalvik (code.google.com/p/smali);
  • mieszkanie- narzędzie do pakowania zasobów (domyślnie zasoby są przechowywane w postaci binarnej w celu optymalizacji wydajności aplikacji). Dołączone do Android SDK, ale można je uzyskać osobno;
  • sygnatariusz- narzędzie do cyfrowego podpisywania zmodyfikowanej paczki (bit.ly/Rmrv4M).

Ze wszystkich tych narzędzi można korzystać osobno, ale jest to niewygodne, dlatego lepiej jest korzystać z oprogramowania wyższego poziomu zbudowanego na ich podstawie. Jeśli korzystasz z systemu Linux lub Mac OS X, dostępne jest narzędzie o nazwie apktool . Pozwala rozpakować zasoby do ich pierwotnej postaci (w tym binarne pliki XML i arsc), odbudować pakiet ze zmodyfikowanymi zasobami, ale nie wie, jak podpisywać pakiety, więc będziesz musiał ręcznie uruchomić narzędzie podpisujące. Pomimo faktu, że narzędzie jest napisane w Javie, jego instalacja jest raczej niestandardowa. Najpierw musisz pobrać sam plik jar:

$ cd /tmp $ wget http://bit.ly/WC3OCz $ tar -xjf apktool1.5.1.tar.bz2

$ wget http://bit.ly/WRjEc7 $ tar -xjf apktool-install-linux-r05-ibot.tar.bz2

$ mv apktool.jar ~/bin $ mv apktool-install-linux-r05-ibot/* ~/bin $ export PATH=~/bin:$ PATH

Jeśli pracujesz w systemie Windows, istnieje do tego doskonałe narzędzie o nazwie Virtual Ten Studio , które również gromadzi wszystkie te narzędzia (w tym sam apktool), ale zamiast interfejsu CLI zapewnia użytkownikowi intuicyjny interfejs graficzny, za pomocą którego wykonuj operacje rozpakowywania, deasemblacji i dekompilacji za pomocą kilku kliknięć. To narzędzie jest Donation-ware, to znaczy czasami pojawiają się okna z propozycją uzyskania licencji, ale ostatecznie można to tolerować. Nie ma sensu tego opisywać, ponieważ interfejs można zrozumieć w kilka minut. Ale apktool, ze względu na swój konsolowy charakter, powinien zostać omówiony bardziej szczegółowo.


Rozważ opcje apktool. Krótko mówiąc, istnieją trzy główne polecenia: d (dekodowanie), b (kompilacja) i if (instalacja frameworka). Jeśli wszystko jest jasne przy pierwszych dwóch poleceniach, to co robi trzeci, operator warunkowy? Rozpakowuje określoną strukturę interfejsu użytkownika, która jest potrzebna podczas analizowania pakietu systemowego.

Rozważ najciekawsze opcje pierwszego polecenia:

  • -S- nie deasemblować plików dex;
  • -R- nie rozpakowuj zasobów;
  • -B- nie wstawiaj informacji debugowania do wyników dezasemblacji pliku dex;
  • --ścieżka-ramki- użyj określonej struktury interfejsu użytkownika zamiast wbudowanego narzędzia apktool. Rozważmy teraz kilka opcji dla polecenia b:
  • -F- wymuszony montaż bez sprawdzania zmian;
  • -A- określ ścieżkę do aapt (narzędzia do budowania archiwum APK), jeśli z jakiegoś powodu chcesz go użyć z innego źródła.

Korzystanie z apktool jest bardzo proste, wystarczy podać jedno z poleceń i ścieżkę do APK, na przykład:

$ apktool d mail.apk

Następnie wszystkie wyodrębnione i zdemontowane pliki pakietów pojawią się w katalogu poczty.

Przygotowanie. Wyłącz reklamy

Teoria jest oczywiście dobra, ale po co jest potrzebna, skoro nie wiemy, co zrobić z rozpakowaną paczką? Spróbujmy zastosować teorię na własną korzyść, a mianowicie modyfikujemy niektóre oprogramowanie, aby nie wyświetlało nam reklam. Na przykład niech to będzie Virtual Torch - wirtualna latarka. Dla nas to oprogramowanie jest idealne, ponieważ jest pełne irytujących reklam i jest na tyle proste, że nie zgubi się w gąszczu kodu.


Tak więc, korzystając z jednej z powyższych metod, pobierz aplikację z rynku. Jeśli zdecydujesz się skorzystać z Virtuous Ten Studio, wystarczy otworzyć plik APK w aplikacji i rozpakować go, dla którego utworzymy projekt (Plik -> Nowy projekt), a następnie wybrać Importuj plik z menu kontekstowego projektu. Jeśli twój wybór padł na apktool, wystarczy wykonać jedno polecenie:

$ apktool d com.kauf.particle.virtualtorch.apk

Następnie w katalogu com.kauf.particle.virtualtorch pojawi się drzewo plików, podobne do opisanego w poprzedniej sekcji, ale z dodatkowym katalogiem smali zamiast plików dex i plikiem apktool.yml. Pierwszy zawiera rozmontowany kod wykonywalnego pliku dex aplikacji, drugi zawiera informacje serwisowe potrzebne apktool do ponownego złożenia pakietu.

Pierwszym miejscem, w którym musimy szukać, jest oczywiście plik AndroidManifest.xml. I tutaj od razu spotykamy następującą linię:

Nietrudno się domyślić, że to ona odpowiada za nadawanie aplikacji uprawnień do korzystania z łącza internetowego. Tak naprawdę, jeśli chcemy po prostu pozbyć się reklam, najprawdopodobniej wystarczy nam zablokowanie dostępu aplikacji do Internetu. Spróbujmy to zrobić. Usuń określoną linię i spróbuj skompilować oprogramowanie za pomocą apktool:

$ apktool b com.kauf.particle.virtualtorch

Wynikowy plik APK pojawi się w katalogu com.kauf.particle.virtualtorch/build/. Jednak nie można go zainstalować, ponieważ nie posiada podpisu cyfrowego i sum kontrolnych plików (po prostu nie ma katalogu META-INF/). Musimy podpisać pakiet za pomocą narzędzia apk-signer. Wystrzelony. Interfejs składa się z dwóch zakładek - na pierwszej (Key Generator) tworzymy klucze, na drugiej (APK Signer) podpisujemy. Aby utworzyć nasz klucz prywatny, wypełnij następujące pola:

  • Plik docelowy- plik wyjściowy magazynu kluczy; zwykle przechowuje jedną parę kluczy;
  • Hasło I Potwierdzać- hasło do przechowywania;
  • Alias- nazwa klucza w repozytorium;
  • Hasło aliasu I Potwierdzać- tajne hasło klucza;
  • Ważność- Okres ważności (w latach). Wartość domyślna jest optymalna.

Pozostałe pola są na ogół opcjonalne - ale musisz wypełnić co najmniej jedno.


OSTRZEŻENIE

Aby podpisać aplikację za pomocą apk-signer, musisz zainstalować Android SDK i podać pełną ścieżkę do niego w ustawieniach aplikacji.

Wszystkie informacje są podane wyłącznie w celach informacyjnych. Ani redaktorzy, ani autor nie ponoszą odpowiedzialności za ewentualne szkody spowodowane przez materiały zawarte w tym artykule.

Teraz możesz podpisać plik APK tym kluczem. Na zakładce APK Signer wybierz nowo wygenerowany plik, wprowadź do niego hasło, alias klucza i hasło, a następnie odszukaj plik APK i odważnie kliknij przycisk „Podpisz”. Jeśli wszystko pójdzie dobrze, paczka zostanie podpisana.

INFORMACJE

Ponieważ podpisaliśmy paczkę własnym kluczem, będzie ona kolidować z oryginalną aplikacją, co oznacza, że ​​gdy spróbujemy zaktualizować oprogramowanie przez rynek, dostaniemy błąd.

Tylko oprogramowanie innych firm wymaga podpisu cyfrowego, więc jeśli modyfikujesz zainstalowane aplikacje systemowe, kopiując je do katalogu /system/app/, nie musisz ich podpisywać.

Następnie upuszczamy paczkę na smartfona, instalujemy i uruchamiamy. Voila, ogłoszenie zniknęło! Zamiast tego pojawił się jednak komunikat, że nie mamy internetu lub nie mamy odpowiednich uprawnień. Teoretycznie mogłoby to wystarczyć, ale wiadomość wygląda irytująco, a szczerze mówiąc, po prostu poszczęściło nam się z głupią aplikacją. Dobrze napisane oprogramowanie najprawdopodobniej wyjaśni swoje dane uwierzytelniające lub sprawdzi połączenie z Internetem, aw przeciwnym razie po prostu odmówi uruchomienia. Jak być w tym przypadku? Oczywiście edytuj kod.

Zazwyczaj autorzy aplikacji tworzą specjalne klasy do wyświetlania reklam i wywoływania metod tych klas podczas uruchamiania aplikacji lub jednej z jej „czynności” (w uproszczeniu ekranów aplikacji). Spróbujmy znaleźć te klasy. Wchodzimy do katalogu smali, potem com (w org jest tylko otwarta biblioteka graficzna cocos2d), potem kauf (dokładnie tam, bo tak się nazywa programista i tam jest cały jego kod) - i oto jest katalog marketingowy. W środku znajdziemy kilka plików z rozszerzeniem small. Są to klasy, a najbardziej godną uwagi z nich jest klasa Ad.smali, po której nazwie łatwo się domyślić, że wyświetla reklamy.

Moglibyśmy zmienić logikę jego działania, ale dużo prościej byłoby głupio usunąć wywołania którejkolwiek z jego metod z samej aplikacji. Dlatego wychodzimy z katalogu marketingowego i przechodzimy do sąsiedniego katalogu cząstek, a następnie do virtualtorch. Na szczególną uwagę zasługuje tutaj plik MainActivity.smali. Jest to standardowa klasa Androida, która jest generowana przez Android SDK i ustawiana jako punkt wejścia do aplikacji (analogicznie do głównej funkcji w C). Otwórz plik do edycji.

Wewnątrz znajduje się mały kod (lokalny asembler). Jest to dość mylące i trudne do odczytania ze względu na swój niski poziom, więc nie będziemy się go uczyć, ale po prostu znajdziemy wszystkie wzmianki o klasie Ad w kodzie i skomentujemy je. Wprowadzamy ciąg „Reklama” w wyszukiwaniu i przechodzimy do wiersza 25:

Prywatna reklama w terenie:Lcom/kauf/marketing/Ad;

Tutaj tworzona jest reklama terenowa do przechowywania obiektu klasy Ad. Komentujemy ustawiając znak ### przed linią. Kontynuujemy poszukiwania. Linia 423:

Nowa instancja v3, Lcom/kauf/marketing/Ad;

W tym miejscu powstaje obiekt. Komentujemy. Kontynuujemy poszukiwania i znajdujemy w liniach 433, 435, 466, 468, 738, 740, 800 i 802 wywołania metod klasy Ad. Komentujemy. Wygląda na to, że to jest to. Ratujemy. Teraz pakiet należy ponownie złożyć i sprawdzić pod kątem działania i obecności reklam. Dla czystości eksperymentu zwracamy usuniętą linię z AndroidManifest.xml, odbieramy paczkę, podpisujemy ją i instalujemy.

Nasza świnka morska. Widoczna reklama

op-pa! Reklama zniknęła dopiero podczas działania aplikacji, ale pozostała w menu głównym, które widzimy po uruchomieniu oprogramowania. Czekaj, ale punktem wejścia jest klasa MainActivity, a reklama zniknęła podczas działania aplikacji, ale pozostała w menu głównym, więc punkt wejścia jest inny? Aby ujawnić prawdziwy punkt wejścia, ponownie otwieramy plik AndroidManifest.xml. I tak, zawiera następujące wiersze:

Mówią nam (a przede wszystkim androidowi), że aktywność o nazwie Start powinna zostać uruchomiona w odpowiedzi na wygenerowanie intencji (zdarzenia) android.intent.action.MAIN z kategorii android.intent.category.LAUNCHER. To zdarzenie jest generowane po dotknięciu ikony aplikacji w programie uruchamiającym, więc definiuje punkt wejścia, a mianowicie klasę Start. Najprawdopodobniej programista najpierw napisał aplikację bez menu głównego, której punktem wejścia była standardowa klasa MainActivity, a następnie dodał nowe okno (aktywność) zawierające menu i opisane w klasie Start i ręcznie uczynił z niego wpis punkt.

Otwieramy plik Start.smali i ponownie szukamy wiersza „Ad”, w wierszach 153 i 155 znajdujemy wzmiankę o klasie FirstAd. Znajduje się również w kodzie źródłowym i sądząc po nazwie odpowiada za wyświetlanie reklam na ekranie głównym. Patrzymy dalej, jest tworzenie instancji klasy FirstAd i intencji, zgodnie z kontekstem związanym z tą instancją, a następnie etykieta cond_10, do której warunkowe przejście jest przeprowadzane dokładnie przed utworzeniem instancji klasy :

If-ne p1, v0, :cond_10 .line 74 nowa instancja v0, Landroid/content/Intent; ... :cond_10

Najprawdopodobniej program jakoś losowo oblicza, czy konieczne jest wyświetlanie reklam na ekranie głównym, a jeśli nie, przeskakuje bezpośrednio do cond_10. Ok, uprośćmy jej zadanie i zastąpmy przejście warunkowe przejściem bezwarunkowym:

#if-ne p1, v0, :cond_10 goto:cond_10

W kodzie nie ma już wzmianek o FirstAd, więc zamykamy plik i ponownie składamy naszą wirtualną latarkę za pomocą apktool. Skopiuj do smartfona, zainstaluj, uruchom. Voila, wszystkie reklamy zniknęły, gratulacje dla nas wszystkich.

Wyniki

Ten artykuł to tylko krótkie wprowadzenie do metod otwierania i modyfikowania aplikacji na Androida. Wiele problemów pozostało za kulisami, takich jak usuwanie ochrony, parsowanie zaciemnionego kodu, tłumaczenie i zastępowanie zasobów aplikacji, a także modyfikowanie aplikacji napisanych przy użyciu Android NDK. Mając jednak podstawową wiedzę, zrozumienie tego wszystkiego jest tylko kwestią czasu.

Ostatnia aktualizacja: 30.10.2015

Po utworzeniu aplikacji, przetestowaniu jej i debugowaniu możemy przystąpić do jej publikacji. Istotą publikacji jest utworzenie pliku z rozszerzeniem .apk, który będzie reprezentował aplikację i jej późniejsze umieszczenie w Google Play Market lub innych witrynach zewnętrznych. Domyślnie podczas procesu debugowania i tworzenia aplikacji plik apk jest już utworzony i możemy go znaleźć w folderze projektu wzdłuż ścieżki Nazwa_projektu\aplikacja\kompilacja\wyjścia\apk. Domyślnie plik ma nazwę app-debug.apk i reprezentuje wersję debugowania.

Ale do pełnej publikacji ten plik może nie wystarczyć. Musimy jeszcze trochę przygotować projekt do wydania. Aby to zrobić, określ w pliku manifestu dla elementu ustawione są atrybuty android:versionCode i android:versionName. Również w pliku manifestu element nie może zawierać atrybutu android:debuggable

Dodatkowo na tym etapie możesz ustawić ikonę aplikacji, która będzie wyświetlana na ekranie głównym gadżetu, nazwę aplikacji (atrybut android:label na elemencie), a także możesz ustawić umowę licencyjną.

Plik manifestu musi również określać nazwę pakietu (atrybut package elementu ), który będzie później używany w aplikacji. Domyślnie podczas tworzenia w Android Studio pakiety aplikacji zaczynają się od com.przyklad. Nie należy pozostawiać tej nazwy, ponieważ nazwa pakietu będzie służyć jako unikalny identyfikator dla Twojej aplikacji. Na przykład poniżej w moim przypadku nazwa pakietu to „com.maverics.eugene.telephonelist”:

Ponadto, jeśli w plikach z kodem java, nazwa pakietu na początku pliku musi również odpowiadać pakietowi aplikacji.

Ustalanie wymagań

Możesz także ustawić wymagania API w fazie przedpremierowej. Na przykład nasza aplikacja ma określoną minimalną wersję systemu operacyjnego Android, dzięki czemu możemy ustawić odpowiednie atrybuty elementu w pliku manifestu

    android:minSdkVersion - minimalna wersja Androida

    android:targetSdkVersion - optymalna wersja API

    android:maxSdkVersion - maksymalna wersja systemu

Załóżmy na przykład, że minimalna wersja Jelly Beans to 4.1.2, a optymalna wersja to KitKat 4.4.4:

//.............................

Podpis aplikacji

Kiedy wszystko jest gotowe, aplikacja na Androida musi zostać podpisana certyfikatem, dzięki któremu można zidentyfikować autora aplikacji. Kiedy testujemy aplikację, instalując ją za pomocą Android Studio na urządzeniu, jest ona podpisana automatycznie. Ale aby stworzyć wersję wydania, musimy wykonać dodatkową serię czynności.

Podczas tworzenia certyfikatu należy pamiętać, że podczas aktualizacji aplikacji system porówna certyfikaty starej i nowej wersji. A aktualizacja nastąpi, jeśli certyfikaty obu wersji będą zgodne. Jeśli jednak nowa wersja zostanie podpisana nowym certyfikatem, wówczas aplikacja będzie traktowana jako zupełnie nowa, niepowiązana ze starą wersją i reprezentująca zupełnie inną aplikację. W takim przypadku, aby ją zainstalować, nowa wersja będzie musiała mieć inną nazwę pakietu niż stara.

Najpierw w Android Studio wybierz z menu Build -> Generate Signed APK. Spowoduje to otwarcie okna kreatora:

Kliknij przycisk Utwórz nowy.... Następnie otworzy się okno tworzenia klucza:

W polu Ścieżka magazynu kluczy wprowadź ścieżkę do pliku certyfikatu sieciowego, który ma zostać utworzony. Jeśli określony folder nie istnieje, utwórz go lub zdefiniuj istniejący folder.

Określ hasło w polu Hasło/Potwierdź.

Określ alias w polu Alias. Możesz podać dowolną nazwę.

W polu Imię i nazwisko wpisz imię i nazwisko. Następnie wpisujemy jednostkę, organizację, miasto, kraj i kod kraju.

Na koniec kliknij OK.

Następnie pierwsze okno zostanie automatycznie zaktualizowane:

Ostatnie okno wskaże nam ścieżkę do katalogu, w którym będzie znajdować się podpisana aplikacja apk w wydanej wersji. Kliknij Zakończ.

Teraz w podanej ścieżce możesz znaleźć podpisany apk, który będzie miał nazwę app-release.apk:

Możemy zmienić nazwę pliku, zachowując jego rozszerzenie i przesłać go do Play Market lub dowolnej witryny lub pobrać bezpośrednio na urządzenie mobilne. Po pobraniu na telefon/tablet wystarczy w nią kliknąć, a za pomocą standardowego instalatora pakietu aplikacja zostanie zainstalowana. To prawda, tutaj również musimy wziąć pod uwagę, że jeśli instalujemy aplikację nie z Play Market, to w ustawieniach musimy zezwolić na instalację z innych źródeł - Bezpieczeństwo->Nieznane źródła (Zezwalaj na instalowanie aplikacji z innych źródeł)

Narzędzie keytool opisane w poprzedniej sekcji tworzy certyfikat cyfrowy, który jest jedną z opcji jarsigner. Inną opcją jest pakiet Androida, który należy podpisać. Aby wygenerować pakiet dla systemu Android, należy użyć narzędzia Export Unsigned Application Package z modułu Eclipse ADT. Aby wywołać to narzędzie, musisz kliknąć prawym przyciskiem myszy projekt Androida w Eclipse, wybrać Narzędzia Androida z menu kontekstowego, a następnie wybrać opcję Eksportuj niepodpisany pakiet aplikacji. Po uruchomieniu to narzędzie generuje plik .apk, który nie jest podpisany certyfikatem debugowania.

Aby wypróbować to wszystko, uruchom narzędzie Export Unsigned Application Package w jednym ze swoich projektów na Androida i zapisz gdzieś wygenerowany plik .apk. W tym przykładzie użyjemy wcześniej utworzonego folderu magazynu kluczy i wygenerujemy plik .apk o nazwie C:\android\release\myappraw.apk.

Teraz mamy plik .apk i element magazynu kluczy i możemy uruchomić narzędzie jarsigner, aby podpisać plik .apk (patrz 14.2). W takim przypadku należy określić pełne ścieżki do pliku magazynu kluczy i pliku .apk.

Aby podpisać plik .apk, jarsigner otrzymuje lokalizację magazynu kluczy, hasło magazynu kluczy, hasło klucza prywatnego, ścieżkę do pliku .apk i alias elementu magazynu kluczy. Następnie jarsigner podpisuje plik .apk cyfrowym certyfikatem z elementu magazynu kluczy. Aby uruchomić narzędzie jarsigner, musisz albo otworzyć okno narzędzia (patrz Rozdział 2), albo otworzyć okno wiersza poleceń lub okno Terminala i otworzyć folder bin w

JDK (jeśli ten folder nie jest ustawiony w zmiennej środowiskowej PATH). Ze względów bezpieczeństwa lepiej nie podawać haseł jako argumentów poleceń, wtedy jarsigner poprosi o wprowadzenie haseł w czasie wykonywania. na ryc. 14.3 pokazuje przykład wywołania narzędzia jarsigner. Być może zauważyłeś, że na rys. 14.3 jarsigner prosi tylko o jedno hasło. Dzieje się tak, ponieważ hasło keypass nie jest wymagane, jeśli hasło do sklepu i hasło do klucza są zgodne. Ściśle mówiąc, polecenie jarsigner w wersji e14.2 wymaga podania hasła -keypass tylko wtedy, gdy jest ono inne niż hasło -storepass.

Jak już wspomniano, Android wymaga, aby aplikacja była podpisana cyfrowo, aby złośliwi programiści nie mogli zastąpić Twojej aplikacji swoją wersją. Aby to zrobić, Android wymaga, aby aktualizacje aplikacji były podpisane tym samym podpisem, co oryginalna aplikacja. Jeśli aplikacja jest podpisana innym podpisem, Android traktuje te aplikacje jako różne. Dlatego jeszcze raz przypominamy: ostrożnie obchodź się z plikiem magazynu kluczy, aby był dostępny później, gdy będziesz musiał wydać aktualizację aplikacji.

Pracowałeś więc wiele dni (a może nocy), a teraz Twoja pierwsza hybrydowa aplikacja mobilna jest gotowa. Jest dość stabilny, większość krytycznych błędów jest zamknięta. Zostały małe, ale pamiętając, że perfekcjonizm jest złem, podejmujesz zdecydowaną decyzję o opublikowaniu aplikacji.

Warunkiem tego jest obecność podpisanego pliku APK. Jak podpisać plik apk, dowiesz się z tego artykułu.

mała dygresja

Kiedy mój ulubiony projekt był bliski premiery, zacząłem szukać informacji, jak szybko i bezboleśnie opublikować aplikację. Wiele znalezionych instrukcji wyglądało na proste. Wybrałem instrukcje autorów frameworka Ionic, na którym powstała aplikacja. Nie wszystko wyszło za pierwszym razem, jest kilka funkcji. Proces podpisywania jest opisany w tym artykule, ważne punkty są wyróżnione.

Wstępne dane

Zakładam, że masz wszystko, czego potrzebujesz do tworzenia hybrydowych aplikacji mobilnych z Apache Cordova. Musi być zainstalowane:
  • Apache Cordova
  • Zestaw narzędzi programistycznych Java
  • Narzędzia Android SDK
lcf jest używany jako nazwa projektu i aplikacji. W razie potrzeby zastąp nazwą swojego projektu.

Iść

Najpierw musisz utworzyć kompilację wydania swojej aplikacji. Ale wcześniej upewnijmy się, że wszystkie niepotrzebne wtyczki zostały usunięte. Na przykład nie potrzebujemy wtyczki, która wypisuje informacje debugowania do konsoli. Usuńmy to:

$ cordova plugin rm cordova-plugin-console
Aby wygenerować wersję wydania dla systemu Android, użyj polecenia zbudować z flagą --uwolnienie:

$ cordova kompilacja -- zwolnij Androida
To polecenie utworzy niepodpisany Plik APK w katalogu:

platformy/Android/kompilacja/wyjścia/apk
Na przykład platformy/Android/build/outputs/apk/ Android-release-unsigned.apk. Następnie musimy podpisać ten plik i uruchomić narzędzie wyrównanie zip w celu optymalizacji i przygotowania pliku do Google Play.

Do podpisania pliku wymagany jest certyfikat. Utwórzmy go za pomocą narzędzia główne narzędzie który jest zawarty w JDK:

$ keytool -genkey -v -keystore lcf.keystore -alias lcf -keyalg RSA -keysize 2048 -validity 10000
Ważny

Wartość parametru -alias trzeba zapamiętać, ale lepiej ją zapisać. W powyższym przykładzie jest to równe lcf (od pierwszych liter nazwy aplikacji Loyal Client Free). Szczegółów tutaj nie podam, jeśli jesteście zainteresowane, piszcie w komentarzach, opowiem więcej.

Alias ​​jest używany za każdym razem podczas podpisywania * Aplikacje. Aby ułatwić zapamiętanie, użyj nazwy pliku magazynu kluczy jako aliasu, na przykład:


-keystore hello-world.keystore -alias hello-world -keystore pogoda-app.keystore -alias weather-app -keystore todo.keystore -alias todo
* Musisz podpisać aplikację przy każdym wydaniu aktualizacji

Pożytek główne narzędzie zadaje serię pytań. W sumie będzie ich 8. Aby mieć wyobrażenie o pytaniach i przybliżonych odpowiedziach, wszystkie są podane poniżej, pod spoilerem.

Keytool pytania i przykładowe odpowiedzi

1. Wprowadź hasło magazynu kluczy:
Tutaj musisz wprowadzić hasło do pliku (co najmniej 6 znaków). Wpisane hasło należy zapisać w bezpiecznym miejscu, jest ono potrzebne każdorazowo podczas podpisywania wniosku.

2. Wprowadź ponownie nowe hasło:
Wprowadź ponownie hasło.

3. Jakie jest twoje imię i nazwisko?
: Iwan Pietrow
Twoje imię i nazwisko. Wartość w nawiasach kwadratowych jest wartością domyślną.

4. Jak nazywa się Twoja jednostka organizacyjna?
: TO
Nazwa działu Twojej firmy. Możesz zostawić to pole puste, określam IT.

5. Jak nazywa się Twoja organizacja?
: 2programistów
Nazwa Twojej organizacji. Określ, jeśli występują.

6. Jak nazywa się Twoje miasto lub miejscowość?
: Moskwa
Nazwa miasta

7. Jak nazywa się twój stan lub prowincja?
: MO
Nazwa regionu

8. Jaki jest dwuliterowy kod kraju dla tego urządzenia?
: PL
Kod kraju. Wskazuję RU.

: y

Potwierdź, czy wszystko jest w porządku, lub naciśnij Enter, aby wejść ponownie.


Na koniec pojawi się komunikat o pomyślnym wygenerowaniu klucza. Zostaniesz poproszony o ustawienie hasła dla klucza prywatnego (jeśli chcesz zostawić to samo co dla certyfikatu, naciśnij Enter):

Generowanie 2 048 bitowej pary kluczy RSA i samopodpisanego certyfikatu (SHA256zRSA) o ważności 10 000 dni dla: CN=Ivan Petrov, OU=IT, O=2developers, L=Moscow, ST=MO, C=RU Enter key hasło do (WRÓĆ, jeśli jest takie samo jak hasło do magazynu kluczy):
Plik zostanie utworzony w bieżącym katalogu magazyn kluczy LCF.

Ważny

Utworzony plik należy zapisać w bezpiecznym miejscu. Jeśli korzystasz z prywatnego repozytorium, plik można zatwierdzić wraz z kodami źródłowymi aplikacji. Ogólnie rzecz biorąc, certyfikaty najlepiej przechowywać oddzielnie. W przypadku utraty certyfikatu nie będzie można publikować aktualizacji aplikacji.

Pozostały dwa kroki i będziesz mieć plik APK gotowy do dystrybucji. Przechodzimy bezpośrednio do podpisywania.

Aby podpisać plik APK, użyj narzędzia jarsigner, który jest również zawarty w pakiecie JDK.

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore lcf.keystore android-release-unsigned.apk lcf
Nazwa certyfikatu jest określona po parametrze - magazyn kluczy, alias - po nazwie pliku.

Na koniec, aby zoptymalizować plik apk, użyjemy narzędzia wyrównanie zip:

$ zipalign -v 4 android-release-unsigned.apk LoyalClientFree.apk
Ostatnim parametrem jest nazwa pliku, który prześlesz do Google Play.

Ważny.

Pożytek wyrównanie zip jest częścią Android SDK Tools i można go znaleźć tutaj:

/path/to/Android/sdk/build-tools/VERSION/zipalign

Wniosek

Masz teraz plik APK gotowy do dystrybucji, który można przesłać do Google Play. Uzupełnij opis, określ ocenę swojej aplikacji i kliknij „Publikuj”.

Ponieważ sam googlowałem pytanie jak podpisać plik apk?”, Wiem, że nie tak łatwo we wszystkim znaleźć naprawdę działającą i zrozumiałą instrukcję. Dlatego postanowiłem sam napisać materiał o tym, jak poprawnie podpisać swój program lub grę na Androida.

Jak już wiesz, bez podpisu cyfrowego Twoje dzieło nie może zostać umieszczone na rynku, a to już poważna sprawa. Wielu młodych programistów Androida zauważyło, że tak powiem, początkujący całkowicie zapominają podpisać swoją aplikację i próbują coś zrobić z nim później i zastanawia się, dlaczego nie mogą wykonać pewnych czynności na swoim pliku APK.

Więc nie przeciągajmy tego i zacznijmy od razu od tego, jak możesz podpisać plik APK i jak go faktycznie użyć, aby osiągnąć pożądany rezultat.

Ta metoda jest najbardziej poprawna ze wszystkich wymienionych, dlatego opiszemy ją w tym materiale. Stworzymy własne klucze z naszych danych i certyfikatów i użyjemy ich do podpisania stworzonej przez Ciebie aplikacji.

Do pracy potrzebujemy: OpenSSL i SignApk.

Najpierw zróbmy certyfikat i klucz do podpisu. Zainstaluj OpenSSL. Podczas instalacji instalator poprosi o skopiowanie komponentów do folderu Windows, wybierz folder Bin, który będzie miejscem instalacji całego OpenSSL.

Teraz otwórz w imieniu administratora systemu (to bardzo ważne!) wiersz poleceń. Następnie w wierszu poleceń przejdź do folderu bin, który znajduje się w folderze, w którym zainstalowałeś OpenSSL (na przykład C:\OpenSSL\bin\ Lub C:\Program Files\OpenSSL\bin\). Jeśli nie wiesz, przejście do innego folderu odbywa się za pomocą polecenia płyta CD. Oznacza to, że aby przejść do żądanego folderu, należy uruchomić następujące polecenie:

cd C:\OpenSSL\bin\

Gdy znajdziesz się w folderze Bin, możesz przejść bezpośrednio do tworzenia certyfikatu i klucza.

Krok 1(Generujemy klucze o długości 1024 bitów)

Uruchom polecenie:

openssl genrsa -out key.pem 1024

Krok 2(Na podstawie klucza tworzymy żądanie certyfikatu)

Uruchom polecenie:

openssl req -new -key key.pem -out request.pem

Na tym etapie będziesz musiał podać swoje dane, które będą Cię identyfikować w certyfikacie.

Krok 3 (Wygeneruj klucz prywatny z certyfikatu)

Uruchom polecenie:

openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem

Krok 4(Wykonaj generowanie klucza publicznego)

Uruchom polecenie:

openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt

Na tym etapie tworzenie plików potrzebnych do podpisywania twoich gier i aplikacji jest zakończone. za pomocą wygenerowanego klucza i certyfikatu możesz podpisać dowolną liczbę gier i aplikacji na Androida.

A teraz właściwie zacznijmy podpisywać wniosek. Rozpakuj archiwum z SingApk pobrane z powyższego linku. Przenieś z folderu Bin, w którym utworzyliśmy pliki certyfikatu i klucza 2: certyfikat.pem I klucz.pk8 do folderu, w którym rozpakowałeś SingApk. System Windows powinien wyświetlić okno dialogowe wymiany pliku — zamień.

Teraz, aby podpisać plik apk unikalnym podpisem cyfrowym, który sam zrobiłeś, po prostu przeciągnij plik apk do znak_APK.bat. Aby nie przeciągać pliku z jednego okna do drugiego (nie jest to wygodne), przenieś plik apk do folderu z SingApk. Po wykonaniu plik pojawi się w folderze z SingApk apk_signed.apk, która będzie Twoją podpisaną aplikacją lub grą.