iBeacon on Nexus 10 with Android 4.4

Android has added support for Bluetooth Low Energy (aka Bluetooth Smart) and thus iBeacon (a profile of BLE) in version 4.3. However, on my Google Nexus 10 (2012 edition, now running Android 4.4 aka KitKat), support is disabled in the official version provided by Google, even though the hardware supports it. Since I want to try out (and maybe develop) apps that use iBeacons, that makes me a very sad panda… Thankfully, there is a way to enable it, by replacing the original Bluetooth-related libraries on the device with patched libraries that add support for Bluetooth Low Energy.

I have created an update ZIP file for the Nexus 10 (aka Manta) and Android 4.4 build KRT16S: The file can be downloaded from here. It was generated by getting the source of Android (branch android-4.4_r1.2), applying this patch by Manuel Naranjo to reenable Bluetooth Low Energy, recompiling (with target aosp_manta-eng), replacing the content of the update ZIP created by XDA Developers user Keine with the newly compiled libraries and, finally, signing the new ZIP.

!!! Although this seems to work fine for me, I am very new to this so use the ZIP and the instructions below at your own risk !!!

To install (I assume the Nexus 10 has never been rooted or unlocked, which was the case for me):

  • Obtain the Android SDK (for the fastboot and adb tools)
  • Boot to fastboot mode (pressing the Power-Volume Up-Volume Down buttons for some time) and OEM-unlock your device (using “fastboot oem unlock”)
  • Boot to the factory recovery mode (pressing the Power-Volume Up buttons to get past the red triangle) and wipe the user data
  • Boot to Android and reenable USB debugging
  • Boot to fastboot mode and flash a custom recovery image like ClockworkMod (using “fastboot flash recovery recovery-clockwork-6.0.4.3-manta.img “)
  • Boot to the custom recovery mode and apply the update ZIP (by choosing the file from /sdcard; the file can be copied to the Nexus 10 using “adb push …”)
  • Boot to Android (no need to apply the custom recovery image permanently or root the device)

The patch can be tested with an Android app like iBeacon Locate (by the makers of this opensource iBeacon library for Android). I also needed an iBeacon transmitter: I used this opensource Mac OS X application that can run on my Macbook Air running Mavericks (but an iPhone or dedicated hardware could work too).

Here is the Mac OS X application broadcasting the iBeacon advertisement:

Screen Shot 2013-12-11 at 01.00.25

And here is what I get on the Nexus 10:

Screenshot_2013-12-11-00-59-22

Yeaaaah!!!

I was surprised to learn that the Nexus 10 cannot be updated in the usual way (OTA) after this kind of operation. It is possible to rollback to the original libraries of build KRT16S using this  ZIP (the files were obtained through “adb pull /system/lib ~/backup” before applying the BLE update ZIP). Then the new Android build can be installed (for example using sideloading) and the BLE update ZIP reapplied on top (I have tested this with 4.4.2 aka build KOT49H). After an OTA update and before applying the update ZIP, the libraries will have to be backed up to create a new rollback ZIP for that version. Or maybe more simply, the device can be reset to its factory version.

Hiking by the sea in Yugawara: Mount Shiro, Mount Maku and Mount Nango

A couple of weeks ago, I went hiking in the sea-side town of Yugawara, in Kanagawa Prefecture, going up, in order, Mount Shiro (城山; 563m), Mount Maku (幕山; 626m) and Mount Nango (南郷山; 610m). They are not very high mountains but since the route starts at sea level, it still made for good exercise. The view on the Pacific Ocean during the hike was also great.

I got the idea from this blog post but in the end I followed the plan outlined here (with map). The start of the hike can be reached directly from Tokyo in about 1h30 with the JR Tokaido Main Line (even faster using the Shinkansen). When I arrived at Yugawara, I made a detour to have a look at the ocean. I then went back to the train station and followed the trail direction from there. The first step was Mount Shiro. It can be reached after walking a paved road and then a short mountain trail. Then I went through a tunnel and visited the Shitodo Cave. After a short walk in the forest, I reached Makuyama Park. I then went up Mount Maku, the highest mountain of the day. It got very windy at that point. Finally, I went back into the forest towards Mount Nango and passing the Jikansui Pond (自鑑水) along the way. From the summit of Mount Nango, there is an unmarked (but perfectly usable) trail to get down to Yugawara. I then finished the day by following the road along the coastline until I reached Manazuru station.

Above, Sagami Bay in the morning.

Above, the island of Izu Oshima.

Above, Yugawara station.

Above, oranges. It seems a local specialty.

Above, Manazuru Cape from the summit of Mount Shiro.

Above, at the entrance to the path leading to the Shitodo Cave.

Above, the cave.

Above, plum tress at Makuyama Park. They blossom in February.

Above, a butterfly hanging on for its life in the wind.

Above, at the summit of Mount Maku.

Above, Jikansui Pond on the way to Mount Nango.

Above, at the summit of Mount Nango.

Above, I walked in the area around the summit of Mount Nango for a bit before going down to Yugawara.

Above, on the way down to Yugawara.

Above, the trail goes along a golf course.

Above, at the beach, looking at Manazuru Cape.

Above, even though the waves were not that high, there were a few surfers training in the ocean.