How to apply OTA update or UNROOT rooted nexus 5 without loosing user data.

These days I got notification from my phone (Nexus5 with android 5.0) that I have update to android 5.0.1.

The phone is rooted without modification of the boot partition. 

I tried to update, the phone rebooted and started the update process and after a few seconds it say ERROR, and stops.

It appears that the updater checks for modifications on  system partition and if some are found, the update is stopped.

Here is how I managed to update, without flashing all back to stock and suffering the pain of reinstalling all my apps, loosing user data (if not backed up), loosing app states and so on, basically a lot of time can be lost.

The below instructions will probably work on all nexus devices with slight modifications.

All the commands which I am going to present you are tested on linux, but they should work on windows and mac too, as long as you have downloaded android SDK.
 
I assume that your bootloader is unlocked. If not, you can not do anything without wiping out the phone.

How to check if bootloader is locked, two ways:

1. When you power on the phone you see the GOOGLE logo. If the bootloader is unlocked you will see unlocked padlock below the google logo.
2. Switch OFF the phone, then hold for 5-6 seconds Volume Down + Power.

This will start the bootloader for you (one lying down android with open stomach :))
Below the android you will see some info, about your phone, bootloader version etc.
On the last line it says: "LOCK STATE - unlocked"  if bootloader is unlocked


1. Download android sdk. http://developer.android.com/sdk/index.html#Other

If you do not intend to develop, you DO NOT need the "android studio", just download 'SDK tool only"

2. If undr Linus/Mac, extract the contents of the package

3. Run android-sdk-linux/tools/android. This will start GUI which will let you choose which components to install

4. Choose "Android Platform SDK tools" and hit install

5. If all went fine, you will have folder android-sdk-linux/platform-tools/ which contains the tools you need.

6. Switch On "usb debugging" on your device.

7. When you connect the phone, try this simple command:

sudo  android-sdk-linux/platform-tools/adb shell

The phone will probably pop up a dialog, asking for confirmation to allow the connection from the computer.
Hit YES and the command you executed will be drop you in a shell on the phone.
If this happens then all is good, you can continue

8. Download the stock images for your current version of android:
https://developers.google.com/android/nexus/images

9. Extract the file, in my case (hammerhead-lrx21o-factory-01315e08.tgz). You will get ZIP file called hammerhead-lrx21o/image-hammerhead-lrx21o.zip

10. Extract it too and you will get the image files

cache.img              
boot.img               
recovery.img           
userdata.img           
system.img             

11. If you want to root your phone after the update, download also:
Chanfire installable ZIP: As of time of this writing, version 2.40 (http://download.chainfire.eu/641/SuperSU/UPDATE-SuperSU-v2.40.zip)

You can see which is the latest version here: http://forum.xda-developers.com/apps/supersu

12. Upload the file to your device, you can do this with the following command:

android-sdk-linux/platform-tools/adb push  UPDATE-SuperSU-v2.40.zip /sdcard/Downloads

This will place the file in your Download folder on the phone.

13. Download TWRP rescue image:
http://techerrata.com/browse/twrp2/hammerhead

14. Be very careful from now on :)

15. Go in to fastboot mode by doing either power off the phone, then hit volumedown + power for a few seconds, or if the phone is on, with the following command:

sudo android-sdk-linux/platform-tools/adb reboot bootloader

This is supposed to send you in bootloader.

15. Flash stock recovery image: (you should be in the dir where the extracted images are )

sudo android-sdk-linux/platform-tools/fastboot flash boot boot.img 

reboot bootloader again
sudo android-sdk-linux/platform-tools/fastboot reboot-bootloader

16. Flash recovery image to stock

sudo android-sdk-linux/platform-tools/fastboot flash recovery recovery.img

reboot bootloader again
sudo android-sdk-linux/platform-tools/fastboot reboot-bootloader

17.  Flash the system img

sudo android-sdk-linux/platform-tools/fastboot flash system system.img





18. Reboot the device.
In the bootloader, navigate with (volume +/-) and when it shows "REBOOT", hit power to confirm, this will reboot the phone and boot android. And you now have unrooted device.

19. Apply the update, either go to settings-> about -> check for updates.
If nothing is shown there you can wait for some time and the notification will pop up again. (there is a faster method for update, but I intentionally do not show it here)

20. When the update is applied, if you want to root again the device, do the following:

