Upgrading My Nexus 5 to Lollipop

I love a clean start. There’s nothing like the feel of a smartphone (or PC) after a factory reset.

I’m using my Nexus 5 for almost a year now. For a while, I’ve been wanting to do a factory reset and start clean. The upcoming Lollipop upgrade is exactly the push I needed to do it.

My game plan:

  1. Before upgrading:
    1. Perform general app cleanup, so I upgrade only with the apps I want.
    2. Document my settings and configuration (system and apps), so I can re-apply it if needed.
    3. Backup data.
  2. Upgrade.
  3. After upgrading:
    1. Restore apps, data, settings and configuration, as needed.
    2. Explore what new built-in features can replace 3rd party apps I’m using. I always prefer built-in over 3rd party.

Initially, I planned to wait for the OTA update. I figured it would simplify the process, and should reach my device soon enough. Google started rolling out the OTA on November 12th 2014. Like most Android updates, this rollout was in “waves”. 3 days later, the waves still didn’t reach my Nexus 5.

With the factory images already available, I started wondering why I’m waiting for the OTA over going manual. I figured that the only downside of going manual with the factory image is having to perform full wipe to unlock the bootloader. That doesn’t bother me, since I want to factory reset any way!

I decided to pursue the manual upgrade route, which I describe in this post.

Warning: This process requires using the fastboot tool over USB from a terminal. While not too complicated, it does require being comfortable with doing such things. Also, enabling USB debugging and unlocking the bootloader exposes your device to extra security risks (even if for a short time). Proceed with caution, or prefer going the OTA route.

The upgrade process

First thing, make sure you’re completely done with backing up everything you need! This should include the list of installed apps, system and apps settings and configuration, and relevant data.

The tools

You will need the fastboot tool. I have it in the platform-tools/ directory of the Android SDK. It’s also available from the Android Open Source Project.

It’s also useful to have the adb tool, but not mandatory. If you have the Android SDK, you have adb.

Next, download the Lollipop factory image for your Nexus. You can find it in this list for the Nexus 5. The list includes MD5 and SHA-1 checksums. I strongly advise that you verify the downloaded image using these checksums! (in OS X: run md5 filename or shasum -a1 filename; in Linux: run md5sum filename or sha1sum filename; in Windows: see HashTab). You don’t want to find out your download was corrupt only after bricking the device… Unzip the image somewhere.

Flashing the image

  1. First, you need to go into fastboot mode.
    • If you have adb, run adb reboot bootloader with the device connected via USB.
    • An alternative method is using a key combo. For Nexus 5, turn the device off, turn it on, and immediately hold the Volume Up + Volume Down + Power buttons.
  2. Unlock the bootloader (if it’s locked, which is likely) by running fastboot oem unlock. This step wipes all data on the device!
  3. In terminal, cd to the unzipped image directory. It contains the flash-all script, that performs the installation steps. You can run it, but I preferred looking into what it does, and chose to perform the individual commands on my own:
~ $ fastboot oem unlock
...
OKAY [ 99.477s]
finished. total time: 99.477s
~ $
~ $ cd ~/aux/Downloads/hammerhead-lrx21o/
~ hammerhead-lrx21o $ cat flash-all.sh

#!/bin/sh

# Copyright 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

fastboot flash bootloader bootloader-hammerhead-hhz12d.img
fastboot reboot-bootloader
sleep 5
fastboot flash radio radio-hammerhead-m8974a-2.0.50.2.21.img
fastboot reboot-bootloader
sleep 5
fastboot -w update image-hammerhead-lrx21o.zip

hammerhead-lrx21o $ fastboot flash bootloader bootloader-hammerhead-hhz12d.img
sending 'bootloader' (2579 KB)...
OKAY [ 0.241s]
writing 'bootloader'...
OKAY [ 0.491s]
finished. total time: 0.732s

hammerhead-lrx21o $ fastboot reboot-bootloader
rebooting into bootloader...
OKAY [ 0.001s]
finished. total time: 0.001s

hammerhead-lrx21o $ fastboot flash radio radio-hammerhead-m8974a-2.0.50.2.21.img
target reported max download size of 1073741824 bytes
sending 'radio' (45521 KB)...
OKAY [ 1.776s]
writing 'radio'...
OKAY [ 3.128s]
finished. total time: 4.904s

hammerhead-lrx21o $ fastboot reboot-bootloader
rebooting into bootloader...
OKAY [ 0.001s]
finished. total time: 0.001s

hammerhead-lrx21o $ fastboot -w update image-hammerhead-lrx21o.zip
target reported max download size of 1073741824 bytes
archive does not contain 'boot.sig'
archive does not contain 'recovery.sig'
archive does not contain 'system.sig'
archive does not contain 'tos.img'
Creating filesystem with parameters:
Size: 29236371456
Block size: 4096
Blocks per group: 32768
Inodes per group: 8192
Inode size: 256
Journal blocks: 32768
Label:
Blocks: 7137786
Block groups: 218
Reserved block group size: 1024
Created filesystem with 11/1785856 inodes and 156120/7137786 blocks
Creating filesystem with parameters:
Size: 734003200
Block size: 4096
Blocks per group: 32768
Inodes per group: 7472
Inode size: 256
Journal blocks: 2800
Label:
Blocks: 179200
Block groups: 6
Reserved block group size: 47
Created filesystem with 11/44832 inodes and 5813/179200 blocks
--------------------------------------------
Bootloader Version...: HHZ12d
Baseband Version.....: M8974A-2.0.50.2.21
Serial Number........: ********************
--------------------------------------------
checking product...
OKAY [ 0.101s]
checking version-bootloader...
OKAY [ 0.096s]
checking version-baseband...
OKAY [ 0.100s]
sending 'boot' (8852 KB)...
OKAY [ 0.580s]
writing 'boot'...
OKAY [ 0.762s]
sending 'recovery' (9552 KB)...
OKAY [ 0.648s]
writing 'recovery'...
OKAY [ 0.803s]
erasing 'system'...
OKAY [ 1.287s]
sending 'system' (981596 KB)...
OKAY [ 35.925s]
writing 'system'...
OKAY [ 66.657s]
erasing 'userdata'...
OKAY [ 15.627s]
sending 'userdata' (139109 KB)...
OKAY [ 5.241s]
writing 'userdata'...
OKAY [ 9.402s]
erasing 'cache'...
OKAY [ 0.631s]
sending 'cache' (13348 KB)...
OKAY [ 0.700s]
writing 'cache'...
OKAY [ 1.080s]
rebooting...

finished. total time: 140.068s

After this, the device is flashed, and the upgrade is complete. The device now boots into Lollipop! Hurray!

Relocating the bootloader

After flashing the image, it is recommended to lock the bootloader again.

To do this, start the device in fastboot mode again, and run fastboot oem lock.

Unlike the unlock command, this does not wipe any data.

Summary

This is how I upgraded my Nexus 5 to Lollipop, using the factory image from Google.

Manual image flashing isn’t too hard, but probably also not for everyone. If you choose to go through with it, do it at your own risk! 🙂

Now that I finally have Lollipop installed, I can continue with this upgrade project and restore all my apps and settings.

No Comments Yet.

Leave a Reply