Próbuję skonfigurować proces podpisywania, aby hasło do magazynu kluczy i hasło klucza nie były przechowywane w build.gradle
pliku projektu .
Obecnie w build.gradle
:
android {
...
signingConfigs {
release {
storeFile file("my.keystore")
storePassword "store_password"
keyAlias "my_key_alias"
keyPassword "key_password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
Działa doskonale, ale nie mogę umieszczać wartości storePassword
i keyPassword
w moim repozytorium. Wolałbym nie stawiać storeFile
i keyAlias
tam też.
Czy istnieje sposób, aby to zmienić, build.gradle
tak aby uzyskiwał hasła z jakiegoś zewnętrznego źródła (np. Plik znajdujący się tylko na moim komputerze)?
Oczywiście zmieniony build.gradle
powinien być użyteczny na każdym innym komputerze (nawet jeśli komputer nie ma dostępu do haseł).
Używam Android Studio i Mac OS X Maverics, jeśli ma to znaczenie.
android
gradle
android-studio
code-signing
Bobrovsky
źródło
źródło
build.gradle
, trzeba mieć coś innego niżbuild.gradle
, czy to jest dostosowanie do zmiennych środowiskowych (na jedną odpowiedź), plik właściwości (na inną odpowiedź) lub w inny sposób. Jeśli nie chcesz mieć rzeczy na zewnątrzbuild.gradle
, z definicji wszystkie informacje dotyczące podpisu muszą znajdować się wewnątrzbuid.gradle
.Odpowiedzi:
Zaletą Groovy jest to, że możesz dowolnie mieszać kod Java i jest dość łatwy do odczytania w pliku klucz / wartość za pomocą
java.util.Properties
. Być może istnieje jeszcze łatwiejszy sposób korzystania z idiomatycznego Groovy, ale Java jest nadal dość prosta.Utwórz
keystore.properties
plik (w tym przykładzie w katalogu głównym projektu oboksettings.gradle
, ale możesz go umieścić w dowolnym miejscu:Dodaj to do
build.gradle
:źródło
storeFile file('AndroidManifest.xml')
), A następnie późniejsze nadpisanie powoduje, że ma miejsce proces podpisywania.Error:(24, 0) Could not find property 'android' on root project 'RootProjectName'
którym wiersz 24 jest linią z blokiem if. Dodanieapply plugin: 'com.android.application'
do katalogu głównego build.gradle umożliwia również niepowodzenie kompilacji. Co ja robię źle?Could not get unknown property 'android' for root project
Alternatywnie, jeśli chcesz zastosować odpowiedź Scotta Barty w sposób bardziej podobny do automatycznie wygenerowanego kodu gradle, możesz utworzyć
keystore.properties
plik w folderze głównym projektu:i zmodyfikuj swój kod gradle, aby:
Możesz przechowywać ten plik właściwości w katalogu głównym swojego modułu, w takim przypadku po prostu go pomiń
rootProject
, a także możesz zmodyfikować ten kod, aby mieć kilka zestawów właściwości dla różnych magazynów kluczy i aliasów kluczy.źródło
if ( keystorePropertiesFile.exists() )
upewniłem się, że plik jest obecny, zanim spróbowałem uzyskać atrybuty i spróbowałem podpisać..txt
rozszerzenia na końcukeystore.properties
pliku..txt
rozszerzenia wkeystore.properties
pliku.Najłatwiej jest stworzyć
~/.gradle/gradle.properties
plik.Wtedy twój
build.gradle
plik może wyglądać tak:źródło
Po przeczytaniu kilku linków:
http://blog.macromates.com/2006/keychain-access-from-shell/ http://www.hardtworks.com/es/insights/blog/signing-open-source-android-apps-without-disclosing- Hasła
Ponieważ używasz systemu Mac OSX, możesz użyć Dostępu do pęku kluczy do przechowywania haseł.
Następnie w swoich skryptach ocen:
Użyj w ten sposób:
źródło
Tak to robię. Użyj zmiennych środowiskowych
źródło
Neither path nor baseDir may be null or empty string. path='null'
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 przyjemnie jest przechowywać projekt w kontroli wersji, zachowując klucze i hasła osobno, a nie w pliku build.gradle:
źródło
Zaakceptowana odpowiedź używa pliku do kontrolowania, którego magazynu kluczy użyć do podpisania pliku APK, który znajduje się w tym samym folderze głównym projektu. Kiedy używamy vcs, takich jak Git , może być źle, gdy zapomnimy dodać plik właściwości do ignorowania listy. Ponieważ ujawnimy światu nasze hasło. Problemy nadal istnieją.
Zamiast tworzyć plik właściwości w tym samym katalogu w naszym projekcie, powinniśmy zrobić to na zewnątrz. Robimy to na zewnątrz za pomocą pliku gradle.properties.
Oto kroki:
1. Edytuj lub utwórz gradle.properties w swoim głównym projekcie i dodaj następujący kod, pamiętaj, aby edytować ścieżkę za pomocą własnej:
2.Utwórz androidproject.properties w / your / path / i dodaj do niego następujący kod, nie zapomnij zmienić /your/path/to/android.keystore na ścieżkę do magazynu kluczy:
3. W module aplikacji build.gradle (nie w katalogu głównym projektu build.gradle) dodaj następujący kod, jeśli nie istnieje, lub dostosuj go:
4. Dodaj następujący kod poniżej kodu w kroku 3:
Ten kod wyszuka właściwość AndroidProject.signing w gradle.properties z kroku 1 . Jeśli właściwość zostanie znaleziona, przetłumaczy wartość właściwości jako ścieżkę do pliku, która wskazuje na androidproject.properties, które utworzymy w kroku 2 . Następnie cała wartość właściwości z niego zostanie użyta jako konfiguracja podpisywania dla naszego build.gradle.
Teraz nie musimy ponownie martwić się ryzykiem ujawnienia naszego hasła do magazynu kluczy.
Przeczytaj więcej na temat podpisywania aplikacji na Androida bez umieszczania informacji o magazynie kluczy w pliku build.gradle
źródło
Dla tych, którzy chcą umieścić swoje dane uwierzytelniające w zewnętrznym pliku JSON i przeczytać to z gradle, oto co zrobiłem:
my_project / credentials.json:
my_project / android / app / build.gradle
Powodem, dla którego wybrałem
.json
typ pliku, a nie.properties
typ pliku (jak w zaakceptowanej odpowiedzi), jest to, że chciałem również przechowywać inne dane (inne potrzebne właściwości niestandardowe) w tym samym pliku (my_project/credentials.json
) i nadal mieć gradle przeanalizować podpisywanie również informacji z tego pliku.źródło
To pytanie otrzymało wiele poprawnych odpowiedzi, ale chciałem udostępnić mój kod, który może być przydatny dla opiekunów bibliotek , ponieważ pozostawia oryginał
build.gradle
całkiem czysty .Dodaję folder do katalogu modułu, który ja
gitignore
. To wygląda tak:keystore.jks
isigning.properties
powinno być oczywiste. Isigning.gradle
wygląda tak:I oryginał
build.gradle
Jak widać, nie musisz w ogóle określać buildTypes, jeśli użytkownik ma dostęp do prawidłowego
signing
katalogu, po prostu umieszcza go w module i może zbudować poprawną podpisaną aplikację do wydania, w przeciwnym razie działa to po prostu dla niego jak normalnie by to zrobił.źródło
apply from
powinien przyjść poandroid
blokuMożesz zażądać hasła z wiersza poleceń:
Ta odpowiedź pojawiła się wcześniej: https://stackoverflow.com/a/33765572/3664487
źródło
Moje hasło zawierało specjalny znak, którym był znak dolara $ i musiałem przed tym uniknąć w pliku gradle.properties. Potem podpisywanie zadziałało dla mnie.
źródło