CyanogenMod, ¿por qué Market no se autoactualiza?

Compré un HTC Magic usado con CyanogenMod 5. Cuenta con Google Market. La versión de mercado es 1.713, que no está ni cerca del último IIRC. La facturación en la aplicación, por un lado, no es compatible.

¿No se supone que Google Market debe actualizarse cuando sale una nueva versión? ¿Por qué el mío no lo hace? Probablemente algún tipo de interferencia de CyanogenMod. ¿Alguna buena manera de evitar eso, por favor?

EDITAR: depuró un poco la situación. Sé que la actualización del mercado se produce a partir del proceso principal del mercado: el mercado (com.android.vending) descarga la actualización y luego activa un intento de transmisió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 obtuve en el LogCat:

02-01 02:34:16.155: W/ActivityManager(121): Denegación de permiso: Intención de transmisión { 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

Por lo tanto, 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 un <uses-permission>, pero reciba 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 solo las aplicaciones firmadas con el mismo certificado que 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. El de Vending.apk parece coincidir con el de varias versiones de Vending.apk que flotan en la red.

CyanogenMod 5 también es muy antiguo. Es posible que la versión más reciente de Market ni siquiera funcione correctamente en él, por lo que no me sorprendería si no se actualiza solo porque su versión de Android no es compatible.
No estoy tan preocupado por obtener lo último; siempre que funcione la facturación en la aplicación. Oficialmente, la facturación en la aplicación es compatible con Android 2.1 (hasta 1.6), y espero que Google detecte la versión del sistema operativo en ejecución y ofrezca algo relevante. Ahora sobre eso del permiso...

Respuestas (3)

Probablemente no tenga nada que ver con CM; el mercado es muy, muy malo para actualizarse a sí mismo. A veces, borrar los datos ayudará, pero a veces también necesitará instalar una versión más nueva manualmente antes de que comience a actualizarse nuevamente.

He instalado Market 3.4.4 de Android Police varias veces, si buscas un archivo seguro. Simplemente colóquelo en su tarjeta SD o almacenamiento interno (asegúrese de que tenga la extensión .apk) e instálelo a través de un administrador de archivos. Settings -> Applications -> Unknown sourcesnecesita ser revisado para esto.

La versión del mercado que ha subido requiere SDK nivel 10 (Android 2.3.3). CMv5 es el nivel 7 (2.1).
@SevaAlekseyev Extrañé por completo que fuera CM5, mi error. Sin embargo, no puede requerir 2.3.3, ya que lo uso en 2.2 sin problemas. CM6.1 es 2.2 y está disponible para Magic, recomendaría actualizar. Sin embargo, el tema de los permisos es intrigante.

Entonces, el problema era: Market y Market Updater no estaban firmados con la misma clave, no tengo idea de por qué. Como resultado, Market no pudo enviar una intención a un receptor en Market Updater que estaba protegido por un signaturepermiso de nivel. Esto es lo que he hecho.

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

apktool d -s MarketUpdater.apk mu

Luego abrí el AndroidManifest.xml. Cambié el packageatributo debajo <manifest>de

package="com.android.vending.updateralt"

Eso fue para evitar un conflicto de nombres con la aplicación Vanilla Market Updater. Cambió el <receiver>encabezado del elemento a esto:

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

Ver - sin permissionatributo. Ya no es necesario que el remitente de la intención esté firmado por el mismo certificado. Era necesario deletrear el nombre del paquete Java android:name, ya que el nombre del paquete APK ya no coincidía con el nombre del paquete Java de la clase.

Luego volví a empaquetar el APK:

apktool b mu MarketUpdaterAlt.apk

Firmé el APK, usando la jarsignerherramienta, 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

Subido el APK a /system/app, registrado con pm:

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

Y forzó una actualización automática de Market. Eliminado el archivo de preferencias:

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

Luego reinició Market, esperó cinco minutos y cerró Market. La actualización pasó como un encanto. Ahora tengo Market 2.3.6, facturación en la aplicación y todo.

Menos mal que el acoplamiento basado en permisos entre Market y Market Updater no fue bidireccional...

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

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

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

  1. Obtenga una versión relativamente reciente de la aplicación Market. (Usé un apk titulado Market-3.4.4.apk. Debe ser razonablemente nuevo, pero tener el último no importa, ya que se actualizará solo después de un poco de todos modos. Ahora tengo 3.10.9 ejecutándose). Verifique que el el paquete está firmado por Google.

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

  3. montaje de shell adb -o volver a montar, rw / sistema

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

  5. adb shell pm desinstalar com.android.vending

  6. adb push [Ruta a su nuevo apk] /system/app/Vending.apk

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

  8. montaje de shell adb -o volver a montar, ro / sistema

Si tiene una versión anterior a la última, cualquier actualización necesaria se realizará después de un tiempo. Puede pasar un poco antes de que la interfaz web de Google Play se sincronice con lo que dice la aplicación local.

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