React Native Generated Signed APK "Файл KeyStore, не установленный для подписания версии конфигурации"

Я пытаюсь создать подписанный APK. У меня есть файл password.keystore, расположенный в \Dictionary\android\app, и когда я запускал gradlew assembleRelease на cmd, ошибка:

Выполнение не выполнено для задачи ': app: validateSigningRelease'.

Файл Keystore не установлен для подписания версии конфигурации

Где я должен хранить свой файл password.keystore? Потому что, когда я прокомментировал if (project.hasProperty("password.keystore") { он работает, но со следующей ошибкой:

Не удалось обработать входящее событие "ProgressComplete" (ProgressCompleteEvent)

Как мне написать условие if, или где я должен хранить файл password.keystore?

Исходный код выглядит следующим образом:

signingConfigs {
  release {
    if (project.hasProperty("password.keystore")) {
      storeFile file("password.keystore")
      storePassword "password"
      keyAlias "username"
      keyPassword "password"
    }
  }
}

Ответы

Ответ 1

Файл хранилища ключей должен находиться в папке android/app.

Сообщение "Файл Keystore, не установленный для подписания файла конфигурации", должно сделать так, чтобы в файле android/app/build.gradle не было подписания кода.

buildTypes {
    release {
        // other settings
        signingConfig signingConfigs.release
    }
}

Для тестирования вы можете просто закодировать настройки в android/app/build.gradle, а не устанавливать его в gradle.properties. Это было исправление для меня проблема с "Keystore была подделана, или пароль был неправильным"

  signingConfigs {
    release {
        //if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
            storeFile file("key.keystore")
            storePassword "****"
            keyAlias "myKey"
            keyPassword "****"
       // }
    }
}

Ответ 2

Я нашел решение!

Если вы следовали официальным инструкциям React Native, как и я, вы добавляете следующее в свои gradle.properties

MYAPP_RELEASE_STORE_FILE=<your-app>.keystore
MYAPP_RELEASE_KEY_ALIAS=<keystore-alias>
MYAPP_RELEASE_STORE_PASSWORD=<password>
MYAPP_RELEASE_KEY_PASSWORD=<password>

А потом наступает момент, который я совершенно не понял.

В app/build.gradle -file вы не должны заменять строки. Если ваш gradle.properties похож на тот, который я вставил, ваш app/build.gradle должен выглядеть так:

signingConfigs {
    release {
        if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
            storeFile file(MYAPP_RELEASE_STORE_FILE)
            storePassword MYAPP_RELEASE_STORE_PASSWORD
            keyAlias MYAPP_RELEASE_KEY_ALIAS
            keyPassword MYAPP_RELEASE_KEY_PASSWORD
        }
    }
}

Первоначально я заменил строки (то есть 'MYAPP_RELEASE_STORE_FILE' на путь к моему хранилищу ключей -file), но вы не должны заменять какие-либо переменные вообще. Я предполагаю, что вы могли видеть связь между строками, которые мы создали в gradle.properties и выпуском-config, который мы сделали в app/build.gradle.

Не забудьте также иметь свой .keystore -file внутри android/app.

Ответ 3

У меня была такая же проблема. Оказывается, я забыл изменить файл gradle.properties. Он должен выглядеть так:

android.useDeprecatedNdk=true

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias

Ответ 4

В моем случае мой проект был на RN версии 0.59, в то время как я использовал документацию 0,60 RC. Так что внутри app/build.gradle

Если версия 0.59:

if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {

Если версия 0.60:

if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {

Разница заключается в переходе с RELEASE на UPLOAD

Ответ 5

project.hasProperty будет искать в вашем файле gradle.properties переменную с именем password.keystore.

Перейдите в ~/.gradle и посмотрите, есть ли у gradle.properties файл gradle.properties, убедитесь, что переменная password.keystore существует, она должна указывать на файл хранилища ключей: password.keystore=password.keystore.

Хотя вы должны назвать это чем-то другим, например MYAPP_RELEASE_STORE_FILE=password.keystore. Затем, когда вы запустите ./gradlew assembleRelease ваш проект будет иметь свойство, которое он ищет, и следующее будет разрешать true и разрешить gradlew устанавливать все свойства signConfigs.release:

if (project.hasProperty(MYAPP_RELEASE_STORE_FILE)) {
    storeFile file(...)
    storePassword your_password_property
    ...
}

Ответ 6

Изучив все ответы на эту проблему, ни один из ответов не помог!

Так что попробовали под эксперимент, и это помогло !!!!

Поместите файл my-release-key.keystore в каталог android в папке проекта.

Ответ 7

Я предпочитаю хранить эти параметры вне репо приложения, используя переменные среды, поскольку он содержит конфиденциальную информацию, такую как пароль и т.д.

signingConfigs {
    release {
        if (System.env.MYAPP_RELEASE_STORE_FILE != null) {
            storeFile       file(System.env.MYAPP_RELEASE_STORE_FILE)
            storePassword   System.env.MYAPP_RELEASE_STORE_PASSWORD
            keyAlias        System.env.MYAPP_RELEASE_KEY_ALIAS
            keyPassword     System.env.MYAPP_RELEASE_KEY_PASSWORD
        }
    }
}

Как только это будет сделано, я могу просто загрузить скрипт bash, который имеет такие детали, как

# path to my keystore
export MYAPP_RELEASE_STORE_FILE=/path/to/key.file
# ...

Таким образом, конфиг подписания полностью изолирован от репо. Это мешает вам совершать случайные коммиты с вашими секретами.

Ответ 8

Убедитесь, что вы разместили файл .keystore внутри папки приложения и делаете изменения в градиенте, как показано ниже:

    signingConfigs {
    release {
        storeFile file(RELEASE_STORE_FILE)
        storePassword RELEASE_STORE_PASSWORD
        keyAlias RELEASE_KEY_ALIAS
        keyPassword RELEASE_KEY_PASSWORD
    }
}

Ответ 9

Убедитесь, что псевдоним, используемый в gradle.properties, совпадает с тем, который использовался при создании keystore (с помощью keytool)