Sunday, May 24, 2015

Moto G OTA update error


If you get an OTA (over-the-air) update for your Moto G and it fails, here's what you can do. First, a few requirements:

  • A Moto G. This may work with the Moto E or X as well. YMMV.
  • Retail Android. This goes without saying, but you won't get an OTA update unless you're running one of the stock/retail ROMs.
  • Your phone has been rooted or otherwise customized (custom boot logo, custom recovery, etc). This isn't a strict requirement, but it's probably the reason the update is failing in the first place.
  • These instructions were written for Linux, but they should run with minor adjustments on Mac and a few not-so-minor adjustments on Windows.
There are two main ways to go about resolving this:

Method 1: recommended
This method is the easiest and probably the fastest:
  1. (Recommended) Back up your phone in case something goes wrong

  2. Get the model number for your phone
    Settings → About phone → Hardware SKU

    Or:

  3. Get the build number for your phone
    SettingsAbout phoneBuild number

  4. Download the retail firmware for your phone corresponding to the phone's model and build numbers. You can download them from here:
    http://www.filefactory.com/folder/c6cdedc45a775d27

    For me, I had the Moto G XT1034 with build number KXB21.14-L1.61, so I downloaded this file:
    AWSRETAIL_XT1034_4.4.4_KXB21.14-L1.61_cid9_CFC.xml.zip

  5. Once the retail firmware has finished downloading, extract it

  6. Install the Android SDK tools

  7. Put your phone into fastboot mode. To do so, power off the phone, press and hold the volume down button, press power button, hold both for about 3 seconds and then let go

  8. Go to the folder where you extracted the retail firmware. Now we're going to restore the stock firmware without erasing the data partition (where all of your apps, settings, etc are stored):

    sudo fastboot flash boot boot.img
    sudo fastboot flash recovery recovery.img
    for file in system.img_sparsechunk.*; do sudo fastboot flash system $file; done
    sudo fastboot reboot


    If you're using Windows, you'll have to flash the system.img_sparsechunk files on at a time, for example:

    fastboot flash system system.img_sparsechunk.0
    fastboot flash system system.img_sparsechunk.1


    ... and so on.

  9. Now try the update again
    SettingsAbout phone → System updates

  10. If the update fails again, you have one of two options. If you don't mind wiping your phone and starting from scratch (which will erase everything), the easiest thing to do is to do fully restore the stock firmware. You'll put your phone into fastboot mode as before, but this time you're going to overwrite everything:

    sudo fastboot flash partition gpt.bin
    sudo fastboot flash motoboot motoboot.img
    sudo fastboot flash logo logo.bin
    sudo fastboot flash boot boot.img
    sudo fastboot flash bootloader bootloader.img
    sudo fastboot flash recovery recovery.img
    for file in system.img_sparsechunk.*; do sudo fastboot flash system $file; done
    sudo fastboot flash modem NON-HLOS.bin
    sudo fastboot erase modemst1
    sudo fastboot erase modemst2
    sudo fastboot flash fsg fsg.mbn
    sudo fastboot erase cache
    sudo fastboot erase userdata
    sudo fastboot reboot


    If, however, you don't want to completely wipe your phone and you don't mind getting your hands dirty, read on.

