Подписание приложения xamarin.android не работает

Поэтому я пытаюсь опубликовать свое новое приложение для Android в Google PlayStore. Прочитав этот учебник, я понял, что у меня есть чтобы подписать мое приложение перед его выпуском в PlayStore. Я сделал точно так же, как в учебнике. После загрузки в PlayStore я попытался установить приложение на свое устройство. Я получил сообщение «Файл пакета был подписан неправильно». Это странность. В студии xamaran я получаю сообщение «Пакет успешно подписан».

Если я пытаюсь установить приложение из apk на устройство, я получаю сообщение «Невозможно установить».

Что здесь может быть не так?

Я использую Xamarin Studion на Mac.


person Florian Schaal    schedule 13.05.2013    source источник
comment
Вы используете Xamarin Studio или Visual Studio? Вы используете OSX или Windows?   -  person Tom Opgenorth    schedule 13.05.2013
comment
@TomOpgenorth Я отредактировал свой вопрос :)   -  person Florian Schaal    schedule 14.05.2013
comment
Исходя из моего опыта, я бы рекомендовал вручную подписывать ваше приложение. ">docs.xamarin.com/guides/android/   -  person Aaron He    schedule 14.05.2013
comment
@AaronHe Хорошо Подписание вручную работало нормально, но когда я пытаюсь выполнить zipalign, я получаю сообщение Нет такой команды. Погуглил немного и обнаружил, что вам нужно выполнить ./zipalign, но затем я получаю сообщение Нет такого файла или каталога.   -  person Florian Schaal    schedule 14.05.2013
comment
@AaronHe Это сработало, теперь я выровнял и подписал свой пакет. Когда я загружаю его сейчас в Playstore, он говорит, что ваш APK был подписан несколькими сертификатами. Пожалуйста, подпишите его только одним сертификатом и загрузите его снова.   -  person Florian Schaal    schedule 14.05.2013


Ответы (5)


Обнаружена проблема. Это проблема инструментов JAVA. Это часто происходит при смешивании инструментов JDK и JRE в системе.

НЕ ИСПОЛЬЗУЙТЕ ИНСТРУМЕНТЫ ОТ Java 7!

Используйте только инструменты из JDK 6. Вы можете проверить, какая у вас версия, набрав:

java -version

Если вы все еще не уверены, было ли подписание успешным, вы можете ввести:

which jarsigner

jarsigner -verify -verbose -certs myapp.apk
person Florian Schaal    schedule 15.05.2013
comment
Просто столкнулся с этой проблемой и хотел добавить, что путь (по крайней мере, в OSX 10.9) к JDK 6 — это /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home, и вы можете установить это в Xamarin Studio в настройках -> Расположение SDK -> Android - person Dave Wolfe; 01.08.2014
comment
Я не уверен, работает ли только Java 6, но я могу подтвердить, что Java 8 не работала у меня на OSX Yosemite. Я не менял никаких инструментов или версий Java, используемых в моей среде разработки (это Java 8 из java -version)... а средой разработки является Xamarin... но я могу сказать, что когда я использовал версию Java 6 для jarsigner, что затем я смог запустить приложение из магазина Google Play, но никак иначе. - person Phil Ryan; 06.11.2014

При публикации на Mac я автоматизирую процесс с помощью rake. Это описание представляет собой пример файла рейка, показывающего, как это сделать. Этот файл rake будет версионировать сборку, компилировать приложение, а затем подписывать/выравнивать APK.

Обратите внимание, что также должен быть установлен гем Albacore.

person Tom Opgenorth    schedule 14.05.2013
comment
Уже исправил это, используя другую версию java. В Java 7 JDK есть ошибка. Но это выглядит намного проще. Я попробую как можно скорее. - person Florian Schaal; 15.05.2013

это, по-видимому, вызвано переходом с JDK 1.6 на JDK 1.7. Вместо того, чтобы придерживаться JDK 1.6 (что в некоторых случаях не подходит), я рекомендую создать небольшой скрипт для создания подписанного и выровненного apk на основе http://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/публикация_приложения/part

# First clean the Release target.
msbuild.exe HelloWorld.csproj /p:Configuration=Release /t:Clean

# Now build the project, using the Release target.
msbuild.exe HelloWorld.csproj /p:Configuration=Release /t:PackageForAndroid

