Using Google Glass in 2020

After waiting ~7 years, I decided to check eBay again and finally found Google Glass bidding at ~$200. While I missed one of the auctions, I happened to find another unit bidding at $150 and selling for $200 + shipping. I immediately purchased the unit and received it in the mail two days later. I knew that some services were shut down so it was a bit of a gamble if this thing would still work but it does look like there is some hope left for the tech. This article will show how to get started developing on Google Glass using today’s software versions.

Final Software Update

When my unit arrived, I was shocked to find that this person did not factory reset the devices before sending. After learning some of the settings and input pattern, I decided to factory reset the device and start from scratch.

Infrastructure for activating your Google Glass was shut down earlier this year (I think around February). When you factory reset your device (and you are running older firmware), you won’t be able to activate your device as you’ll need to either get the mobile app working or scan a QR code from Google’s website. I believe both of these options were set up to grant the Glass the ability to access your Google account. As these service were shut down, you’ll have to flash the latest firmware to ignore this startup sequence.

The latest firmware patch is located here: https://support.google.com/glass/answer/9649198?hl=en

This is also the same set of files from this list (XE24): https://developers.google.com/glass/tools-downloads/system

Note that there is also a “rooted” bootloader that is available in the second link that isn’t available in the first. This allows you to run adb shell as root (which is useful for looking at kernel logs)

Driver Updates

Note: steps copied from: https://stackoverflow.com/a/42312419

So the first step is connecting your glass to your computer (Windows/Mac/Linux). This means installing and configuring drivers. Unfortunately, I don’t have instructions for Mac/Linux but I think the process will still be similar (or the device will magically work).

The first step here is installing Android Studio (hopefully self explanatory). I am using the following:

Android Studio 4.0.1
Build #AI-193.6911.18.40.6626763, built on June 24, 2020
Runtime version: 1.8.0_242-release-1644-b01 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 1237M
Cores: 16
Registry: ide.new.welcome.screen.force=true
Non-Bundled Plugins:

The next step is installing the Google USB driver package. Go to Tools > SDK Manager. Then, navigate to the SDK Tools tab and find the Google USB Driver.

This should give you the following folder (replace $USER with your username):

C:\Users\$USER\AppData\Local\Android\Sdk\extras\google\usb_driver

Inside of this folder, you’ll find files that tell your operating system which devices are “Android.”

Mode                LastWriteTime         Length Name
---- ------------- ------ ----
d----- 9/4/2020 9:00 PM amd64
d----- 9/4/2020 9:00 PM i386
-a---- 9/4/2020 9:00 PM 12789 androidwinusb86.cat
-a---- 9/4/2020 9:00 PM 12825 androidwinusba64.cat
-a---- 9/4/2020 9:00 PM 6957 android_winusb.inf
-a---- 9/4/2020 9:00 PM 17826 package.xml
-a---- 9/4/2020 9:00 PM 64 source.properties

Specifically, you will need to modify the android_winusb.inf file. Next is to find out what the device ID of your Google Glass is.

Plug your devices into Windows. Then, open Device Manager from the start menu. Unfortunately, it is a bit hard to show a picture given I have already configured my system but it should be somewhere in this menu! The device may have the same “logo” as the Software devices option below. You may also find it under one of your Serial Bus sections as USB can be chained. After you open the properties for the device, use the Details tab and select the Hardware Ids tab. If you Google around, you’ll find other people have different IDs here and it likely has to do with manufacturing so don’t be worried if yours is different than the one I have below.

Using this ID, you can add a new section if it doesn’t exist:

;Google Glass
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_9001
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_9001&MI_01

There are two parent sections:

[Google.NTx86]
...
[Google.NTamd64]
...

I am not sure which section you need to add it under so I added mine to both. After, you should be able to search for a driver from this location:

Note: you may have to disable driver checking because you are modifying a file that will change some signature when the driver is loaded on the Windows side. I was able to do this by holding shift and selecting the Reboot option in the start menu.

For driver selection, you can choose the Android Composite ADB Interface. I think this is used for both Fastboot and ADB tools (I think my laptop had a third Fastboot-like option which my desktop computer didn’t have).

Nice! Debugging mode is likely not enabled as you factory reset the device so don’t expect adb devices to work. You also likely booted the Glass up normally so you aren’t in the Fastboot menu or in “Fastboot Mode” (not sure what this is called, I guess bootloader).

To reboot into Fastboot, turn your device on. After it is off, hold the Camera button down and click the power button for a second or so. After releasing the power button, keep the Camera button held down for ten seconds or so. Your device will then boot into recovery mode and you’ll have a menu like this on your glass screen:

You can click the Camera button to navigate to the next item in the list and long-press to select the item. Reboot into fastboot should be the second option in this list so you’ll need to click once and then hold for a few seconds after that.

