6 votos

CyanogenMod, ¿por qué no se auto-actualiza el mercado?

He comprado un HTC Magic usado con CyanogenMod 5 en él. Tiene Google Market. La versión de mercado es la 1.713, que no está ni cerca de la última IIRC. La facturación en la aplicación, por una parte, no está soportada.

¿No se supone que Google Market se actualizará a sí mismo cuando salga una nueva versión? ¿Por qué no lo hace el mío? Probablemente algún tipo de interferencia de CyanogenMod. ¿Alguna forma de evitarlo, por favor?

EDITORIAL: depuró un poco la situación. Resulta que sé que la actualización del mercado se produce fuera del proceso principal del mercado - el mercado (com.Android.vending) descarga la actualización, y luego dispara un intento de emisión UPDATE_MARKET a un receptor en otra aplicación (com.Android.vending.updater), que a su vez instala el paquete. Esto es lo que tengo en el LogCat:

02-01 02:34:16.155: W/ActivityManager(121): Permiso denegado: broadcasting Intent { act=com.Android.vending.UPDATE_MARKET dat=content://downloads/download/31 } de com.Android.vending (pid=1762, uid=10006) requiere com.Android.vending.permission.UPDATE_MARKET debido al receptor com.Android.vending.updater/com.Android.vending.updater.UpdateMarketReceiver

Así que parece que la aplicación Market carece de permiso para invocar el actualizador. El archivo de manifiesto de Vending.apk, sin embargo, tiene un

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

línea. ¿Cómo es posible que una aplicación tenga una <uses-permission> pero recibir un mensaje de denegación de permiso?

EDIT2: el permiso com.Android.vending.permission.UPDATE_MARKET está marcado como "firma" en el manifiesto de MarketUpdater. Lo que significa que sólo las aplicaciones firmadas por el mismo certificado de MarketUpdater tienen ese permiso. Esa podría ser la razón por la que Market no recibe el permiso - podría estar firmado por un certificado diferente.

EDIT3: ese es exactamente el caso. La clave pública es diferente. La de Vending.apk parece coincidir con la de varias versiones de Vending.apk que están flotando en la red.

8voto

Matthew Read Puntos 35808

Probablemente no tiene nada que ver con CM; el mercado es muy, muy malo para actualizarse. A veces, limpiar los datos para él ayudará, pero a veces tendrás que instalar una nueva versión manualmente antes de que empiece a actualizarse de nuevo.

He instalado el 3.4.4 Mercado de la Policía de Android un par de veces, si buscas un archivo seguro. Sólo tienes que ponerlo en tu tarjeta SD o en el almacenamiento interno (asegúrate de que tiene la extensión .apk) e instalarlo a través de un administrador de archivos. Settings -> Applications -> Unknown sources necesita ser revisada por esto.

4voto

Seva Alekseyev Puntos 171

Así que el problema era: Market y Market Updater no estaban firmados por la misma clave, ni idea de por qué. Como resultado, el Mercado no podía enviar una intención a un receptor en el Market Updater que estaba protegido por un signature - permiso de nivelación. Esto es lo que he hecho.

Tomé MarketUpdater.apk del dispositivo. Lo desmonté con apktool :

apktool d -s MarketUpdater.apk mu

Luego abrí el AndroidManifest.xml. Cambié el package atributo bajo <manifest> a

package="com.android.vending.updateralt"

Eso fue para evitar un choque de nombres con la aplicación de actualización del mercado de la vainilla. Cambió la <receiver> elemento de la cabeza a esto:

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

Ver - no permission atributo. Ya no se requiere que el remitente intencional esté firmado por el mismo certificado. Deletrear el nombre del paquete Java en android:name era necesario, ya que el nombre del paquete APK ya no coincidía con el nombre del paquete Java de la clase.

Luego empaqué el APK de vuelta:

apktool b mu MarketUpdaterAlt.apk

Firmé el APK, usando el jarsigner con una clave arbitraria que tenía de otro proyecto:

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

Subió el APK a /sistema/app, registrado en pm :

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

Y forzó una auto-actualización del mercado. Eliminó el archivo de preferencias:

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

Luego reinició el Mercado, esperó cinco minutos y cerró el Mercado. La actualización se llevó a cabo como un encanto. Ahora tengo el Mercado 2.3.6, facturación in-app y todo.

Menos mal que el acoplamiento basado en permisos entre el Mercado y el Actualizador del Mercado no era bidireccional...

EDITAR: el actualizador alternativo APK está disponible para todos en http://www.jishop.com/temp/MarketUpdaterAlt.apk

3voto

Louis Puntos 121

La solución de crear un nuevo MarketUpdater no funcionó para mí. Soy un novato en dispositivos Android rooteados, así que tal vez haya algo que sea evidente para alguien que tenga más experiencia en ello. Me encontré con un problema de permiso de INSTALACIÓN_PAQUETE, y sí puse MarketUpdaterAlt en /sistema/app/ y estaba firmado con mi llave, pero eso no funcionó. Todo el asunto del permiso parece un poco delicado (ver por ejemplo esta discusión ).

En cualquier caso, he encontrado una forma alternativa de conseguir la actualización:

  1. Coge una versión relativamente reciente de la aplicación Market. (Utilicé un apk titulado Market-3.4.4.apk. Necesita ser razonablemente nuevo pero tener lo último no importa ya que se actualizará por sí mismo después de un rato de todos modos. Ahora tengo la 3.10.9 funcionando). Verifica que el paquete esté firmado por Google.

  2. Datos claros del mercado. (Eso es lo que hice en ese entonces pero ahora creo que la desinstalación de pm, sin la opción -k, logrará lo mismo.)

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

  4. adb shell rm /sistema/app/Vending.apk

  5. adb shell pm desinstalar com.Android.vending

  6. adb push [Camino a tu nuevo apk] /sistema/app/Vending.apk

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

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

Si tienes una versión más antigua que la última, cualquier actualización necesaria se producirá después de un tiempo. Puede que pase un tiempo antes de que la interfaz web de Google Play se vea sincronizada con lo que dice la aplicación local.

Así es como conseguí la última versión de Google Play en un viejo myTouch 3g con CM 6.1. Alguien con más visión de futuro que yo podría integrar una nueva versión entre las aplicaciones de Google cuando hagan su flasheo inicial.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X