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

Затова се опитвам да публикувам новото си приложение за Android в Google PlayStore. От прочита на този урок разбирам, че имам за да подпиша приложението си, преди да го пусна в PlayStore. Направих точно същото като в урока. След като го качих в PlayStore, се опитах да инсталирам приложението на моето устройство. Получих съобщението „Пакетният файл не е подписан правилно“. Това е странно.. В xamaran studio получавам съобщението „Пакетът е подписан успешно“.

Ако се опитам да инсталирам приложението от 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, получавам съобщение No such command Търсих в Google известно време и открих, че трябва да направите ./zipalign, но след това получавам съобщение No such file or directory.   -  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 Locations -› Android - person Dave Wolfe; 01.08.2014
comment
Не съм сигурен дали само Java 6 работи, но мога да потвърдя, че Java 8 не работи за мен на OSX Yosemite. Не промених нито един от инструментите или версиите на Java, използвани в моята среда за разработка (която е Java 8 от java -version)... и средата Dev е Xamarin... но мога да кажа, че когато използвах версията на Java 6 на jarsigner, че след това успях да стартирам приложението от магазина на Google Play и не можах да го направя по друг начин. - person Phil Ryan; 06.11.2014

Когато публикувам на Mac, автоматизирам процеса с помощта на rake. Тази същност е примерен рейк файл, показващ как да го направите. Този рейк файл ще версира асемблито, ще компилира приложението и след това ще подпише/ципалнира APK.

Имайте предвид, че Albacore gem също трябва да бъде инсталиран.

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/publishing_an_application/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) на

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

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 Services

Тази грешка се разрешава чрез промяна от JDK 6 на JDK 7. Поради това сега моето приложение, което вече е внедрено в Google Play Store, извежда „Пакетният файл не е подписан правилно“ в някои смартфони.

Има ли начин да подпишете приложението правилно с помощта на JDK 7 и Xamarin?

person user1261620    schedule 18.09.2014