After this, your devices screen will not be on but the power light should have a very slow pulse. You can now plug the Glass device back into your PC. Windows should use the right driver and you’ll be able to run the fastboot command (this executable is located in the platform-tools folder in SDK folder above (sibling of extras/ folder).

Fastboot Mode

You should not see your device in ADB devices yet but you should see it in fastboot devices:

adb.exe devices
List of devices attached
fastboot.exe devices
015DB76E16009013 fastboot

The next step is unlocking the device:

fastboot.exe oem unlock
(bootloader) Warning: Unlocking your device will void your warranty
(bootloader) and erase your personal data from the device.
(bootloader) Run "fastboot oem unlock" again to confirm.
(bootloader) Device still locked.
OKAY [ 0.023s]
Finished. Total time: 0.032s

Re-run this command to unlock it:

fastboot.exe oem unlock
(bootloader) Erasing personal data. This could take a while...
(bootloader) Erasing cache...
(bootloader) Erasing userdata...
(bootloader) Unlocking...
(bootloader) Device unlocked!
OKAY [ 1.113s]
Finished. Total time: 1.115s

Now, we are ready to flash the firmware supplied in the Support Post above. I initially had problems with the boot image so I skipped it and continued to the system and recovery images and the Glass seemed to work (though adb shell with root was not working at that point)

fastboot.exe flash boot ..\..\..\..\..\Downloads\signed_signed-glass_1-img-5585826\boot.img
fastboot: error: Couldn't parse partition size '0x'.

After the boot image, flash the other two images: system and recovery .

If you want to flash the “rooted” boot.img, I was able to use the flash:raw command to avoid this error. This was able to

fastboot.exe flash:raw boot C:\Users\jgens\Downloads\boot.img
Sending 'boot' (5496 KB) OKAY [ 0.238s]
Writing 'boot' OKAY [ 0.923s]
Finished. Total time: 1.183s

After you are done flashing, run fastboot.exe reboot and this should boot up the Glass normally. If everything works correctly, you should be in the Home screen of the Glass and not have the tutorial to follow anymore!

Head to the Options menu (left of clock), then to Device Info and then to the end of this list. You should be able to enable Developer mode and enable Debug mode. If this works properly, you should be able to run adb devices and find your device. If this isn’t working for you, you may need to restart Windows or change the driver settings.

If you install the rooted image, you should have the following:

adb.exe root
adbd is already running as root

Writing A Program

Now you can at least look around your device and do whatever you would normally have done. However, you may be interested in building an application for this Glass. If so, you’ll need to use the following guide to get started building.

I initially tried a few “Hello world” programs and start apps and was met with error after error (mostly due to version conflicts). I am not up-to-date with the latest Android development but I did find some of the older guides for Glass that used Eclipse and did not use Gradle for building. I didn’t really find this acceptable so I tried finding an example that did use Gradle. I ended up finding the Timer example though I mostly referenced its files and setup and never successfully imported and built it with Android Studio:

The first thing to do is install the Glass Development Kit Preview Package. Use the SDK Manager and uncheck the “Hide Obsolete Packages” and check the “Show Package Details” buttons. This should let you install the Development Kit.

After, create a new project with No Activity. For Minimum SDK, I used API 19: Android KitKat.

This should give you the following: an unbuildable Android App configuration with zero source code files (nothing in test2). You can also see my Glass Device was picked up automatically.

You’ll need to start with an Activity. This can just be a Java class that extends Activity :

package com.example.test2;

import android.app.Activity;

public class TestClass extends Activity {}

Now, update the Launch Options to use this Activity:

You should then have the second error:

<activity
android:name="com.example.test2.TestClass"
android:label="@string/app_name"
android:enabled="true">
<intent-filter>
<action android:name="com.google.android.glass.action.VOICE_TRIGGER" />
</intent-filter>
</activity>

After adding the above activity inside of the <application>...</application> , you should be able to “Run” the application.

This shouldn’t do anything yet as you haven’t added any code but it does give you a good check point to start building. From here, you can start copying bits from other projects (like parts from AndroidManifest.xml) or just follow some of the guides.

Here are a few other notes I made along the way from other non-successful approaches:

  • One project’s gradle file has http instead of https
  • One project was using gradle 1.0 but Android Studio needs to use 2.6 . You will need to use 2.6 and check the version of the other dependencies to get anything working.
  • You may also need to comment out most of build.gradle (so any sort of JUnit or appcompat configuration)

Hello World

I started by copying bits of other guides. I have three activities that you can learn by example:

  • CardActivity (hello world)
  • MenuActvity (showing how menu’s work)
  • FindThePriceActivity (would have sent http call to eBay with picture taken from device)

Fixing the Wifi

Unfortunately, I am not able to get WiFi working on my device. I did look at the kernel log and it looks like the driver doesn’t start quite right. I am pretty sure the root error is the si_attach failed but I don’t know what this means and wasn’t able to debug even after looking through the glass source code:

dmesg log:

I could try recompiling kernel, possibly swapping the android driver with linux broadcom driver though I have no idea if that is possible or if I would hit even more error.

The only other option I could find was at least finding a way to forward traffic through ADB (communication is bidirectional after all!). There is a neat command called adb reverse which behaves like adb forward and would allow connections on the Android device to connect to something listening on your PC (like a proxy server!). However, this did not work and I wasn’t able to figure out the error message even with ADB_TRACE=all set.

Conclusion

All in all, I would say that I enjoyed my time with the Glass. Without WiFi working, I don’t know that I will see much use for this device unless apps are self-contained. I was thinking of building some fitness tracker to use the gyroscope to display number of push-ups/pull-ups.

I also think that the tech behind imaging will need to be different (surely why this was discontinued). The following image shows how the lens reflects the image onto your retina using a curved surface rather than the “block” used by the Glass. I think that these devices will need to be fitted per-customer which will drive cost way up and will not allow them to be re-sold quite as easily. My Glass device definitely has out-of-focus text near the edge of the surface and is somewhat difficult to use (depends on app and text placement).

Picture of lens reflection: https://www.kguttag.com/wp-content/uploads/2018/10/North-Focals-feature-image-001.jpg

Thank you for reading! I would love to see another device that just focuses on notifications and reading simple content (like tweets/news) so that the device can be kept small and light and hopefully not overheat. Until then, we wait!