Я купил подержанный 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, гуляющих по сети.
Вероятно, это не имеет ничего общего с CM; Маркет просто очень, очень плохо обновляется. Иногда помогает очистка данных для него, но иногда вам потребуется дополнительно установить более новую версию вручную, прежде чем она снова начнет обновляться.
Я несколько раз устанавливал 3.4.4 Market из Android Police , если вам нужен безопасный файл. Просто поместите его на SD-карту или во внутреннюю память (убедитесь, что он имеет расширение .apk) и установите его через файловый менеджер. Settings -> Applications -> Unknown sources
для этого нужно проверить.
Итак, проблема заключалась в следующем: Маркет и Маркет Апдейтер не были подписаны одним и тем же ключом, не знаю почему. В результате 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/, и он был подписан моим ключом, но это не помогло. Вся эта штука с разрешениями кажется немного привередливой (см., например, это обсуждение ).
Во всяком случае, я нашел альтернативный способ получить обновление:
Возьмите относительно новую версию приложения Market. (Я использовал apk под названием Market-3.4.4.apk. Он должен быть достаточно новым, но наличие самого последнего не имеет значения, так как он все равно обновится через некоторое время. Сейчас у меня работает 3.10.9.) Убедитесь, что пакет подписан Google.
Очистить рыночные данные. (Это то, что я сделал тогда, но теперь я думаю, что pm uninstall без опции -k сделает то же самое.)
adb shell mount -o remount,rw/system
adb оболочка rm /system/app/Vending.apk
adb shell pm удалить com.android.vending
adb push [Путь к вашему новому apk] /system/app/Vending.apk
adb shell pm install /system/app/Vending.apk
adb shell mount -o remount,ro/system
Если вы получили более старую версию, чем последняя, любое необходимое обновление произойдет через некоторое время. Может пройти некоторое время, прежде чем веб-интерфейс Google Play будет синхронизирован с тем, что говорит локальное приложение.
Вот как я установил и запустил последнюю версию Google Play на старом myTouch 3g с root-правами, работающем под управлением CM 6.1. Кто-то более дальновидный, чем я, мог бы, вероятно, интегрировать новую версию в Google Apps при первоначальной перепрошивке.
эльдарератис
Сева Алексеев