Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save eyecatchup/dab5cf7977008e504213 to your computer and use it in GitHub Desktop.
Save eyecatchup/dab5cf7977008e504213 to your computer and use it in GitHub Desktop.
A step-by-step guide how to manually flash the Android 5.1.1 (LMY48B) OTA-Update on a Nexus 5 with modified system (custom recovery/kernel, rooted, modified framework etc.)..
  UPDATE `NEXUS 5` 
     SET `VERSION`='5.1.1', `BUILD`='LMY48B', `RECOVERY`='CUSTOM', `ROOTED`=1 
   WHERE `VERSION`='5.1.0' && `BUILD` IN ('LMY47D', 'LMY47I') && `RECOVERY`='CUSTOM' && `ROOTED`=1 
         && `WANNA_KEEP_USERDATA`=1;

A manual OTA for rooted hammerheads, quasi.

When you tampered with the Android system, you can't install OTAs; installation fails. Sometimes it's enough to flash the stock recovery to use adb sideload update.zip, but often, especially when you tampered a lot, this also fails.

Even after unrooting and flashing stock boot, recovery and cache it can fail. So one might ask whether the only way is to do a clean install using the latest factory image instead. For those who ask themselves this question: Before you do so, take a minute and read on.


This document describes how I successfully updated my Nexus 5 from stock Android 5.1.0 (LMY47D/LMY47I) with TWRP and root with SuperSU to Android 5.1.1 (LMY48B) with TWRP 2.8.7.1 and root with SuperSU v2.6.4 - without loosing user data.

NOTE: The steps outlined in this document assume the Android SDK to be installed on your PC and the adb, fastboot and android.[bat|sh] to be in your PATH variable! Oh, and if it burns down your house, it's not my fault. Proceed at own risk.

Download & prepare files

  • Download the OTA zip, for your current build version(!), from Google's servers to your PC.

  • Rename the downloaded zip to 'update.zip' (without the quotes (and if you're on windows and known file extension are hidden, make sure you not end up with update.zip.zip)).

  • To the same folder, download the latest SuperSU flashable zip.
    https://goo.gl/MHfCPc - UPDATE-SuperSU-v2.46.zip

  • To the same folder, download the latest TWRP recovery image for hammerhead.
    https://goo.gl/WVYPH4 - twrp-2.8.7.1-hammerhead.img

  • To the same folder, download the 5.1.0 factory image tgz archive of your
    current version from Google's servers.

  • From the 5.1.0 tgz archive extract the recovery.img, boot.img and system.img files to the same directory where your downloads are located.
    (Tip: With 7zip, for example, you can 'internally' open the archives within the archive and extract just the files you need. The same is possible with command line tools, of course.)

The directory structure should look like this now:

..
boot.img
twrp-2.8.7.1-hammerhead.img
recovery.img
system.img
update.zip
UPDATE-SuperSU-v2.46.zip

Time for the command line..

Open a terminal on your PC and cd into the directory where your downloaded files are located. Now go on by running the commands in the terminal as follows (type only those lines prefixed with '> ', but without actually typing the '> '!).

Update platform tools
# On Windows:
> android.bat update sdk -u -t platform-tools,tools
# On Linux/Mac:
$ android.sh update sdk -u -t platform-tools,tools

You may need to accept a license agreement. Type 'y' and hit enter.

Do you accept the license 'android-sdk-license-5be876d5' [y/n]: y
Installing Archives:
  Preparing to install archives
  Downloading Android SDK Tools, revision 24.3.3
  Installing Android SDK Tools, revision 24.3.3
  Unzipping Android SDK Tools, revision 24.3.3 (99%)
    Installed Android SDK Tools, revision 24.3.3 99%)
  Downloading Android SDK Platform-tools, revision 22
  Installing Android SDK Platform-tools, revision 22
  Unzipping Android SDK Platform-tools, revision 22 (99%)
    Stopping ADB server succeeded.
    Installed Android SDK Platform-tools, revision 22 99%)
    Stopping ADB server succeeded.
    Starting ADB server succeeded.
  Done. 2 packages installed.</code>