Method 2: advanced
  1. At a minimum, you will need to make sure the stock recovery is flashed. Follow the instructions above, flashing only the recovery:

    sudo fastboot flash recovery recovery.img
    sudo fastboot reboot

  2. Now try to apply the OTA update. If it fails, now the fun begins! First of all, if your phone isn't rooted, you'll need to root it to get access to the update log files. If you flash a custom recovery to root, then flash the stock recovery back (the OTA will fail with a custom recovery).

  3. Once your phone is rooted, connect to it using adb and look at the update log, which will be located in /cache/recovery/last_log

    adb shell
    su
    more last_log

  4. Look particularly at the end of the log file to see what went wrong. This is what mine said:

    script aborted: "/system/etc/install-recovery.sh" has unexpected contents.
    "/system/etc/install-recovery.sh" has unexpected contents.
    E:Error in /cache/Blur_Version.210.12.61.falcon_umts.AWSRetail.en.US.zip
    (Status 7)
    Installation aborted.


    You can see that apparently the file /system/etc/install-recovery.sh had been modified, probably from when I rooted the phone.

  5. If the file causing errors is in this list:
    • /system/bin/app_process32
    • /system/bin/app_process64
    • /system/bin/install-recovery.sh
    • /system/etc/install-recovery.sh

    • Then the problem is SuperSU itself, which modifies a bunch of files when it's installed. You'll need to restore the files from backup:

      cp /system/bin/app_process32_original /system/bin/app_process32
      cp /system/bin/app_process64_original /system/bin/app_process64
      cp /system/bin/install-recovery_original.sh /system/bin/install-recovery.sh
      cp /system/etc/install-recovery_original.sh /system/etc/install-recovery.sh

  6. If another file has been modified, you need to replace the original file. This will take some work. First, you'll need a special utility called simg2img. You can probably find a pre-built binary for your system. I just compiled it myself:

    sudo apt-get -y install build-essential git zlib1g-dev
    git clone https://android.googlesource.com/platform/system/core
    cd core/libsparse
    gcc -o simg2img -Iinclude simg2img.c sparse_crc32.c backed_block.c output_file.c sparse.c sparse_err.c sparse_read.c -lz
    sudo cp simg2img /usr/local/bin

  7. Go to the folder where you extracted the retail firmware, and you should have one or more files starting with system.img_sparsechunk. The next step is to combine them using simg2img:

    simg2img system.img_sparsechunk* system.raw.img.tmp

  8. Now we're going to extract the ext4 partition from the image file we made:

    offset=`LANG=C grep -aobP -m1 '\x53\xEF' system.raw.img.tmp | head -1 | awk '{print $1 - 1080}'`
    dd if=system.raw.img.tmp of=system.raw.img ibs=$offset skip=1

  9. Getting close! Now, we'll mount the image we just created:

    sudo mkdir /mnt/system
    sudo mount system.raw.img /mnt/system

  10. Now we should have access to all of the original files from the retail firmware. The next step is to copy them to the device. Here's what I did to copy /system/etc/install-recovery.sh:

    adb push /mnt/system/etc/install-recovery.sh /sdcard/

  11. Now connect to the device and get the mount point for the /system partition:

    adb shell
    mount | grep system

  12. Finally, remount /system as read-write, copy the file, and then remount /system as read-only. Don't forget to replace the mountpoints in my example (/dev/block/platform/msm_sdcc.1/by-name/system) with the mountpoint you got from the previous step:

    mount -o rw,remount /dev/block/platform/msm_sdcc.1/by-name/system /system
    cp /sdcard/install-recovery.sh /system/etc/install-recovery.sh
    mount -o ro,remount /dev/block/platform/msm_sdcc.1/by-name/system /system

  13. If you've made it this far, congratulations! Try the update again. Hopefully, as in my case, it will now work. If not, you'll have to look at the update log file again and see if there's anything else you missed. Thankfully it'll go much quicker now that you've already done all the prep work.

Moto G erreur de mise à jour OTA


Si vous recevez une mise à jour OTA (over-the-air) pour votre Moto G et il échoue, voici ce que vous pouvez faire. Tout d'abord, quelques exigences :

  • Un Moto G. Cela peut marcher avec le Moto E ou X ainsi.
  • Logiciel Android officiel. Vous ne recevez pas une mise à jour OTA sauf si vous avez Android officiel / stock.
  • Votre téléphone a été rooté ou autrement modifié (logo de démarrage modifié, recovery modifié, etc). Ce n'est pas une exigence stricte, mais c'est probablement la raison pour l'échec de la mise à jour en premier lieu.
  • Ces instructions ont été écrites pour Linux, mais ils doivent fonctionner avec des ajustements mineurs sur Mac et quelques ajustements pas si mineures sur Windows.
