Android Studio: jak wygenerować podpisany apk za pomocą Gradle?


90

Szukałem w Google i SO, ale nie mogę znaleźć odpowiedzi.

Po raz pierwszy pracuję z systemem gradle i jestem teraz na etapie generowania podpisanego pliku APK do przesłania do Google Play (projekt jest importowany z eclipse).

Teraz przeczytałem część http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Building-and-Tasks , którą należy dodać signingConfigsdobuild.gradle

Dodałem te linie i teraz zobaczyłem, że musisz uruchomić, ./gradlew assembleReleaseale uruchomienie tego w moim cmd zwraca „gradle” nie jest rozpoznawane jako polecenie wewnętrzne lub zewnętrzne, program działający lub plik wsadowy. Próbowałem też kliknąć prawym przyciskiem myszy plik build.gradle i uruchomić go, mówiąc, że się powiodło, ale gdy spojrzę w folderze build / apk, tylko plik o nazwieapp-debug-unaligned.apk

Jak więc wygenerować podpisany plik APK za pomocą systemu Gradle?



@ScottBarta Częściowo załatwiło sprawę, kiedy przełączyłem się na tryb wydania i uruchomiłem gradle, nadal otrzymywałem błąd, ale używając on build> wygeneruj podpisany apk przez menu w końcu się udało! Dzięki, zagłosowałem za tobą pod podanym linkiem.
Gooey

podpisać z wersją v1 (podpis jar) lub v2 (pełny podpis apk) z pliku gradle? rozwiązanie tutaj: stackoverflow.com/questions/57943259/ ...
user1506104

Odpowiedzi:


97

Istnieją trzy sposoby generowania kompilacji zgodnie z buildType. (W twoim przypadku jest to wydanie, ale można go nazwać dowolnie).

  1. Przejdź do Gradle Task w prawym panelu Android Studio i wyszukaj assembleReleaselub assemble(#your_defined_buildtype)pod Module Tasks

  2. Przejdź do opcji Build Variant w lewym panelu i wybierz kompilację z listy rozwijanej

  3. Przejdź do katalogu głównego projektu w Eksploratorze plików i otwórz cmd / terminal i uruchom:

    Linux: ./gradlew assembleRelease or assemble(#your_defined_buildtype)

    Okna: gradlew assembleRelease or assemble(#your_defined_buildtype)

Jeśli chcesz wykonać kompilację wydania (tylko), możesz użyć Build> Generate Signed apk. W przypadku innych typów kompilacji dostępne są tylko trzy powyższe opcje.

Możesz znaleźć wygenerowany pakiet APK w swoim module/buildkatalogu z nazwą typu kompilacji.


4
Spowoduje to zbudowanie podpisanego pliku APK tylko wtedy, gdy masz konfigurację kompilacji w pliku build.gradle. Jeśli przechowujesz to w narzędziach do zarządzania kodem źródłowym lub udostępniasz innym osobom, powinieneś pomyśleć o oddzieleniu poświadczeń klucza podpisu od kodu źródłowego.
Janusz

Kompilacja> Wygeneruj podpisany apk ... to takie proste
Atul

61

Możliwe jest pobranie dowolnego istniejącego projektu gradle Android Studio i zbudowanie / podpisanie go z wiersza poleceń bez edycji żadnych plików. To sprawia, że ​​bardzo dobrze jest przechowywać projekt w kontroli wersji, zachowując jednocześnie klucze i hasła:

./gradlew assembleRelease -Pandroid.injected.signing.store.file=$KEYFILE -Pandroid.injected.signing.store.password=$STORE_PASSWORD -Pandroid.injected.signing.key.alias=$KEY_ALIAS -Pandroid.injected.signing.key.password=$KEY_PASSWORD

1
Ponieważ musimy przekazać kod źródłowy towarzyszowi, jest to najlepszy sposób na zachowanie tajemnicy naszego magazynu kluczy. Dzięki.
Yeung,

2
w każdym razie poznanie tych właściwości android.injected.signing. * ?
Tixeon

Otrzymałem te informacje od Xav z zespołu Android Studio i nie wiem, czy istnieją inne takie zmienne.
Wayne Piekarski

Otrzymuję wyjątek java.lang.RuntimeException: com.android.ide.common.signing.KeytoolException: Nie udało się odczytać klucza XXXXXX ze sklepu „C: \ Users \ somedirectory \ Desktop \ someKey.jks”: Brak klucza z aliasem „XXXXXX” znaleziono w magazynie kluczy C: \ Users \ katalog \ Desktop \ someKey.jks. Dlaczego?
Archie G. Quiñones

40

Możesz użyć tego kodu

android {
   ...
    signingConfigs {
        release {
            storeFile file("../your_key_store_file.jks")
            storePassword "some_password"
            keyAlias "alias_name"
            keyPassword "key_password"
        }
    }

    buildTypes {

        release {
            signingConfig signingConfigs.release
        }
    }
   ...
}

następnie z twojego terminala

./gradlew assembleRelease

dostaniesz apk pod adresem

your-android-app / build / output / apk / your-android-app-release.apk


@ozcanovunc, sprawdź ponownie swoją ścieżkę do magazynu kluczy. Być może ścieżka została zdefiniowana nieprawidłowo.
bhavesh kaila

Robiąc to, istnieje prawdopodobieństwo, że zostałeś build.gradlesprawdzony pod kontrolą wersji, podobnie jak Twoje hasła! Rozważ wybranie innej trasy, gdy bezpieczeństwo jest ważne w Twoim projekcie.
Marco7757

1
Grade assembleRelease nie działa. Użyj zamiast gradlew assembleRelease
Sathish Gadde


-3

menu budowania> wygeneruj podpisany apk


Jeśli to uruchomisz, powie ci, że to nie jest właściwy sposób. Poza tym, jeśli prześlę ten plik .apk, pojawi się błąd informujący, że wykryte błędy lub coś jest włączone.
Gooey

11
mówi, że debugowanie jest włączone ... w Android Studio po lewej stronie powinna znajdować się zakładka z napisem `` warianty kompilacji '' ... kliknij ją i przełącz wszystko z `` debugowania '' na `` wydanie '' ... po tym , ponownie wygeneruj podpisany apk ...
trickedoutdavid

2
To już nie działa! Na przykład plik APK, który buduje, ma BuildConfig.DEBUG ustawiony na true. Sprawiło mi to niekończące się kłopoty, musisz teraz użyć metody gradlew assembleRelease.
Ben Clayton,

@BenClayton Masz całkowitą rację! Straciłem przez to godziny! Kolejny bardzo irytujący "błąd" w Android Studio - Nie widać końca z problemami ...
sjkm

Zastanawiam się, dlaczego ten prosty krok nie może być najbardziej odpowiednim sposobem na wygenerowanie podpisanego apk, jak wyraźnie wspomniano. Ten krok wygenerował aplikację i działa idealnie dla mnie, bez żadnych problemów. Ale wiele innych odpowiedzi na SO zdezorientowało mnie, że to, co zrobiłem, może nie być poprawne lub co.
Atul
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.