6 votes

CyanogenMod, pourquoi le Market ne se met-il pas à jour automatiquement?

J'ai acheté un HTC Magic d'occasion avec CyanogenMod 5 dessus. Il a Google Market. La version du market est 1.713 - ce qui est loin d'être la dernière si je me souviens bien. La facturation In-App, par exemple, n'est pas supportée.

Le Market de Google est censé se mettre à jour automatiquement lorsqu'une nouvelle version sort, non? Pourquoi le mien ne le fait-il pas? Probablement une sorte d'interférence de CyanogenMod. Y a-t-il un moyen de contourner cela, s'il vous plaît?

EDIT : j'ai débogué un peu la situation. Je sais que la mise à jour du market se fait en dehors du processus principal du Market - le Market (com.android.vending) télécharge la mise à jour, puis envoie une intention de broadcast UPDATE_MARKET à un récepteur dans une autre application (com.android.vending.updater), qui installe ensuite le package. Voici ce que j'ai dans le LogCat:

02-01 02:34:16.155: W/ActivityManager(121): Permission refusée: diffusion de l'intention { act=com.android.vending.UPDATE_MARKET dat=content://downloads/download/31 } depuis com.android.vending (pid=1762, uid=10006) nécessite com.android.vending.permission.UPDATE_MARKET en raison du récepteur com.android.vending.updater/com.android.vending.updater.UpdateMarketReceiver

Il semble donc que l'application Market n'a pas la permission d'invoquer le programme de mise à jour. Cependant, le fichier de manifeste de Vending.apk contient bien une ligne . Comment est-il possible qu'une application ait une balise , mais reçoive un message de refus de permission?

EDIT2 : la permission com.android.vending.permission.UPDATE_MARKET est marquée comme "signature" dans le manifeste de MarketUpdater. Cela signifie que seules les applications signées par le même certificat que MarketUpdater ont droit à cette permission. Cela pourrait être la raison pour laquelle Market n'a pas cette permission - il pourrait être signé par un certificat différent.

EDIT3 : c'est exactement le cas. La clé publique est différente. Celle sur Vending.apk semble correspondre à celle sur diverses versions de Vending.apk qui circulent sur Internet.

8voto

Matthew Read Points 50150

Il n'a probablement rien à voir avec CM; le Market est juste très, très mauvais pour se mettre à jour. Parfois, effacer les données peut aider, mais parfois vous devrez également installer manuellement une version plus récente avant qu'elle ne commence à se mettre à jour à nouveau.

J'ai installé le Market 3.4.4 d'Android Police quelques fois, si vous cherchez un fichier sûr. Mettez-le simplement sur votre carte SD ou sur votre stockage interne (assurez-vous qu'il a l'extension .apk) et installez-le via un gestionnaire de fichiers. Paramètres -> Applications -> Sources inconnues doit être coché pour cela.

4voto

Seva Alekseyev Points 231

Le problème était le suivant : Market et Market Updater n'étaient pas signés par la même clé, aucune idée pourquoi. En conséquence, le Market n'était pas en mesure d'envoyer un intent à un récepteur dans le Market Updater qui était protégé par une permission de niveausignature. Voici ce que j'ai fait.

J'ai pris MarketUpdater.apk du périphérique. Je l'ai décomposé avec apktool :

apktool d -s MarketUpdater.apk mu

J'ai ensuite ouvert le AndroidManifest.xml. J'ai changé l'attribut package sous à

package="com.android.vending.updateralt"

C'était pour éviter un conflit de noms avec l'application vanilla Market Updater. J'ai changé l'en-tête de l'élément pour cela :

Vous voyez - pas d'attribut permission. Plus besoin que l'expéditeur de l'intent soit signé par le même certificat. Il était nécessaire de spécifier explicitement le nom du package Java dans android:name, puisque le nom du package APK ne correspondait plus au nom du package Java de la classe.

J'ai ensuite reconditionné le APK :

apktool b mu MarketUpdaterAlt.apk

J'ai signé le APK, en utilisant l'outil jarsigner, avec une clé arbitraire que j'avais d'un autre projet :

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

J'ai téléchargé le APK dans /system/app, enregistré avec pm :

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

Et forcé une mise à jour automatique du Market. J'ai supprimé le fichier de préférences :

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

Ensuite, j'ai redémarré le Market, attendu cinq minutes, et fermé le Market. La mise à jour s'est bien passée. Maintenant j'ai Market 2.3.6, la facturation in-app et tout le reste.

Heureusement que le couplage basé sur les permissions entre le Market et le Market Updater n'était pas bidirectionnel...

EDIT : le APK de mise à jour alternative est disponible pour tous à http://www.jishop.com/temp/MarketUpdaterAlt.apk

3voto

DWalker Points 53

La solution consistant à créer un nouveau MarketUpdater n'a pas fonctionné pour moi. Je suis novice en matière de dispositifs Android rootés, donc il est possible qu'il y ait quelque chose d'évident pour quelqu'un ayant plus d'expérience avec cela. J'ai rencontré un problème de permission INSTALL_PACKAGE, et oui j'ai bien mis MarketUpdaterAlt dans /system/app/ et il était signé avec ma clé, mais cela n'a pas fonctionné. Tout ce qui concerne les permissions semble un peu capricieux (voir par exemple cette discussion).

Quoi qu'il en soit, j'ai trouvé un moyen alternatif pour faire la mise à jour:

  1. Téléchargez une version relativement récente de l'application Market. (J'ai utilisé un apk intitulé Market-3.4.4.apk. Il doit être assez récent, mais il n'est pas nécessaire d'avoir la toute dernière version car elle se mettra à jour d'elle-même après un certain temps. J'utilise maintenant la version 3.10.9.) Vérifiez que le package est signé par Google.

  2. Effacez les données du Market. (C'est ce que j'ai fait à l'époque, mais maintenant je pense que pm uninstall, sans l'option -k, accomplira la même chose.)

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

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

  5. adb shell pm uninstall com.android.vending

  6. adb push [Chemin vers votre nouvel apk] /system/app/Vending.apk

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

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

Si vous avez une version plus ancienne que la plus récente, une éventuelle mise à jour se fera après un certain temps. Il faudra peut-être un moment avant que l'interface web de Google Play se synchronise avec ce que dit l'application locale.

C'est ainsi que j'ai réussi à obtenir la dernière version de Google Play sur un vieux myTouch 3g rooté tournant sous CM 6.1. Une personne plus prévoyante que moi pourrait probablement intégrer une version récente parmi les applications Google lorsqu'elle effectue son flashage initial.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X