Maintenant les étapes :
  1. (Recommandé) Sauvegardez les données de votre téléphone au cas où quelque chose va mal

  2. Obtenez le numéro de modèle de votre téléphone
    1. Moto G 1st generation models
    2. Moto G 2nd generation models

  3. Obtenez le numéro de build pour votre téléphone
    ParamètresÀ propos du téléphoneNuméro de build

  4. Télécharger le firmware officiel pour votre téléphone correspondant au modèle du téléphone et le numéro de build. Vous pouvez le télécharger ici :
    http://www.filefactory.com/folder/c6cdedc45a775d27

    Pour moi, j'ai le Moto G XT1034 avec le numéro de build KXB21.14-L1.61, donc je l'ai téléchargé ce fichier :
    AWSRETAIL_XT1034_4.4.4_KXB21.14-L1.61_cid9_CFC.xml.zip

  5. Une fois le téléchargement du firmware officiel a fini, l'extrayez

  6. Télécharger Motorola fastboot (mfastboot), et l'extraire dans le même dossier que le firmware officiel
    https://www.androidfilehost.com/?fid=95916177934532795

  7. Mettez votre téléphone en mode fastboot. Pour ce faire, éteignez le téléphone, appuyez et maintenez le bouton d'alimentation, appuyez le bouton volume bas, tenir les deux à la fois pendant environ 3 secondes, puis lâcher

  8. Allez dans le dossier où vous avez extrait le firmware officiel. Maintenant, vous devez flasher ce que vous avez modifié. Dans mon cas, j'avais flashé un logo personnalisé et une recovery personnalisée, donc c'est ce que je faisais :

    chmod +x linux-fastboot
    sudo ./linux-fastboot flash logo logo.bin
    sudo ./linux-fastboot flash recovery recovery.img

  9. Si vous utilisez OS X, vous utiliserez osx-fastboot au lieu de linux-fastboot, et pour Windows, c'est mfastboot.

  10. Maintenant, essayez à nouveau la mise à jour
    Paramètres → À propos du téléphone → Mise à jour logicielles système

  11. Si la mise à jour échoue à nouveau, vous avez l'une des deux options. Si ça ne vous dérange pas d'effacer tous les données de votre téléphone et de partir de zéro, la meilleure chose à faire est de restaurer entièrement le firmware stock. Vous mettez votre téléphone en mode fastboot comme avant, mais cette fois vous allez écraser tout :

    sudo ./linux-fastboot flash partition gpt.bin
    sudo ./linux-fastboot flash motoboot motoboot.img
    sudo ./linux-fastboot flash logo logo.bin
    sudo ./linux-fastboot flash boot boot.img
    sudo ./linux-fastboot flash recovery recovery.img
    sudo ./linux-fastboot flash system system.img_sparsechunk.0
    sudo ./linux-fastboot flash system system.img_sparsechunk.1
    sudo ./linux-fastboot flash system system.img_sparsechunk.2
    sudo ./linux-fastboot flash modem NON-HLOS.bin
    sudo ./linux-fastboot erase modemst1
    sudo ./linux-fastboot erase modemst2
    sudo ./linux-fastboot flash fsg fsg.mbn
    sudo ./linux-fastboot erase cache
    sudo ./linux-fastboot erase userdata
    sudo ./linux-fastboot reboot


    Si vous avez des fichiers system.img_sparsechunk supplémentaires, assurez-vous de les tous flasher, par exemple :

    sudo ./linux-fastboot flash system system.img_sparsechunk.3
    sudo ./linux-fastboot flash system system.img_sparsechunk.4


    ... etc.

    Si, toutefois, vous ne voulez pas complètement effacer votre téléphone et ça ne vous dérange pas se salir les mains, lisez la suite.

  12. Maintenant, ça devient amusant ! Tout d'abord, si votre téléphone n'est pas rooté, vous aurez besoin de le rooter pour obtenir l'accès aux fichiers journals de la mise à jour.

  13. Une fois que votre téléphone est rooté, le connecter avec adb et regarder le journal de la mise à jour, qui sera situé dans /cache/recovery. Il y aura plusieurs fichiers journaux dans ce dossier, donc commencer avec le fichier le plus récent jusqu'à ce que vous trouviez celui que vous cherchez :

    adb shell
    su
    cd /cache/recovery
    ls -l
    more last_log.1

  14. Regardez en particulier la fin du fichier journal pour voir ce qui a mal tourné. Voici ce que le mien a dit :

    script aborted: "/system/etc/install-recovery.sh" has unexpected contents.
    "/system/etc/install-recovery.sh" has unexpected contents.
    E:Error in /cache/Blur_Version.210.12.61.falcon_umts.AWSRetail.en.US.zip
    (Status 7)
    Installation aborted.


    Vous pouvez voir que, apparemment, le fichier /system/etc/install-recovery.sh avait été modifié, probablement quand j'ai rooté le téléphone.

  15. Si comme moi votre journal d'erreur mentionne un fichier qui a été modifié, vous devez remplacer le fichier d'origine. Cela va prendre un certain travail. D'abord, vous aurez besoin d'un outil spécial appelé simg2img. Vous pouvez probablement trouver un binaire pré-construit pour votre système. Je l'ai simplement compilé moi-même :

    sudo apt-get -y install build-essential git zlib1g-dev
    git clone https://android.googlesource.com/platform/system/core
    cd core/libsparse
    gcc -o simg2img -Iinclude simg2img.c sparse_crc32.c backed_block.c output_file.c sparse.c sparse_err.c sparse_read.c -lz
    sudo cp simg2img /usr/local/bin

  16. Allez dans le dossier où vous avez extrait le firmware officiel, et vous devriez avoir un ou plusieurs fichiers commençant par system.img_sparsechunk. La prochaine étape est de les combiner à l'aide de simg2img :

    simg2img system.img_sparsechunk.* system.raw.img.tmp

  17. Maintenant, nous allons extraire la partition ext4 du fichier d'image que nous avons fait :

    offset=`LANG=C grep -aobP -m1 '\x53\xEF' system.raw.img.tmp | head -1 | awk '{print $1 - 1080}'`
    dd if=system.raw.img.tmp of=system.raw.img ibs=$offset skip=1

  18. Nous y sommes presque ! Maintenant, nous allons monter l'image que nous venons de créer :

    sudo mkdir /mnt/system
    sudo mount system.raw.img /mnt/system

  19. Maintenant, nous devrions avoir accès à tous les fichiers originaux du firmware officiel. La prochaine étape est de les copier sur le périphérique. Voici ce que j'ai fait pour copier /system/etc/install-recovery.sh :

    adb push /mnt/system/etc/install-recovery.sh /sdcard/

  20. Maintenant connecter à l'appareil et obtenir le point de montage pour la partition /system :

    adb shell
    mount | grep system

  21. Enfin, remonter /system en lecture-écriture, copier le fichier, puis remontez /system en lecture seule. Ne pas oublier de remplacer les points de montage dans mon exemple (/dev/block/platform/msm_sdcc.1/by-name/system) avec le point de montage que vous avez obtenu à l'étape précédente :

    mount -o rw,remount /dev/block/platform/msm_sdcc.1/by-name/system /system
    cp /sdcard/install-recovery.sh /system/etc/install-recovery.sh
    mount -o ro,remount /dev/block/platform/msm_sdcc.1/by-name/system /system

  22. Si vous avez rendu à ce point, félicitations! Essayez à nouveau la mise à jour. Espérons que, comme dans mon cas, il va maintenant travailler. Si non, vous devez regarder à nouveau le fichier journal de la mise à jour et voir si il y a autre chose que vous avez manqué. Heureusement ça va aller beaucoup plus vite maintenant que vous avez déjà fait tout le travail de préparation.