# At this point there is only the unsigned APK - sign it.
# The script will pause here as jarsigner prompts for the password.
# It is possible to provide they keystore password for jarsigner.exe by adding an extra command line parameter -storepass, for example
#    -storepass <MY_SECRET_PASSWORD>
# If this script is to be checked in to source code control then it is not recommended to include the password as part of this script.
& 'C:\Program Files\Java\jdk1.6.0_24\bin\jarsigner.exe' -verbose -sigalg SHA1withRSA -digestalg SHA1  -keystore ./xample.keystore -signedjar ./bin/Release/mono.samples.helloworld-signed.apk ./bin/Release/mono.samples.helloworld.apk publishingdoc

# Now zipalign it.  The -v parameter tells zipalign to verify the APK afterwards.
& 'C:\Program Files\Android\android-sdk\tools\zipalign.exe' -f -v 4 ./bin/Release/mono.samples.helloworld-signed.apk ./helloworld.apk
-_preparing_an_application_for_release/

# First clean the Release target.
msbuild.exe HelloWorld.csproj /p:Configuration=Release /t:Clean

# Now build the project, using the Release target.
msbuild.exe HelloWorld.csproj /p:Configuration=Release /t:PackageForAndroid

# At this point there is only the unsigned APK - sign it.
# The script will pause here as jarsigner prompts for the password.
# It is possible to provide they keystore password for jarsigner.exe by adding an extra command line parameter -storepass, for example
#    -storepass <MY_SECRET_PASSWORD>
# If this script is to be checked in to source code control then it is not recommended to include the password as part of this script.
& 'C:\Program Files\Java\jdk1.6.0_24\bin\jarsigner.exe' -verbose -sigalg SHA1withRSA -digestalg SHA1  -keystore ./xample.keystore -signedjar ./bin/Release/mono.samples.helloworld-signed.apk ./bin/Release/mono.samples.helloworld.apk publishingdoc

# Now zipalign it.  The -v parameter tells zipalign to verify the APK afterwards.
& 'C:\Program Files\Android\android-sdk\tools\zipalign.exe' -f -v 4 ./bin/Release/mono.samples.helloworld-signed.apk ./helloworld.apk

Важной частью является использование параметров -sigalg SHA1withRSA -digestalg SHA1, которые заставляют JDK 1.7 использовать ожидаемый алгоритм дайджеста (вместо SHA-256, который используется по умолчанию в JDK 1.7 и не принимается всеми версиями Android).

Обратите внимание, что вы можете найти местоположение msbuild с помощью

$dotNetVersion = "4.0"
$regKey = "HKLM:\software\Microsoft\MSBuild\ToolsVersions\$dotNetVersion"
$regProperty = "MSBuildToolsPath"

$msbuildExe = join-path -path (Get-ItemProperty $regKey).$regProperty -childpath "msbuild.exe"
person Philipp    schedule 04.12.2014

Я нашел решение здесь https://forums.xamarin.com/discussion/comment/72399/#Comment_72399.

Ответ от Феликса Алкалы работает отлично. Больше никаких сообщений «Приложение не установлено» на устройстве.

Откройте расположения SDK в Xamarin Studio.

Настройки/Проекты/Расположение SDK/Android

и установите Java SDK (JDK) на

/Система/Библиотека/Java/JavaVirtualMachines/1.6.0.jdk/Содержание/Главная

person Francisco    schedule 22.01.2015

При использовании компонента службы Google Play ICS от Xamarin появляется следующая ошибка, если вы используете JDK 6.

2>JAVAC : warning : com\google\ads\mediation\MediationBannerListener.class(com\google\ads\mediation:MediationBannerListener.class): major version 51 is newer than 50, the highest major version supported by this compiler.
2>JAVAC : warning : com\google\ads\mediation\MediationBannerAdapter.class(com\google\ads\mediation:MediationBannerAdapter.class): major version 51 is newer than 50, the highest major version supported by this compiler.

Ошибка сборки проекта Xamarin.Android с сервисами Google Play.

Эта ошибка решается путем перехода с JDK 6 на JDK 7. Из-за этого теперь мое приложение, которое уже развернуто в Google Play Store, выдает «Файл пакета не был подписан правильно» на некоторых смартфонах.

Есть ли способ правильно подписать приложение с помощью JDK 7 и Xamarin?

person user1261620    schedule 18.09.2014