sudo  android-sdk-linux/platform-tools/adb reboot bootloader

21. Flash the recovery image with the twrp image which you downloaded earlier:

sudo android-sdk-linux/platform-tools/fastboot flash recovery openrecovery-twrp-2.8.2.0-hammerhead.img

22. Reboot bootloader

sudo android-sdk-linux/platform-tools/fastboot reboot-bootloader

23. With volume +/- navigate to menu "Recovery Mode"
24. You will see a interface with buttons.
25. Go to Install
26. Navigate to your download folder and select the file you uploaded there earlier. In current case this is UPDATE-SuperSU-v2.40.zip
27. At the bottom "Swipe to Confirm Flash"
28. If all went fine, your device is rooted at this step
29. Reboot the phone and enjoy your root.

How to concatenate files containing columns of data in Linux

Ever wondered how to concatenate text files containing columns next to each other ?

One little bash trick which can help you do this the easy way:

Assume you have for example three files containing something like this:

file1.txt

a    b    c

a    b    c

a    b    c

a    b    c

 

file2.txt

1    2    3

1    2    3

1    2    3

1    2    3

file3.txt

m    n    p

m    n    p

m    n    p

m    n    p

What we want to achieve is the following result:

a    b    c    1    2    3    m    n    p

a    b    c    1    2    3    m    n    p

a    b    c    1    2    3    m    n    p

a    b    c    1    2    3    m    n    p

You have two options

Option 1: Try to do it in bash and die in pain. This is usually not funny.

Option 2: The easy way, use the command "paste":

[user@host ~]$ paste file1.txt file2.txt file3.txt
a    b    c     1    2    3     m    n    p

a    b    c     1    2    3     m    n    p

a    b    c     1    2    3     m    n    p

a    b    c     1    2    3     m    n    p

 

The command paste will concatenate the files for you

The program have some cool options, like you can set separator, or use the -s option which will cause the following behavior "paste one file at a time instead of in parallel"

Here is an example with the same files:


[user@host ~]$ paste -s file1.txt file2.txt file3.txt

a    b    c             a    b    c             a    b    c             a    b    c

1    2    3            1    2    3             1    2    3             1    2    3

m    n    p          m    n    p            m    n    p            m    n    p

Each row, becomes a new column.

Have fun :)

Broadcom BCM 802.11 linux-sta driver compilation issues

I am using one lenovo netbook, which is coming with Broadcom wireless adapter.
Since I was having performance issues with the open source driver I started using the driver provided by Broadcom:

http://www.broadcom.com/support/802.11/linux_sta.php

On the newer kernel there are two compilation issues which need patching.

The patches provided below are for version 5.100.82.112 of the driver.

The first issue which I hit was the following error during compilation
/usr/src/linux-sta/src/wl/sys/wl_linux.c:396:2: error: unknown field ‘ndo_set_multicast_list’ specified in initializer
/usr/src/linux-sta/src/wl/sys/wl_linux.c:396:2: warning: initialization from incompatible pointer type [enabled by default]
/usr/src/linux-sta/src/wl/sys/wl_linux.c:396:2: warning: (near initialization for ‘wl_netdev_ops.ndo_validate_addr’) [enabled by default]
make[2]: *** [/usr/src/linux-sta/src/wl/sys/wl_linux.o] Error 1
make[1]: *** [_module_/usr/src/linux-sta] Error 2
make[1]: Leaving directory `/usr/src/kernels/3.4.0-1.fc17.i686'

The secon issue is the following error

/usr/src/linux-sta/src/wl/sys/wl_linux.c:43:24: fatal error: asm/system.h: No such file or directory

which is caused by dropping the header asm/system.h in kernel 3.4 in favor of 5 new headers.

More about this can be read here:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=0195c002



Here is a patch witch fixes both of the issues.


You can download the patch from pastebin:

http://pastebin.com/C8TZ8q88

I am pasting the code in pastebin, because blogger.com has an "incredibly good" editor and I am fighting for half an hour to make it not hiding most of the source code and as you can see he wins :).

place this text in a file and save it

then go in the dirver directory in my case:

cd /usr/src/linux-sta/src/wl/sys/

and run the patch

patch -p0 < /path/where/the/you/saved/the/patchfile.patch

then try to compile as usual

cd /usr/src/linux-sta/
make clean
make install
depmod -a
modprobe wl