CyanogenMod, почему Маркет не обновляется?

Я купил подержанный HTC Magic с CyanogenMod 5. Есть Гугл Маркет. Рыночная версия — 1.713, что далеко от последней версии IIRC. Биллинг в приложении, во-первых, не поддерживается.

Разве Google Market не должен обновляться при выходе новой версии? Почему моя так не делает? Возможно какое-то вмешательство CyanogenMod. Есть хороший способ обойти это, пожалуйста?

РЕДАКТИРОВАТЬ: немного отладил ситуацию. Я случайно узнал, что обновление рынка происходит вне основного процесса Market — Market (com.android.vending) загружает обновление, затем запускает широковещательное намерение UPDATE_MARKET получателю в другом приложении (com.android.vending.updater), который, в свою очередь, устанавливает пакет. Вот что я получил в LogCat:

02-01 02:34:16.155: W/ActivityManager(121): отказ в разрешении: широковещательное намерение {act=com.android.vending.UPDATE_MARKET dat=content://downloads/download/31} from com.android.vending ( pid=1762, uid=10006) требуется com.android.vending.permission.UPDATE_MARKET из-за получателя com.android.vending.updater/com.android.vending.updater.UpdateMarketReceiver

Таким образом, похоже, что у приложения Market нет разрешения на запуск программы обновления. Однако файл манифеста Vending.apk имеет

<uses-permission android:name="com.android.vending.permission.UPDATE_MARKET" /> 

линия. Как приложение может иметь <uses-permission>, но получать сообщение об отказе в разрешении?

EDIT2: разрешение com.android.vending.permission.UPDATE_MARKET помечено как «подпись» в манифесте MarketUpdater. Это означает, что это разрешение предоставляется только приложениям, подписанным тем же сертификатом, что и MarketUpdater. Это может быть причиной того, что Маркету не предоставлено разрешение - он может быть подписан другим сертификатом.

EDIT3: это именно так. Открытый ключ отличается. Тот, что на Vending.apk, похоже, совпадает с тем, что есть в различных версиях Vending.apk, гуляющих по сети.

CyanogenMod 5 тоже очень старый. Самая новая версия Market может даже не работать на нем должным образом, поэтому я не удивлюсь, если он не обновится сам, потому что ваша версия Android не поддерживается.
Я не так беспокоюсь о том, чтобы получить самую последнюю информацию; пока работает биллинг в приложении. Официально биллинг в приложении поддерживается на Android 2.1 (вплоть до 1.6), и я надеюсь, что Google обнаружит текущую версию ОС и предложит что-то подходящее. Теперь о разрешении...

Ответы (3)

Вероятно, это не имеет ничего общего с CM; Маркет просто очень, очень плохо обновляется. Иногда помогает очистка данных для него, но иногда вам потребуется дополнительно установить более новую версию вручную, прежде чем она снова начнет обновляться.

Я несколько раз устанавливал 3.4.4 Market из Android Police , если вам нужен безопасный файл. Просто поместите его на SD-карту или во внутреннюю память (убедитесь, что он имеет расширение .apk) и установите его через файловый менеджер. Settings -> Applications -> Unknown sourcesдля этого нужно проверить.

Версия магазина, которую вы загрузили, требует SDK уровня 10 (Android 2.3.3). CMv5 — это уровень 7 (2.1).
@SevaAlekseyev Я совершенно пропустил, что это был CM5, мой плохой. Однако для него не может потребоваться 2.3.3, так как я использую его на 2.2 без проблем. CM6.1 — это версия 2.2, доступная для Magic, я бы порекомендовал обновиться. Однако проблема с разрешениями интригует.

Итак, проблема заключалась в следующем: Маркет и Маркет Апдейтер не были подписаны одним и тем же ключом, не знаю почему. В результате Market не смог отправить намерение получателю в Market Updater, который был защищен signatureразрешением -level. Вот что я сделал.

Взял MarketUpdater.apk с аппарата. Я разобрал его с помощью apktool:

apktool d -s MarketUpdater.apk mu

Затем я открыл AndroidManifest.xml. Я изменил packageатрибут <manifest>на

package="com.android.vending.updateralt"

Это было сделано для того, чтобы избежать конфликта имен с приложением vanilla Market Updater. Изменил <receiver>заголовок элемента на это:

<receiver android:name="com.android.vending.updater.UpdateMarketReceiver">

Видишь - нет permissionатрибута. Больше не требуется, чтобы отправитель намерения был подписан одним и тем же сертификатом. Указание имени пакета Java android:nameбыло необходимо, так как имя пакета APK больше не соответствовало имени пакета Java класса.

Затем я упаковал APK обратно:

apktool b mu MarketUpdaterAlt.apk

Я подписал APK с помощью jarsignerинструмента произвольным ключом, который у меня был из другого проекта:

"C:\Program Files\Java\jdk1.7.0_02\bin\jarsigner.exe" -verbose -digestalg SHA1 -sigalg MD5withRSA  -keystore c:\Path\MyKeys.ks MarketUpdaterAlt.apk MyKey

Загрузил APK в /system/app, зарегистрированный с помощью pm:

adb push MarketUpdaterAlt.apk /system/app
adb shell pm install -r /system/app/MarketUpdaterAlt.apk

И заставил Маркет самообновляться. Удален файл настроек:

adb shell rm /data/data/com.android.vending/shared_prefs/*

Затем перезапустил Маркет, подождал пять минут и закрыл Маркет. Обновление прошло как по маслу. Теперь у меня есть Маркет 2.3.6, биллинг в приложении и все такое.

Хорошо, что связь между Market и Market Updater на основе разрешений не была двусторонней...

РЕДАКТИРОВАТЬ: альтернативный APK-файл обновления доступен для всех по адресу http://www.jishop.com/temp/MarketUpdaterAlt.apk .

Решение по созданию нового MarketUpdater у меня не сработало. Я новичок в рутированных устройствах Android, поэтому, возможно, есть что-то, что будет очевидно для тех, у кого больше опыта с этим. Я столкнулся с проблемой разрешения INSTALL_PACKAGE, и да, я поместил MarketUpdaterAlt в /system/app/, и он был подписан моим ключом, но это не помогло. Вся эта штука с разрешениями кажется немного привередливой (см., например, это обсуждение ).

Во всяком случае, я нашел альтернативный способ получить обновление:

  1. Возьмите относительно новую версию приложения Market. (Я использовал apk под названием Market-3.4.4.apk. Он должен быть достаточно новым, но наличие самого последнего не имеет значения, так как он все равно обновится через некоторое время. Сейчас у меня работает 3.10.9.) Убедитесь, что пакет подписан Google.

  2. Очистить рыночные данные. (Это то, что я сделал тогда, но теперь я думаю, что pm uninstall без опции -k сделает то же самое.)

  3. adb shell mount -o remount,rw/system

  4. adb оболочка rm /system/app/Vending.apk

  5. adb shell pm удалить com.android.vending

  6. adb push [Путь к вашему новому apk] /system/app/Vending.apk

  7. adb shell pm install /system/app/Vending.apk

  8. adb shell mount -o remount,ro/system

Если вы получили более старую версию, чем последняя, ​​любое необходимое обновление произойдет через некоторое время. Может пройти некоторое время, прежде чем веб-интерфейс Google Play будет синхронизирован с тем, что говорит локальное приложение.

Вот как я установил и запустил последнюю версию Google Play на старом myTouch 3g с root-правами, работающем под управлением CM 6.1. Кто-то более дальновидный, чем я, мог бы, вероятно, интегрировать новую версию в Google Apps при первоначальной перепрошивке.