Chciałbym mieć moją wersję Gradle, aby utworzyć plik apk podpisany wersją przy użyciu Gradle.
Nie jestem pewien, czy kod jest poprawny lub czy brakuje mi parametru podczas wykonywania gradle build
?
Oto część kodu w moim pliku gradle:
android {
...
signingConfigs {
release {
storeFile file("release.keystore")
storePassword "******"
keyAlias "******"
keyPassword "******"
}
}
}
Kompilacja stopni kończy się sukcesem, aw moim build/apk
folderze widzę tylko pliki ...-release-unsigned.apk
i ...-debug-unaligned.apk
.
Wszelkie sugestie, jak to rozwiązać?
Odpowiedzi:
Łatwiejszy sposób niż poprzednie odpowiedzi:
Włóż to w
~/.gradle/gradle.properties
Zmodyfikuj swój
app/build.gradle
i dodaj to doandroid {
bloku kodu:Potem możesz biec
gradle assembleRelease
Zobacz także odniesienie do
signingConfigs
Gradle DSLźródło
file()
zawsze zakłada ścieżki względne. Użyj,new File(path)
jeśli chcesz traktować go jako absolutny.Udało mi się go rozwiązać, dodając ten kod i budując z
gradle build
:To generuje podpisany plik apk wydania.
źródło
gradle build
lubgradlew build
za pomocą polecenia Terminal / PromptPamiętaj, że skrypt @ sdqali będzie (przynajmniej podczas korzystania z Gradle 1.6) pytać o hasło za każdym razem, gdy wywołasz dowolne zadanie gradle. Ponieważ potrzebujesz go tylko podczas wykonywania
gradle assembleRelease
(lub podobnego), możesz użyć następującej sztuczki:Pamiętaj, że musiałem również dodać następujące elementy (w systemie Android), aby to działało:
źródło
installRelease
zniknął z listy zadań ... Dlaczego?KEYSTORE
musi zostać zdefiniowana nawet w przypadku kompilacji debugowania i „synchronizacji stopniowej” w Android Studio, w przeciwnym razie pojawi się błąd dotyczący braku wartości ścieżki.Jeśli chcesz uniknąć zapisywania na stałe swojego pliku kluczy i hasła w build.gradle , możesz użyć pliku właściwości, jak wyjaśniono tutaj: POSTĘPOWANIE Z SYGNALIZOWANIEM KONFIGURACJI Z GRADLE
Gruntownie:
1) utwórz plik myproject.properties pod adresem /home/[nazwa_użytkownika]/.signing z taką zawartością:
2) utwórz plik gradle.properties (być może w katalogu głównym katalogu projektu) z zawartością:
3) zapoznaj się z tym w swoim build.gradle w ten sposób:
źródło
Automatyczne podpisywanie aplikacji za pomocą Gradle podczas korzystania z git
To zadziwiające, jak wiele zawiłych sposobów można tego dokonać. Oto mój własny sposób, w którym staram się przestrzegać własnej rekomendacji Googles . Jednak ich wyjaśnienie nie jest w pełni jasne, więc opiszę szczegółowo procedurę dla Linuksa.
Opis:
Domyślne instrukcje Google do automatycznego podpisywania aplikacji podczas kompilacji, bez utrzymywania haseł i plików podpisów na ścieżce rozwoju aplikacji (GIT), są raczej niejasne. Oto wyjaśnione instrukcje krok po kroku, jak to zrobić.
Wstępne założenia:
Masz aplikację o nazwie „MojaAplikacja” w katalogu określonym przez następującą ścieżkę:
$HOME/projects/mydev/MyApp
. Jednak katalog MyApp jest używany i kontrolowany za pomocą GIT.Problem
Oczywiście nie chcemy, aby nasze pliki sygnatur i haseł były nigdzie w katalogu kontrolowanym przez GIT, nawet jeśli jesteśmy w stanie bardzo dobrze korzystać
.gitignore
itp., Nadal jest zbyt ryzykowne i łatwe do popełnienia błędu. Dlatego chcemy, aby nasz plik kluczy i pliki sygnatur były na zewnątrz.Rozwiązanie
Musimy zrobić trzy (3) rzeczy:
build.gradle
plik modułu , aby użyć (1) i (2).W tym przykładzie nazywamy dwa pliki:
keystore.properties
MyApp-release-key.jks
Oba te pliki możemy umieścić tutaj:
(1) Utwórz plik hasła do magazynu kluczy
Pierwszy plik zawiera hasła tekstowe użyte w; i ścieżki do pliku klucza wydania w (2). Zacznij od wypełnienia tego, ponieważ ułatwi to kopiowanie wklejanie na następny krok.
Edytuj
keystore.properties
, aby jego zawartość była:Jedyną trudną częścią jest tutaj
myStoreFileLocation
. Jest to ścieżka widziana zbuild.gradle
pliku modułu podczas kompilacji. Oznacza to zazwyczaj ścieżkę podobnie jak iw stosunku do:$HOME/projects/mydev/MyApp/app/build.gradle
. Aby wskazaćMyApp-release-key.jks
plik, musimy tutaj umieścić:../../../MyApp-release-key.jks
Tutaj wybraliśmy również alias „myapp” dla klucza. Następnie końcowy plik powinien wyglądać:
(2) Utwórz plik podpisu
Drugi plik jest generowany automatycznie podczas tworzenia klucza podpisu. Jeśli nie masz innych aplikacji i jest to jedyny magazyn kluczy, utwórz plik za pomocą:
Zostaniesz poproszony o podanie dwóch haseł i wielu informacji. (Takie same rzeczy jak w Android Studio.) Teraz skopiuj / wklej wcześniej wybrane hasła.
(3) Edytuj
gradle.build
plik modułu , aby użyć powyższegoW pliku kompilacji Gradle aplikacji / modułu muszą znajdować się następujące części. Po pierwsze, należy dodać następujące linie na zewnątrz i przed swoim
android {}
blokiem.Następnie wewnątrz w
android {}
bloku, należy dodać:Teraz z powłoki możesz ponownie zbudować aplikację za pomocą:
Powinno to wygenerować poprawnie podpisaną aplikację, z której można korzystać w Google Play.
AKTUALIZACJA: 02.04.2019
Nowsze wersje
keytool
i coś mówi ci, że powinieneś używać pliku kluczy opartego na PKCS12 zamiast oryginalnego / domyślnego, jak używam powyżej. Są one następnie przejść z informacją, należy przekonwertować do nowego formatu otwarty PKCS12. Wydaje się jednak, że narzędzia programistyczne dla Androida nie są jeszcze na to jeszcze gotowe, ponieważ jeśli to zrobisz, otrzymasz następujące dziwne błędy:Więc nie używaj przekonwertowanego klucza!
źródło
keystore.properties
plik fikcyjny do kontroli źródła, więc buduje pracę na komputerach deweloperskich. Opisałem tutaj konfigurację serwera kompilacji .keytool
generowania kluczy PKCS12: można przekazać-storetype JKS
wkeytool
komendzie, aby ustawić typ kluczy do JKS, który jest wymagany przez Android oprzyrządowania.Jak powiedział @Destil, ale pozwól innym, którzy nie mają klucza do zbudowania: Łatwiejszy sposób niż poprzednie odpowiedzi:
Włóż to w
~/.gradle/gradle.properties
Zmodyfikuj swój w
build.gradle
ten sposób:Następnie możesz uruchomić
gradle assembleRelease
ORgradle build
źródło
(W odpowiedzi na użytkownika 672009 powyżej.)
Jeszcze łatwiejsze rozwiązanie, jeśli chcesz trzymać swoje hasła poza repozytorium git; jednak chcę dołączyć do niego swój build.gradle, który nawet świetnie działa ze smakami produktów, to utworzyć osobny plik stopni. Nazwijmy to „signing.gradle” (dołącz to do swojego .gitignore). Tak jakby to był twój plik build.gradle bez wszystkiego, co nie jest związane z zalogowaniem się w nim.
Następnie w pliku build.gradle umieść ten wiersz pod „Zastosuj wtyczkę:„ Android ”
Jeśli nie masz lub nie używasz wielu smaków, zmień nazwę „flav1” na „release” powyżej i powinieneś już skończyć. Jeśli używasz smaków, kontynuuj.
Na koniec połącz swoje smaki z poprawnym podpisaniem. Skonfiguruj w pliku build.gradle i powinieneś skończyć.
źródło
Jeśli masz już plik kluczy, może to być tak proste, jak dodanie kilku parametrów do polecenia kompilacji:
Żadne stałe zmiany w projekcie Androida nie są konieczne.
Źródło: http://www.tinmith.net/wayne/blog/2014/08/gradle-sign-command-line.htm
źródło
To jest odpowiedź dla użytkownika672009 i dodatku do postu sdqali (jego kod zawiesi się podczas budowania wersji debugowania przez przycisk „Uruchom” IDE):
Możesz użyć następującego kodu:
źródło
keyPassword new String(console.readPassword("Enter key password: "))
aby upewnić się, że hasło nie jest wyświetlane podczas wprowadzania danychW nowszym Androidzie Studio jest bardzo prosty interfejs GUI, który wypełnia również plik Gradle.
File -> Project Structure
Module ->
Wybierz główny moduł („aplikacja” lub inna niestandardowa nazwa)Signing
tab -> Obraz plus, aby dodać nową konfiguracjęWypełnij dane po prawej stronie
Plik OK i Gradle jest tworzony automatycznie
Będziesz musiał ręcznie dodać linię do
signingConfig signingConfigs.NameOfYourConfig
środkabuiltTypes{release{}}
Obrazy:
Dwie ważne (!) Uwagi:
(EDYCJA 12/15)
Aby utworzyć podpisany plik APK, musisz otworzyć kartę Terminal w Android Studio (na dole głównego interfejsu) i wydać polecenie
./gradlew assembleRelease
Jeśli zapomniałeś
keyAlias
(co często mi się zdarza), będziesz musiał zainicjować,Build -> Generate Signed APK
aby rozpocząć proces i zobaczyć nazwę klucza Alias.źródło
build.gradle
pliku, prawda?Jeśli budujesz apk za pomocą wiersza poleceń, takiego jak ja, możesz podać konfigurację podpisywania jako argumenty.
Dodaj to do swojego
build.gradle
Zrób
signingConfigs
to takNastępnie wykonujesz w
gradlew
ten sposóbźródło
build.gradle
? Najwyższy poziom? Dodaj więcej koduapp/build.gradle
plik, o którym mówię.źródło
Możesz także użyć opcji linii poleceń -P gradle, aby ułatwić podpisywanie. W swoim build.gradle dodaj singingConfigs w następujący sposób:
Następnie wywołaj kompilację stopni w ten sposób:
Możesz użyć -P, aby ustawić storeFile i keyAlias, jeśli wolisz.
Jest to w zasadzie rozwiązanie Destil, ale z opcjami wiersza poleceń.
Aby uzyskać więcej informacji na temat właściwości stopni, zapoznaj się z instrukcją obsługi stopni .
źródło
Odpowiedź @ Destil jest dobra, jeśli możesz ponownie użyć tej samej konfiguracji we wszystkich projektach. Alternatywnie, Android Studio zawiera
local.properties
plik, który może być zamiast tego używany, ale podobno jest generowany przez IDE i nie mogę znaleźć sposobu na rozszerzenie go z Android Studio.Jest to odmiana odpowiedzi @ jonbo . Ta odpowiedź pozwala na ustawienia specyficzne dla projektu, ale wiąże się to z pewnym nakładem programistycznym. W szczególności wymagana jest znacząca podstawa do przeniesienia
signingConfigs
definicji do osobnego pliku - szczególnie, jeśli musisz to zrobić w przypadku wielu projektów, co jest głównym powodem wyboru tego rozwiązania zamiast Destil. To może być nieco złagodzony przez również w tym linięw pliku referencji, ponieważ pozwoli to na zakończenie IDE.
Wreszcie, większość rozwiązań tutaj nie pozwala na budowanie projektu w trybie debugowania - który obsługuje podpisywanie debugowania automatycznie - bez podania poprawnej składniowo, jeśli nie semantycznie,
signingConfigs
definicji. Jeśli nie musisz tworzyć kompilacji wersji z danej maszyny, ten dodatkowy krok może być postrzegany jako niepotrzebna przeszkoda. Z drugiej strony może to być pomoc przeciwko nieświadomym lub leniwym kolegom, którzy wykonują kompilacje debugowania w produkcji.To rozwiązanie pozwoli na debugowanie kompilacji bez martwienia się o poświadczenia, ale będzie wymagało prawidłowych poświadczeń do wygenerowania kompilacji wersji i zajmuje bardzo mało danych podstawowych. Jednak ze względu na wadę może zachęcać innych do zastępowania fałszywych wartości prawdziwymi danymi uwierzytelniającymi i nie ma sposobu, aby się przed tym zabezpieczyć.
Tworzy to sztuczną właściwość, która służy wyłącznie do utworzenia poprawnego pod względem składniowym pliku kompilacji. Wartości przypisane do
ext.signing
właściwości są nieistotne, jeśli chodzi o kompilacje debugowania. Aby włączyć buduje uwolnienia, kopiowanieext.signing
dosigning.gradle
i zastąpić wartości manekin z ważnych mandatów.Oczywiście
signing.gradle
VCS powinien je zignorować.źródło
Prawie wszystkie platformy oferują teraz jakiś brelok, więc nie ma powodu, aby pozostawiać hasła w postaci czystego tekstu.
Proponuję proste rozwiązanie, które wykorzystuje moduł Python Keyring (głównie skrypt konsoli towarzyszącej
keyring
) i minimalne opakowanie wokół['do', 'something'].execute()
funkcji Groovy :Korzystając z tej funkcji,
signingConfigs
sekcja staje się:Przed uruchomieniem
gradle assembleRelease
musisz ustawić hasła w breloku, tylko raz:Szczęśliwe wydania!
źródło
Rozszerzając odpowiedź David Vavra, utwórz plik ~ / .gradle / gradle.properties i dodaj
Następnie w build.gradle
źródło
Miałem całkiem niezłą zabawę przy rozgryzaniu tego. Oto moje przejście.
Przewodnik od A do Z na temat tworzenia pliku kompilacji stopni w IntelliJ (v.13.1.4) W tym przewodniku założono, że wiesz, jak utworzyć plik magazynu kluczy. Aby ten samouczek zadziałał, plik magazynu kluczy musi znajdować się w folderze aplikacji, a plik zipalign.exe musi znajdować się w folderze „SDK-ROOT \ tools”. Ten plik zwykle znajduje się w „SDK-ROOT \ build-tools” i pod tym folderem będzie w najwyższym folderze API (alfa lub beta, zalecam wersję alfa).
Dla tych z Was, którzy chcą wskoczyć tutaj, jest plik kompilacji stopni.
Możesz zbudować część tego pliku kompilacji (powyżej) z opcji menu: Struktura pliku / projektu Z tego miejsca wybierz Aspekty i kliknij „Android-Gradle (aplikacja). Stąd zobaczysz zakładki: „Właściwości”, „Podpisywanie”, „Aromaty”, „Typy kompilacji” i „Zależności” do tego przejścia, będziemy po prostu używać „Podpisywania” i „Typów kompilacji”. W obszarze „Typy kompilacji” (w sekcji nazwy) wprowadź dowolną nazwę, która ma identyfikować konfigurację typu kompilacji, a w pozostałych 4 polach wprowadź informacje o pliku kluczy (ustawiając ścieżkę do pliku kluczy tą pod folderem aplikacji).
Pod „Typami kompilacji” wpisz w polu nazwy wartość „assembleRelease”, „Debuggable” powinno być ustawione na false, „Jni Debug Build” powinno być false, ustawić „Run Proguard” na true, a „Zip Align” na true. Spowoduje to wygenerowanie pliku kompilacji, ale nie w sposób pokazany powyżej, będziesz musiał dodać kilka rzeczy do pliku kompilacji. Lokalizacja pliku ProGuard zostanie tutaj ustawiona ręcznie w pliku kompilacji stopni. (jak pokazano powyżej)
Kontenery DSL, które należy później dodać, są następujące:
Będziesz także musiał dodać:
zwróć uwagę, że powyższy kontener DSL („zależności”) powinien znajdować się na dole pliku konfiguracyjnego, ale nie powinien znajdować się w kontenerze DSL Androida. Aby zbudować kontener zależności z menu IntelliJ, wybierz: Struktura pliku / projektu. Następnie wybierz ponownie Facets, a następnie Android-Gradle (aplikacja). Zobaczysz te same 5 zakładek, jak wspomniano powyżej. Wybierz kartę „Zależności” i dodaj wymagane zależności.
Po tym wszystkim powinieneś zobaczyć plik kompilacji Gradle podobny do pliku na początku tego przewodnika. Aby zbudować podpisaną wersję dostosowaną do formatu zip, musisz otworzyć zadania Gradle. Możesz przejść do tego okna, wybierając Widok / Narzędzie Windows / Gradle. Stąd możesz dwukrotnie kliknąć „asembleAssembleRelease. Powinno to wygenerować pakiet APK do wdrożenia.
Potencjalne problemy, które mogą wystąpić podczas kompilacji wydania, to (ale nie wyłącznie): plik kompilacji Gradle znajduje się w niewłaściwym miejscu. Istnieją dwa pliki kompilacji Gradle; jeden w folderze głównym aplikacji, a drugi w folderze aplikacji w katalogu głównym aplikacji. Musisz użyć tego ostatniego.
Możesz także mieć problemy z kłaczkami. (Uwaga: Android Developer Studio jest znacznie lepszy w wykrywaniu problemów Lint niż IntelliJ, zauważysz to podczas próby wygenerowania podpisanego pliku APK z opcji menu)
Aby obejść problemy z kłaczkami, musisz umieścić następujący kontener DSL w kontenerze Androida (u góry):
umieszczenie tego w kontenerze DSL Androida spowoduje wygenerowanie pliku błędu w folderze kompilacji (bezpośrednio pod folderem aplikacji), nazwa pliku powinna być taka jak „lint-results-release-fatal.html”, ten plik powie ci klasa, w której wystąpił błąd. Kolejnym plikiem, który zostanie wygenerowany, jest plik XML zawierający „identyfikator problemu” związany z błędem kłaczków. Nazwa pliku powinna być podobna do „lint-results-release-fatal.xml”. Gdzieś w górnej części pliku zobaczysz „problem” węzła, w którym zobaczysz coś podobnego do „id =" IDOfYourLintProblem "
Aby rozwiązać ten problem, otwórz w swoim projekcie plik wymieniony w pliku „lint-results-assembleRelease-fatal.html” i wprowadź następujący wiersz kodu w pliku klasy Java tuż nad nazwą klasy: @SuppressLint („IDOfYourLintProblem” „). Być może trzeba zaimportować plik „android.annotation.SuppressLint;”
Twój plik klasy Java powinien wyglądać następująco:
Pamiętaj, że eliminowanie błędów kłaczków nie zawsze jest najlepszym pomysłem, dlatego lepiej zmienić kod, który spowodował błędy kłaczków.
Innym problemem, który może potencjalnie wystąpić, jest brak ustawienia zmiennej środowiskowej dla zmiennej środowiskowej Gradle HOME. Ta zmienna nosi nazwę „GRADLE_HOME” i powinna mieć ustawioną ścieżkę do katalogu domowego gradle, coś w rodzaju „C: \ gradle-1.12”. Czasami możesz również chcieć ustawić zmienną środowiskową dla „ANDROID_HOME”, ustaw ją na „YOUR- SDK-Root \ sdk '
Po tym powróć do okna zadań Gradle i kliknij dwukrotnie assembleAssembleRelease.
Jeśli wszystko się powiedzie, powinieneś być w stanie przejść do folderu app \ build \ apk i znaleźć plik APK do wdrożenia.
źródło
Jeszcze inne podejście do tego samego problemu. Ponieważ nie jest zalecane przechowywanie jakichkolwiek poświadczeń w kodzie źródłowym, postanowiliśmy ustawić hasła do magazynu kluczy i aliasu kluczy w osobnym pliku właściwości w następujący sposób:
Jeśli używasz git, możesz utworzyć plik tekstowy o nazwie na przykład secure.properties. Pamiętaj, aby wykluczyć go ze swojego repozytorium (jeśli używasz git, dodając go do pliku .gitignore). Następnie musisz utworzyć konfigurację podpisywania, jak wskazują niektóre inne odpowiedzi. Jedyna różnica polega na sposobie ładowania poświadczeń:
Nigdy nie zapomnij ręcznie przypisać signingConfig do typu kompilacji wydania (z jakiegoś powodu czasami zakładam, że zostanie on użyty automatycznie). Ponadto włączenie proguard nie jest obowiązkowe, ale jest zalecane.
Podobało nam się to podejście bardziej niż używanie zmiennych środowiskowych lub prośba o dane wejściowe użytkownika, ponieważ można to zrobić z IDE, przełączając się na typ kompilacji w Realease i uruchamiając aplikację, zamiast konieczności korzystania z wiersza poleceń.
źródło
Android Studio Przejdź do Plik -> Struktura projektu lub naciśnij Ctrl + Alt + Shift + S
Zobacz obraz
Kliknij OK
Następnie signingConfigs wygeneruje plik build.gradle.
źródło
Miałem kilka problemów, które umieściłem następujący wiersz w niewłaściwym miejscu:
Upewnij się, że umieścisz części signingConfigs w sekcji Androida:
zamiast
Łatwo jest popełnić ten błąd.
źródło
Jest rok 2019 i muszę podpisać APK za pomocą V1 (sygnatura jar) lub V2 (pełna sygnatura APK). Poszukałem Google „generuj podpisaną klasę APK” i to mnie tu przywiodło. Więc dodaję tutaj moje oryginalne rozwiązanie.
Moje oryginalne pytanie: jak korzystać z V1 (sygnatura jar) lub V2 (pełna sygnatura APK) z pliku build.gradle
źródło
Aby uzupełnić inne odpowiedzi, możesz również umieścić plik gradle.properties we własnym folderze modułu wraz z build.gradle, na wypadek, gdyby Twój plik kluczy był specyficzny dla jednego projektu.
źródło
pracuję w Ubuntu14.04. vim ~ / .bashrc i dodaj eksport ANDROID_KEYSTORE = eksport ANDROID_KEYALIAS =
a następnie w zestawie build.gradle.
źródło
System.console()
powracanull
.Alternatywą jest zdefiniowanie zadania, które działa tylko w kompilacjach wersji.
źródło
Możesz poprosić o hasło z wiersza poleceń:
if-then-else
Blok zapobiega żądania haseł gdy budujesz uwolnienie. Chociażelse
gałąź jest nieosiągalna, nakłania Gradle'a do utworzeniainstall...Release
zadania.Backstory . Jak zauważył https://stackoverflow.com/a/19130098/3664487 , „ Skrypty Gradle mogą pytać użytkownika o dane wejściowe za pomocą metody System.console (). ReadLine ”. Niestety, Gradle zawsze prosi o hasło, nawet podczas budowania wersji debugowania (por. Jak utworzyć plik apk podpisany wersją za pomocą Gradle? ). Na szczęście można temu zaradzić, jak wykazałem powyżej.
źródło
Dodając mój sposób, aby to zrobić w React-Native przy użyciu pakietu React-Native -config .
Utwórz plik .env:
Uwaga: nie powinno to być częścią kontroli wersji.
w twoim
build.gradle
:źródło
W moim przypadku przesyłałem niewłaściwy apk do wydania innej aplikacji.
źródło
Dla Groovy (build.gradle)
Nie należy umieszczać poświadczeń podpisujących bezpośrednio w pliku build.gradle . Zamiast tego poświadczenia powinny pochodzić z pliku niepodlegającego kontroli wersji.
Umieść plik signing.properties w miejscu, w którym znajduje się specyficzny dla modułu build.gradle . Nie zapomnij dodać go do pliku .gitignore !
signing.properties
build.gradle
źródło
Dla skryptu Kotlin (build.gradle.kts)
Nie należy umieszczać poświadczeń podpisujących bezpośrednio w pliku build.gradle.kts pliku . Zamiast tego poświadczenia powinny pochodzić z pliku niepodlegającego kontroli wersji.
Umieść plik signing.properties w miejscu, w którym znajduje się plik build.gradle.kts specyficzny dla modułu . Nie zapomnij dodać go do pliku .gitignore !
signing.properties
build.gradle.kts
źródło
jeśli nie chcesz widzieć Nie można wywołać metody readLine () na obiekcie o wartości null. najpierw musisz napisać w gradle.properties .
źródło