Android-студия: релиз apk не подписан

* Я перефразировал сообщение с тех пор, как он был первоначально опубликован *

Когда я пытаюсь запустить только что выпущенный apk, я получаю сообщение об ошибке "apk для выбранного вами варианта... не подписан". Это находится во всплывающем меню "Редактирование конфигурации". Вот мои шаги:

  • На вкладке "Варианты сборки" выберите "release"
  • В меню выберите Build → Generate Signed APK
  • В раскрывающемся списке заполните поля для хранилища ключей и паролей.
  • На второй панели измените папку назначения на... \app\build\output\apk (см. примечание * ниже)
  • Соблюдайте уведомление в правом верхнем углу студии: APK сгенерированы успешно.
  • В меню выберите "Выполнить" → "Запустить приложение".
  • Я получаю всплывающее окно "Редактировать конфигурацию" с ошибкой "Apk для выбранного вами варианта... не подписан.

Итак, почему эта ошибка? Созданный APK представляется действительным. Я успешно разместил его в Android Store (только для альфа-тестирования) и проверил, что дампы стека запутаны.

То, что я не могу сделать, это загрузить его (шаг 6 выше) на мое устройство. Я думаю, это нормально, так как я могу скачать версию отладки просто отлично.

(*) Android Studio по умолчанию выводит для выпуска apk более высокий, предположительно более удобный каталог. Однако мне сложнее управлять согласованностью сгенерированных файлов, когда они разбросаны, поэтому я предпочитаю все сгенерированные apks в одном месте.

Ответ 1

Перейти к файлу\Структура проекта

Вкладка подписи

Вкладка

Тип сборки

Готово!;)

Ответ 2

Установить конфигурацию подписки в структуре проекта.

  • Файл → Структура проекта...
  • Выберите модули/приложение (или другой модуль)
  • Нажмите вкладку Подпись и заполните.
    На первом месте появляется ключевой псевдоним и пароль ключа. Не тот же порядок в диалоговом окне "Создать подпись APK".
  • Нажмите вкладку "Построить типы" и выберите выпуск.
    Выберите "config" в раскрывающемся списке "Конфигурация".
  • Нажмите "ОК", чтобы закрыть структуру проекта.
  • Запустить → Запустить приложение

Запуск (или отладка) приложения, похоже, использует apks, созданный с помощью "Buiild → Build APK". Итак, мы должны установить подпись config, если варианты сборки модуля приложения "освобождены".

Ответ 3

Добавьте эту строку в ваш релиз {...} внутри build.gradle

signingConfig signingConfigs.config

Ответ 4

Сначала создайте файл хранилища ключей, если его нет.

  1. Нажмите Build из выпадающего меню
  2. Выберите Создать подписанный APK
  3. Нажмите Далее
  4. Нажмите Создать новое хранилище ключей
  5. Заполните форму для пути хранилища ключей, псевдонима, пароля для хранилища ключей и псевдонима, хотя бы одно поле в области сертификата.
  6. Нажмите ОК
  7. Файл хранилища ключей должен быть создан по указанному пути хранилища ключей.

Во-вторых, обновите файл Gradle сборки приложения до такого типа, чтобы он включал конфигурацию подписи.

android {
    signingConfigs {
        config {
            keyAlias 'mykeyalias'
            keyPassword 'android'
            storeFile file('/Users/yourname/path/to/the/android/project/folder/android_project_folder_name/app/debug.keystore')
            storePassword 'android'
        }
    }
    buildTypes {
        debug {
            applicationIdSuffix = ".debug"
            versionNameSuffix "-debug"
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
    }
}

В-третьих, собрать и запустить приложение, готово.

Ответ 5

В https://developer.android.com/studio/publish/app-signing#secure-shared-keystore написано, что вы не должны хранить информацию о полномочиях в build.gradle и VCS. Поэтому создайте файл конфигурации подписи ("Создать"> "Создать подписанный APK"), а затем сделайте это.

Создайте файл с именем keystore.properties в корневом каталоге вашего проекта. Этот файл должен содержать вашу информацию для подписи, а именно:

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

В файле build.gradle модуля, добавьте код для загрузки вашего keystore.properties файла перед android {} блока.

// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    ...
}

Вы можете ссылаться на свойства, хранящиеся в keystoreProperties используя синтаксис keystoreProperties['propertyName']. Измените блок signingConfigs вашего файла build.gradle модуля, чтобы он ссылался на информацию о подписи, хранящуюся в keystoreProperties используя этот синтаксис.

android {
    signingConfigs {
        config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    ...
}

При желании в build.gradle вы можете добавить:

buildTypes {
    release {
        ...
        signingConfig signingConfigs.config
    }
}

Теперь вы можете сделать подписанный апк. Не забудьте исключить keystore.properties из VCS.

Ответ 6

Попробуйте добавить это в свой файл сборки:

buildTypes {
release {
        signingConfig signingConfigs.release
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled false
    }
}

Ответ 7

У меня была та же проблема, я неправильно signingConfigs свойство signingConfigs.

В частности, я думал, что у меня нет пароля для ключа, который я на самом деле установил. После добавления недостающей информации все заработало.

signingConfigs {
        config {
            keyAlias 'key0'
            storeFile file('C:/Users/xxx/xxx/keystore/xxx.jks')
            storePassword '123'
            keyPassword '123' // this was missing
        }
    }