Я пытаюсь настроить процесс подписи так, чтобы пароль хранилища ключей и пароль ключа не сохранялись в build.gradle
файле проекта .
В настоящее время у меня есть следующее в build.gradle
:
android {
...
signingConfigs {
release {
storeFile file("my.keystore")
storePassword "store_password"
keyAlias "my_key_alias"
keyPassword "key_password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
Это прекрасно работает, но я не должен помещать значения для storePassword
, и keyPassword
в моем хранилище. Я бы предпочел не ставить storeFile
и keyAlias
там тоже.
Есть ли способ изменить build.gradle
так, чтобы он получал пароли от какого-то внешнего источника (например, файл, который находится только на моем компьютере)?
И, конечно, измененный build.gradle
должен быть применим на любом другом компьютере (даже если компьютер не имеет доступа к паролям).
Я использую Android Studio и Mac OS X Maverics, если это имеет значение.
android
gradle
android-studio
code-signing
Бобровский
источник
источник
build.gradle
, вы будете иметь что - то другое , чемbuild.gradle
, будь то это корректировка переменных среды (для одного ответа), файла свойств (для другого ответа) или некоторых других средств. Если вы не хотите, чтобы что-то находилось за пределамиbuild.gradle
, тогда по определению вся информация для подписи должна быть внутриbuid.gradle
.Ответы:
Хорошая особенность Groovy в том, что вы можете свободно смешивать код Java, и его довольно легко прочитать в файле ключ / значение
java.util.Properties
. Возможно, есть еще более простой способ использовать идиоматический Groovy, но Java все еще довольно прост.Создайте
keystore.properties
файл (в этом примере, в корневом каталоге вашего проектаsettings.gradle
, хотя вы можете поместить его в любое место:Добавьте это к вашему
build.gradle
:источник
storeFile file('AndroidManifest.xml')
) и последующее переопределение его вызывает процесс подписания.Error:(24, 0) Could not find property 'android' on root project 'RootProjectName'
где строка 24 соответствует строке if. Добавлениеapply plugin: 'com.android.application'
в корень build.gradle также дает сбой при сборке. Что я делаю не так?Could not get unknown property 'android' for root project
В качестве альтернативы, если вы хотите применить ответ Скотта Барты способом, более похожим на автоматически сгенерированный код gradle, вы можете создать
keystore.properties
файл в корневой папке вашего проекта:и измените свой код Gradle на:
Вы можете сохранить этот файл свойств в корне вашего модуля, в этом случае просто пропустите
rootProject
, и вы также можете изменить этот код, чтобы иметь несколько наборов свойств для разных хранилищ ключей и псевдонимов ключей.источник
if ( keystorePropertiesFile.exists() )
чтобы убедиться, что файл присутствует, прежде чем пытаться получить атрибуты и попытаться подписать..txt
расширение в конецkeystore.properties
файла..txt
расширениеkeystore.properties
файла.Самый простой способ - создать
~/.gradle/gradle.properties
файл.Тогда ваш
build.gradle
файл может выглядеть так:источник
Прочитав несколько ссылок:
http://blog.macromates.com/2006/keychain-access-from-shell/ http://www.thoughtworks.com/es/insights/blog/signing-open-source-android-apps-without-disclosing- пароли
Поскольку вы используете Mac OSX, вы можете использовать Keychain Access для хранения ваших паролей.
Тогда в ваших скриптах:
Используйте как это:
источник
Вот как я это делаю. Используйте переменные среды
источник
Neither path nor baseDir may be null or empty string. path='null'
Можно взять любой существующий проект для Android Studio gradle и создать / подписать его из командной строки без редактирования каких-либо файлов. Это делает его очень удобным для хранения вашего проекта в системе контроля версий, при этом ваши ключи и пароли хранятся отдельно, а не в файле build.gradle:
источник
Принятый ответ использует файл для управления тем, какое хранилище ключей использовать для подписи APK, который находится в той же корневой папке проекта. Когда мы используем vcs, такие как Git , может быть плохо, когда мы забываем добавить файл свойств, чтобы игнорировать список. Потому что мы раскроем наш пароль миру. Проблемы все еще сохраняются.
Вместо создания файла свойств в том же каталоге в нашем проекте, мы должны сделать это снаружи. Мы делаем это снаружи, используя файл gradle.properties.
Вот шаги:
1. Измените или создайте gradle.properties в своем корневом проекте и добавьте следующий код, не забудьте отредактировать путь самостоятельно:
2. Создайте androidproject.properties в / your / path / и добавьте в него следующий код, не забудьте изменить /your/path/to/android.keystore на путь вашего хранилища ключей:
3.В своем модуле приложения build.gradle (не в корневом каталоге проекта build.gradle) добавьте следующий код, если он не существует, или настройте его:
4. Добавьте следующий код под кодом в шаге 3:
Этот код будет искать свойство AndroidProject.signing в gradle.properties, начиная с шага 1 . Если свойство найдено, оно будет переводить значение свойства как путь к файлу, который указывает на androidproject.properties, который мы создаем на шаге 2 . Тогда все значение свойства из него будет использоваться в качестве конфигурации подписи для нашего build.gradle.
Теперь нам не нужно снова беспокоиться о риске раскрытия пароля нашего хранилища ключей.
Читайте больше на Подписи apk Android, не помещая информацию о хранилище ключей в build.gradle
источник
Для тех, кто хочет поместить свои учетные данные во внешний файл JSON и прочитать их из Gradle, это то, что я сделал:
my_project / credentials.json:
my_project / Android / приложение / build.gradle
Причина, по которой я выбрал
.json
тип файла, а не.properties
тип файла (как в принятом ответе), заключается в том, что я хотел также сохранить другие данные (другие необходимые мне пользовательские свойства) в этот же файл (my_project/credentials.json
) и по-прежнему иметь возможность анализировать gradle подписывая информацию из этого файла, а также.источник
На этот вопрос было получено много правильных ответов, но я хотел поделиться своим кодом, который может быть полезен для сопровождающих библиотек , поскольку он оставляет оригинал
build.gradle
достаточно чистым .Я добавляю папку в каталог модулей, который я
gitignore
. Это выглядит так:keystore.jks
иsigning.properties
должен быть самоочевидным. Иsigning.gradle
выглядит так:И оригинал
build.gradle
Как видите, вам вообще не нужно указывать buildTypes: если у пользователя есть доступ к действительному
signing
каталогу, он просто помещает его в модуль и может создать действительное приложение с подписанным выпуском, в противном случае он просто работает для него, как это было бы нормально.источник
apply from
должен прийти послеandroid
блокаВы можете запросить пароли из командной строки:
Этот ответ ранее появился: https://stackoverflow.com/a/33765572/3664487
источник
Мой пароль содержал специальный символ, который обозначал знак доллара $, и мне пришлось экранировать его в файле gradle.properties. После этого подписание сработало для меня.
источник