Update adb
# On Windows:
> android.bat update adb
# On Linux/Mac:
$ android.sh update adb

If adb was updated, command line will ask you to restart it. Do so.

adb has been updated. You must restart adb with the following commands
      adb kill-server
      adb start-server

--

Now, we're finally ready to go..

Time for flashing..

Connect your device (USB debugging enabled, of course) to your PC.

Back at your terminal, go on by running the commands as follows (type only those lines prefixed with '> ', but without actually typing the '> '!).

# Make sure the device is recognized
> adb devices

# Boot into bootloader mode
> adb reboot bootloader

# In bootloader mode, make again sure the device is recognized
> fastboot devices

# Flash stock LMY47D/LMY47I recovery image
> fastboot flash recovery recovery.img

# Flash stock LMY47D/LMY47I system image
> fastboot flash -S 512M system system.img

# Flash stock LMY47D/LMY47I boot image
> fastboot flash boot boot.img

When the last flash is confirmed, use the volume rockers to choose 'Recovery mode' and confirm with the power button.

When you see the little Android lying with the red triangle warning sign on it, hold the power then press the volume up button to get to the recovery options.

When you got to the recovery options, select 'apply update from ADB' using the volume rockers again and press the power button to choose it. When the device says it's awaiting commands, type from the PC's command line:

adb sideload update.zip

When OTA update successfully installed, select 'reboot bootloader' from the recovery options again using the volume rockers and press the power button.

Back in bootloader mode, type from the PC's command line:

fastboot flash recovery twrp-2.8.7.1-hammerhead.img

When the flash is confirmed, use the volume rockers to choose 'Recovery mode' and confirm with the power button.

Now in the TWRP recovery menu, choose 'Advanced' > 'adb sideload'. Check both option, clear 'Dalvik-Cache' and 'Clear Cache' and swipe the bar to start sideload mode. When the device says it's awaiting commands, type from the PC's command line:

adb sideload UPDATE-SuperSU-v2.46.zip

When done, confirm to reboot system. Finished. Mission completed.

You're now on 5.1.1 with your custom recovery, rooted and can pick up from where you left.

PS: First boot, as always, will take some minutes.

@yuvilio
Copy link

yuvilio commented Aug 15, 2015

Like @icemanyu , I ran this to update to the LMY48I build of 5.1.1 (which has fixes for the Stagefright exploit) in my case on my Nexus 5. It worked great! Got the OTA zip file (the one you need to rename to update.zip) by just searching the build number and OTA and my phone (so ""LMY48I OTA Nexus" in my case which landed me this Droid Life link )
For the TWRP recovery menu the options were "Wipe cache" rather than clear cache.

@zluiten
Copy link

zluiten commented Sep 5, 2015

When in adb sideload mode, adb fails to see my devices....

adb sideload update.zip
loading: 'update.zip'
error: device '(null)' not found

Any idea?

@conrado
Copy link

conrado commented Sep 15, 2015

basic instructions still working great for LMY48I to LMY48M. Certainly the fastest way to update rooted Nexus 5.

@yuvilio
Copy link

yuvilio commented Sep 21, 2015

Same here. Just moved up to LMY48M on Nexus 5 using these steps (replacing googling for "LMY48M" and "Nexus 5" wherever appropriate). Even with the now "monthly" Android updates, the smooth upgrade train keeps moving.

@yuvilio
Copy link

yuvilio commented Oct 25, 2015

This still works great for going from LMY48M to MRA58K (6.0). Some tips are to make sure you have the latest SuperSu update (i used the beta 2.50 one). You might also need to download the modified boot image (I did for my Nexus 5). More details here

@deadlyvenom
Copy link

deadlyvenom commented Jan 14, 2021

Thanks for your guide which helped me updated from LMY48B to LMY48I.

@alanwats
Copy link

alanwats commented Aug 30, 2021

Thanks for your this guide which helped me updated.

@NALAFX
Copy link

NALAFX commented Oct 19, 2021

Thanks for your guide which helped me updated from LMY48B to LMY48I

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment