Update: Greg Priest-Dorman tipped me off about an issue with these instructions. XE12 has a bug that causes
keys to repeat if you type quickly. I'm quite slow on my Twiddler, but I was able to reproduce it with this command:
$ adb shell input text "abcdefghijklmnopqrstuvwxyz-0123456789"
Which yields this
Greg reports that XE8 works well, but downgrading that far is tricky. I'm going to experiment with flashing earlier
versions and update this post with my findings.
Voice commands are perfect for commands, but something I've always dreamed of doing on Google Glass
is taking notes. The Twiddler 3 seems like the perfect input device,
and we all know that the best text input software is
Getting all of these to work together took a little bit of hacking. This blog entry guides you through the
process of pairing Glass with the Twiddler 3, and using it to type your first words into
VimTouch on Glass.
Here's a summary of what's involved:
- Root and downgrade to XE12
- Disable automatic updates
- Pair your Twiddler 3
- Install and run VimTouch
Warning: This tutorial includes steps that will void your Google Glass warranty. Proceed at your
own risk. If you accidentally brick your Glass, don't complain to me! :)
Root and downgrade to XE12
Current versions of the Glass operating system such as XE22 do not pair with Bluetooth HID devices
like the Twiddler. However, older versions that were based on Android 4.0 Ice Cream Sandwich do play
well with them. Before we can pair Glass with the Twiddler we need to downgrade to XE12 and disable
automatic system updates.
Why are we downgrading to XE12? Because it was the highest version based on Ice Cream Sandwich.
It has the most features and bug fixes included. You can also use XE10 or XE11, if you prefer.
All of the boot loaders and system images for Glass are available from the
System and Kernel Downloads page
in the official Glass documentation. Scroll down past the warnings and download
Root and downgrade
Now the scary part: flash the rooted bootloader and downgrade to XE12. This is the step that
voids your warranty and could brick your Glass. It also erases any data on Glass, so download
your photos and video before flashing.
The instructions for flashing these images to Glass is on the very same page. Run these
commands using the
fastboot tools included with the
Android SDK. These instructions work best from
Linux, so flash from there if possible.
Note If you're flashing from a Mac, Glass might crash after each
fastboot flash command.
If this happens, take a deep breath, power cycle Glass, and use
adb reboot bootloader to get back
into fastboot. Proceed to the next image.
# enter fastboot mode
$ adb reboot bootloader
# verify Glass is in fastboot
$ fastboot devices
# acknowledge the warning
$ fastboot oem unlock
# actually unlock the bootloader
$ fastboot oem unlock
# flash the rooted bootloader
$ fastboot flash boot boot.img
# flash partitions with factory images
$ fastboot flash system system.img
$ fastboot flash recovery recovery.img
# reboot into normal mode
$ fastboot reboot
Your Glass is now running XE12. You should see the XE12 log in screen.
Don't log in yet. You need to disable updates first.
Disable automatic updates
Once you log in, Glass automatically updates to the latest version. You don't want this, so we need to
disable updates. Unfortunately, we need
adb access to disable updates. You can work around this, but
it requires some silly tricks, and an wifi network that you can disable quickly.
- Set up a temporary wifi network. I used the portable hotspot feature of my mobile phone.
- Use the Glass setup page to log in to your account. Once you're logged in
immediately disable your wifi network.
- Swipe to Settings -> Device Info. Enable USB debugging (
GlassUpdate.apk to disable automatic updates, and restart Glass.
$ adb root
# delete the automatic update app
$ adb shell rm /system/app/GlassUpdate.apk
# see if Glass already started updating
$ adb shell ls -al /cache
-rw-r--r-- app_5 app_5 5416530 2015-05-24 23:33 ...glass_1-ota...zip
drwxrwx--- root root 1969-12-31 16:00 lost+found
# if it is, delete the zip
$ adb shell rm /cache/...glass_1-ota...zip
# reboot to kill any remaining running processes
$ adb reboot
Automatic updates are now disabled. You can add your primary wifi network to Glass.
Note: This is a pretty aggressive way to disable updates. I tried other techniques, like
disable com.google.glass.update, but nothing else I tried persisted across restarts. If you
figure out a better option, please
let me know.
Pair your Twiddler 3 with Glass
The built-in Glass settings software does not know how to pair with Bluetooth HID devices, but
HY and PY from the Glass team showed us how to do this in the
Hacking Glass session at Google I/O in 2013.
- Get your a copy of
Settings.apk. You can build it from source
or download a binary from a trustworthy source.
Settings.apk and fire off an intent to start it up.
$ adb install ./Settings.apk
$ adb shell am start -S com.android.settings/.Settings
Turn on your Twiddler, and reset Bluetooth pairing with the
Awkwardly use the touchpad to move around the settings app. Go to Bluetooth, scroll down to the Twiddler,
and tap to pair. If you get stuck for some reason, use
adb input keyevent to
simulate arrow key movement.
Fix the settings card
At this point, you may notice that the settings card is broken. You have two apps that respond to the
settings intent, but the intent chooser is broken in XE12. To work around this, you can install an alternative
launcher like Mike DiGiovanni's Launchy. Follow these steps to install it.
- Check out Launchy. It won't build out of the box. It depends on a bunch
of XE16 GDK stuff, which does not work on your XE12 device.
MainActivity.java, and remove all of the code that refers to any class in the
- Build the apk, and side load it on to your Glass.
You can now tap through the Glass main menu to start Launchy, and Launchy can start Glass' default settings app.
Install and run VimTouch
At this point we have a Glass running XE12 with a paired keyboard, but none of the built in software responds
to text input from a keyboard. To make your Twiddler useful on Glass, you need a keyboard friendly app.
What better app to install than the Android variant of Vim?
Clone VimTouch, build it from source, and install it on your Glass.
It runs great, and you can verify your keyboard input right away. It also shows up in Launchy, so you
can start it that way in the future.
Is your Glass still working? Great! You've rooted it, downgraded it, disabled automatic updates, and
typed characters into the best text editor in the world. Congrats!
But the story isn't over yet. Launching VimTouch from the touchpad is a little bit clunky, and the
Glass home app starts each time Glass wakes up. It's not a useful note taking device yet. We need a way
make a sticky text editor that continues across sleep cycles, and a way to launch apps from the Twiddler.
I've worked out solutions for both of these, but they're a story for another blog post. If you're interested
in a writeup, please tweet at me.