Ви помилково підписали ключ налагодження?
Google Play не дозволяє публікувати додаток, підписаний вашим налагоджувальним магазином. Якщо ви спробуєте завантажити такий APK, Google Play не вдасться отримати повідомлення "Ви завантажили APK, який був підписаний у режимі налагодження. Вам потрібно підписати APK у режимі випуску".
Однак, якщо ви спробуєте завантажити оновлення, яке підписано за допомогою зберігання ключів налагодження, це повідомлення ви не побачите; Google Play відобразить повідомлення, яке відображається у запитанні, з посиланням на відбитки пальців SHA1.
Отже, по-перше, перевірте, чи підписали ви програму ключем налагодження помилково.
Як перевірити, які ключі підписання використовували?
Зберіть інформацію з АПК
Ви можете перевірити, з якими сертифікатами було підписано оригінальний APK та оновлений APK, скориставшись цими командами, використовуючи Java keytool
:
keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk
Це показує детальну інформацію про те, як підписано APK, наприклад:
Owner: CN=My App, O=My Company, L=Somewhere, C=DE
Issuer: CN=My App, O=My Company, L=Somewhere, C=DE
Serial number: 4790b086
Valid from: Mon Nov 11 15:01:28 GMT 2013 until: Fri Mar 29 16:01:28 BST 2041
Certificate fingerprints:
MD5: A3:2E:67:AF:74:3A:BD:DD:A2:A9:0D:CA:6C:D4:AF:20
SHA1: A6:E7:CE:64:17:45:0F:B4:C7:FC:76:43:90:04:DC:A7:84:EF:33:E9
SHA256: FB:6C:59:9E:B4:58:E3:62:AD:81:42:...:09:FC:BC:FE:E7:40:53:C3:D8:14:4F
Signature algorithm name: SHA256withRSA
Version: 3
Тут важливі частини - для кожного APK - значення відбитка пальця SHA1, значення ідентичності власника та Дійсне від / до дати.
Якщо ця keytool
команда не працює ( -jarfile
опція вимагає Java 7), ви можете отримати більш базову інформацію за допомогою jarsigner
команди:
jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk
Це, на жаль, не показує відбиток SHA1, але відображає особу власника X.509, а також дати закінчення терміну дії сертифіката. Наприклад:
sm 4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)
X.509, CN=My App, O=My Company, L=Somewhere, C=DE
[certificate is valid from 11/11/13 12:12 to 29/03/41 12:12]
[CertPath not validated: Path does not chain with any of the trust anchors]
Ви можете ігнорувати будь-яке повідомлення "CertPath не перевірено", а також попередження про ланцюжки сертифікатів або часові позначки; вони не мають відношення до цього випадку.
Порівняйте значення власника, SHA1 та терміну придатності між APK
Якщо значення ідентичності власника / X.509 є CN=Android Debug, O=Android, C=US
, тоді ви підписали APK за допомогою ключа налагодження , а не оригінального ключа випуску
Якщо значення відбитків SHA1 відрізняється від оригінальних та оновлених APK, ви не використовували однаковий ключ підпису для обох APK
Якщо значення ідентичності власника / X.509 відрізняються або дати закінчення терміну дії сертифіката відрізняються між двома APK, ви не використовували однаковий ключ підпису для обох APK
Зауважте, що навіть якщо значення Owner / X.509 однакові між двома сертифікатами, це не означає, що сертифікати однакові - якщо щось інше не відповідає - наприклад, значення відбитків пальців - сертифікати відрізняються.
Знайдіть оригінальну сховище ключів, перевірте резервні копії
Якщо два APK-файли мають різну інформацію про сертифікати, ви повинні знайти оригінальну сховище ключів, тобто файл із першим значенням відбитків SHA1, keytool
про який вам повідомив Google Play (або ).
Перегляньте всі файли зберігання ключів, які ви можете знайти на своєму комп’ютері та в будь-яких резервних копіях, поки у вас не буде файл із правильним відбитком SHA1:
keytool -list -keystore my-release.keystore
Просто натисніть, Enterякщо буде запропоновано пароль - вам не обов’язково вводити його, якщо ви просто хочете швидко перевірити значення SHA1.
Я ніде не можу знайти оригінальний магазин брелоків
Якщо ви не зможете знайти оригінальну сховище ключів, ви ніколи не зможете публікувати будь-які оновлення цього конкретного додатка.
Android це чітко згадує на сторінці " Підписання програми ":
Попередження: зберігайте свій магазин зберігання ключів та приватний ключ у надійному та надійному місці та переконайтесь, що у вас є безпечні резервні копії. Якщо ви опублікуєте додаток у Google Play, а потім втратите ключ, з яким ви підписали додаток, ви не зможете публікувати жодних оновлень свого додатка, оскільки ви завжди повинні підписувати всі версії свого програми одним і тим же ключем.
Після першого випуску APK всі наступні випуски повинні бути підписані точно таким же ключем.
Чи можна витягти оригінальний ключ підпису з оригінального APK?
Ні. Це неможливо. APK містить лише публічну інформацію, а не інформацію про ваш приватний ключ.
Чи можна перейти до нового ключа підписання?
Ні. Навіть якщо ви знайдете оригінал, ви не можете підписати APK за допомогою ключа A, потім підпишіть наступне оновлення обома клавішами A і B, а потім підпишіть наступне оновлення після цього лише клавішею B.
Підписання APK (або будь-якого файлу JAR) декількома ключами технічно можливо, але Google Play більше не приймає APK-файли з декількома підписами.
Спроба зробити це призведе до повідомлення "Ваш APK підписано з декількома сертифікатами. Будь ласка, підпишіть його лише одним сертифікатом та завантажте його знову".
Що я можу зробити?
Вам потрібно буде створити додаток з новим ідентифікатором програми (наприклад, змінити з "com.example.myapp" на "com.example.myapp2") та створити абсолютно новий список у Google Play.
Можливо, вам також доведеться змінити код, щоб люди могли встановити нову програму, навіть якщо у них встановлено стару програму, наприклад, вам потрібно переконатися, що у вас немає конфліктуючих постачальників вмісту.
Ви втратите наявну базу встановлення, огляди тощо, і вам доведеться знайти спосіб спонукати існуючих клієнтів до видалення старого додатка та встановлення нової версії.
Знову ж таки, переконайтеся, що у вас є безпечні резервні копії зберігання ключів і паролів, які ви використовуєте для цієї версії.