So I got myself one of the fancy new smart watches, a Fossil Sport.
TBH I'm not a watch wearing person, I have no desire for a tiny smartphone on my wrist throughout the day. This is not gonna be a rant or review of the Fossil Sport, but I want you to understand my use case: I run. In the past, running consisted of having this stupid arm pocket strap on my bicep with my phone zipped up in it, then a heart rate monitor strapped to my forearm, and some wireless headphones. I hate it, i hate having stuff on me. However I'm also a data freak who likes tracking all runs run via GPS, watching heart rate, seeing how interval training affects my HR and overall pace performance over time, etc. So here comes a water proof smart watch where I can do all that (GPS, Heart Rate Monitoring), syncs with Google Fit, listen to my music offline, NFC wallet so I can run down to Lassen's for some alcoholic watermelon kombucha, all while leaving my phone behind. PERFECT. That's all I need it for and I've now reduced my "stuff" to just a smartwatch and BLE headphones.
Well it didn't take long for me to get pissed off about it (I'm never happy...ever). It was laggy at times by 400-600 ms, which is just enough of a delay to make someone like me insane. Then to top if off, I was messing around with the Wear OS companion app that goes on your phone and I saw this when I looked at the Advanced Settings -> Watch Storage (and scrolled down a bit):
The watch had visibly come with no bloatware (from the Wear OS installed apps POV), but there was obviously hidden/disabled Tic/Mobvi, Ali Express Pay, and a bunch of stuff in Chinese which I sure as hell don't need and cant read anyway. Now if you add all that up, its probably less than 100MB. However this is a smart watch which boasts 2GB of storage....which is already eaten up by Wear OS and other apps. In fact with just factory settings you only have about 1GB free. So were back to the early days of Android with smart watches, every byte counts. Because (remember my use case), those precious megabytes equate to roughly a minute of music each I could be listening to while running. I had a bit of motivation, but not much to do anything other than read at this point.
So I tried googling the interwebs as to WTF this stuff was an why, and you start finding many Reddit posts about most Fossil, Tic/Mobvi, etc watches all having this same crap on them. While I did not see anyone show proof of the "why" (its not lie the OEMs are gonna come out and say it), the crowd sourced consensus was, Fossils manufacturer makes many of the WearOS smartwatches for them and other "competitors" and to simplify configuration management, most watches get the same software load and modifying it with ADB scripts after the fact to enable or disable certain apps. I'm not in China, so all of those Chinese apps are disabled. I don't have a Tic watch, so the Tic apps are disabled. Some people even believe the location service enables them if you show up in China. Who knows. Overall I'm not a big fan of folks on message boards running with theories as fact. I just want to leave those ideas here as being "alright" hypotheses. At the end of the day, Fossil makes the watch and decided to leave it on there, so it's on them for not disclosing the space advertised is taken up by garbage.
I slowly stopped caring about the disabled apps (which you could not uninstall) until something weird happened. I got a notification on my watch from Tic Health that I was only 50 steps away from my goal. WTF? One of those disabled apps went active (possibly sentient too and is currently contributing to the rise of the machines)
Well fuck that, give the machines an inch and they'll take a data mile (possibly enslave or kill us all too). I don't know how Tic Health got enabled (I didn't do it), but now I have no desire to let anything just be. That hidden bloatware had to go and I wanted to speed up the watch if I could, given that bit of lag was driving me nutz.
Personal disclaimer incoming... Its been years since I've hacked my android devices because as soon as the Pixel XL came out, I didn't need to anymore. Before that, I was living a life of Motorola Droid, Turbo, Turbo 2, ASUS Transformer TF101... and would have to go through great lengths to crack the bootloader, root the device, and get something like CyanogenMOD on there (or even just remove bloatware). That being said, I'm rusty with ADB and basically just read through the online manual. If you see me doing something inefficient (or stupid) lemme know in the comments below and I'll gladly update this log. So until Google releases a Pixel Watch which actually comes off the shelf pristine, we'll be having to tweak/hack these 3rd party smart watches...to make them better... (well those of us who choose to live in the Google ecosystem vs the Apple ecosystem, different strokes for different folks).
At the time of writing this, I have a stock Fossil Sport, Running Wear OS 2.2, no update H. The packages I end up removing are specific to my watch, but there is no reason these instructions shouldn't work for most Wear OS watches (especially most Fossil brand smart watches). Also this goes without saying...but if you mess your device(s) up, not my fault. Your fault. You are taking the leap of faith in modifying your device beyond OEM intentions, meaning you should feel comfortable owning it this way. I don't believe this has any adverse affects and it hasn't for the couple of days I've been running it this way now.
This first modification is actually the easiest and can be done on the watch itself without any extra tools, debuggers, etc.
- Enable developer settings on your watch
- Open the watch's Settings.
- Tap System > About.
- Scroll to Build number and tap the build number seven times.
- A dialog will appear confirming that you are now a developer.
- Swipe back to the main settings menu and scroll to the bottom and select "Developer Options"
- There's a whole lot of really nice options you can tweak in here. I recommend that you do not...unless you really understand what you are doing
- Scroll down to Transition Animation Scale
- Change it to Animation Off
- Swipe back
- Scroll down to Animator Duration Scale
- Change it to Animation Off
- Swipe back to main watch face
- Have a beer
What you just did is nullify the delay which is inserted in to the various UI animations. If you find that it messes with anything, you can always go back and change the delay to "Scale 0.5x" (by default it was set to scale 2x). I don't what the hold up is, many with beta versions claim H update or 2.3 made things better... but until it does get rolled out, eliminating the aesthetic delays on a watch that already has some lag really brings some performance improvements. I have no complaints now with the responsiveness.
The second modification is going to be a bit more involved, but well worth it.
- Hardware Requirements: Watch, Paired Android Phone, Computer, USB Cable
- Software Requirements: Linux OS, Android Debug Bridge (ADB),
Okay you technically don't need Linux, you can do this from Windows but I am not going to list instructions for how to install, setup, and use ADB from Windows. If you run Windows, its honestly faster and easier to spin up an Linux VM and install ADB than to do it natively. So my OS of choice is Ubuntu 18.04 LTS, lets go with that.
Install ADB & Start The Server
From the magic of your Ubuntu command line...
//Install Android Tools $ sudo apt-get install android-tools-adb android-tools-fastboot //Start the ADB Server $ sudo adb start-server //If you have issues, try stopping then starting the server again. To stop... $ sudo adb kill-server
Enable Developer Mode & Debugging on Watch/Phone over Bluetooth
Google made it very clear how to do enable debugging and developer options and it would be a waste of my time and yours to copy and paste all of it: https://developer.android.com/training/wearables/apps/debugging
Follow the instructions in the Debug Over Bluetooth section to...
- Enable developer options on your watch
- Enable developer options on your phone
- Enable USB Debugging on the phone
- Enable ADB/Bluetooth debugging on the watch
- Enable Bluetooth Debugging on the phone
- Connect the debugger to the watch
- Don't be confused by the step earlier when you started the ADB server. On mine it was running on port 5037. That is fine. Starting the service informs you just what port ADB is running on. Continue with the adb forwarding steps because we are going to use port 4444 as a TCP to Bluetooth port forwarding service to the watch.
- Go ahead and confirm debugging request on your watch and on your phone
adb forward tcp:4444 localabstract:/adb-hub adb connect 127.0.0.1:4444
Now even though debug over WiFi is an option, I don't recommend doing it. Chicken and the egg problem. You don't have full control of the watch yet, so it's going to manage the radios for battery performance however it so damn well pleases. If you connect over WiFi, it may decide it wants to turn WiFi off and only use BT. That could be really annoying. Lets avoid that and just debug "through" the phone and over the BT radio instead since it will always maintain that interface between the phone and watch. So we are trading off an easier setup for interface reliability.
If you did everything as the steps told you, your Wear OS companion app will now show...
Host: connected Target: connected
Uninstall Bloatware Without Having Root Privleges
First things first, I'm not a big fan of YOLO. Do recon on your watch first, google the packages to ensure they are truely something you want to get rid of. So lets start by getting a list of those packages, however I want them sorted out by which are enabled (-e flag) and disabled (-d flag) and output them to a file. If you are curious about the different filtering options go here and CTRL-F "list packages"
hax0r@ubuntu:~/Desktop$ adb -s 127.0.0.1:4444 shell pm list packages -e > enabled_packages.txt hax0r@ubuntu:~/Desktop$ adb -s 127.0.0.1:4444 shell pm list packages -d > disabled_packages.txt
So combing through here's what I found...
package:com.android.cts.priv.ctsshim package:com.google.android.ext.services package:com.google.android.googlequicksearchbox package:com.android.providers.calendar package:com.android.providers.media package:com.fossil.twm package:com.google.android.ext.shared package:com.google.android.clockwork.flashlight package:com.fossil.wearables.watchfaces package:com.fossil.charge.darter package:com.google.android.wearable.setupwizard package:com.android.providers.downloads package:com.google.android.wearable.overlay.gms package:com.fossil.elabel package:com.qualcomm.qti.auth.fidocryptoservice package:com.android.defcontainer package:com.android.vending package:android.autoinstalls.config.google.wear package:com.google.android.clockwork.nfc package:com.google.android.clockwork.twm package:com.android.certinstaller package:android package:com.google.android.apps.wearable.settings package:com.android.nfc package:com.android.backupconfirm package:com.google.android.deskclock package:com.google.android.wearable.overlay.home package:com.google.android.theme.darter.fossil package:com.android.statementservice package:com.android.providers.settings package:com.google.android.apps.wearable.bluetooth package:com.google.android.music package:com.google.android.apps.wearable.systemui package:com.google.android.clockwork.gestures.tutorial package:com.android.inputdevices package:com.google.android.clockwork.brightness package:com.fossil.wearable.pay package:com.google.android.apps.maps package:com.google.android.apps.fitness package:com.android.server.telecom package:com.android.keychain package:com.google.android.packageinstaller package:com.google.android.gms package:com.google.android.gsf package:com.google.android.partnersetup package:com.google.android.apps.wearable.bugreportsender package:com.google.android.wearable.ambient package:com.android.managedprovisioning package:com.mobvoi.wear.health.aw package:com.google.android.buttons.darter.fossil package:com.google.android.clockworkicons package:com.google.android.clockwork.leswitch package:com.google.android.apps.wearable.retailattractloop package:com.google.android.apps.wearable.phone package:com.google.android.apps.translate package:com.fossil.wearables.tos package:com.cei.servicetool package:com.fossil.oemsetup.darter package:com.google.android.wearable.app package:com.android.cts.ctsshim package:com.google.android.apps.handwriting.ime package:com.google.android.keep package:com.android.shell package:com.android.wallpaperbackup package:com.android.providers.blockednumber package:com.android.providers.userdictionary package:com.android.location.fused package:com.android.bluetooth package:com.qualcomm.timeservice package:com.android.providers.contacts package:com.google.android.wearable.frameworkpackagestubs package:com.android.connectivity.metrics package:com.google.android.inputmethod.latin
Remember that Tic Health which Skynet enabled?
Yeah, that one's on the shit list now (Tic is really Mobvoi).
In addition, lets look at the disabled packages, because many of those are too...
package:com.google.android.wearable.smarthome package:com.dianping.v1 package:com.sogou.map.android.maps package:com.sdu.didi.psnger package:com.mobvoi.wear.fitness.aw package:com.mobvoi.ticwear.sidewearvoicesearch package:com.mobvoi.wear.social.aw package:com.mobvoi.wear.account.aw package:com.google.android.apps.walletnfcrel package:com.mobvoi.wear.appsservice package:com.google.android.clockwork.remindersle package:com.google.android.clockwork.hotwordle package:com.google.android.wearable.reminders package:com.mobvoi.wear.neteasemusic.aw package:com.google.android.inputmethod.pinyin package:com.mobvoi.ticwear.aw.appstore package:ctrip.android.view package:com.gotokeep.androidwear package:com.amberweather.watch package:com.eg.android.AlipayGphone
So I'm gonna play it safe and say even though there are disabled packages from Google, we're gonna leave those alone and just deal with all 3rd party disabled packages. This brings the final list of bloatware down to...
package:com.mobvoi.wear.health.aw package:com.dianping.v1 package:com.sogou.map.android.maps package:com.sdu.didi.psnger package:com.mobvoi.wear.fitness.aw package:com.mobvoi.ticwear.sidewearvoicesearch package:com.mobvoi.wear.social.aw package:com.mobvoi.wear.account.aw package:com.mobvoi.wear.appsservice package:com.mobvoi.wear.neteasemusic.aw package:com.google.android.inputmethod.pinyin package:com.mobvoi.ticwear.aw.appstore package:ctrip.android.view package:com.gotokeep.androidwear package:com.amberweather.watch package:com.eg.android.AlipayGphone
Here's my tale of caution because if you've never messed around in ADB and shot yourself in the foot, then you haven't lived. You may be tempted to clean house in your active / enabled packages too. DONT. They're enabled because your watch needs them to operate, there's always going to be some 3rd party stuff from Fossil in there for it to function properly. Given there are disabled 3rd party packages, they obviously aren't needed. However the way we are going to uninstall them is the safe route.
I say the "safer" route, in that I come from a time when removing bloatware would cause a CRC to fail and future updates would stop from the OEM, also sometimes your device is locked and you would need true root access. I don't want to chance this or go through the trouble of rooting the device. Remember you have developer debug access through ADB, its privileged access, not true root control of the device. So we're gonna compromise and keep the cache and package remnants there after install. This means we'll free up about 70-80% of the space from removing the package, but if the OEM does any kind of remote integrity check before pushing a firmware update it will appear the disabled apps are still there (but barely taking up space). ;)
With that said, lets open a shell.
hax0r@ubuntu:~/Desktop$ adb -s 127.0.0.1:4444 shell darter:/
"darter" is the internal development name of the device, just like AND!XOR has internal device names such as ManBearPig, Jerry, ScarryTerry, PickleRick, etc. If you see that, you are now have a shell on the watch and no longer have to keep typing the "-s 127.0.0.1:4444 COMMAND". So lets get to uninstalling those bloaty packages but were going to use the "-k" switch in order to keep the data and cache directories. Each uninstall command can take anywhere from 30 seconds to a couple minutes. I recommend having a beer or two handy.
darter:/ $ pm uninstall -k --user 0 com.sogou.map.android.maps Success darter:/ $ pm uninstall -k --user 0 com.dianping.v1 Success darter:/ $ pm uninstall -k --user 0 com.sdu.didi.psnger Success darter:/ $ pm uninstall -k --user 0 com.mobvoi.wear.fitness.aw Success darter:/ $ pm uninstall -k --user 0 com.mobvoi.wear.health.aw Success darter:/ $ pm uninstall -k --user 0 com.mobvoi.ticwear.sidewearvoicesearch Success darter:/ $ pm uninstall -k --user 0 com.mobvoi.wear.social.aw Success darter:/ $ pm uninstall -k --user 0 com.mobvoi.wear.account.aw Success darter:/ $ pm uninstall -k --user 0 com.mobvoi.wear.appsservice Success darter:/ $ pm uninstall -k --user 0 com.mobvoi.wear.neteasemusic.aw Success darter:/ $ pm uninstall -k --user 0 com.mobvoi.ticwear.aw.appstore Success darter:/ $ pm uninstall -k --user 0 ctrip.android.view Success darter:/ $ pm uninstall -k --user 0 com.gotokeep.androidwear Success darter:/ $ pm uninstall -k --user 0 com.amberweather.watch Success darter:/ $ pm uninstall -k --user 0 com.eg.android.AlipayGphone Success
So I tried to get clever and failed when I attempted to use the wildcard * for all of the mobvoi packages... I have no idea why it doesn't work. Someone who is smarter on ADB could explain, but I can't. It was also late and only 16 packages, not really a huge deal. Figured I'd let you know that.
darter:/ $ pm uninstall -k --user 0 com.mobvoi.* Failure [not installed for 0]
So now that the uninstall is complete, we need verify our mission was successful before backing out and shutting everything down.
darter:/ $ exit hax0r127.0.0.1:4444 shell pm list packages -d package:com.google.android.wearable.smarthome package:com.google.android.apps.walletnfcrel package:com.google.android.clockwork.remindersle package:com.google.android.clockwork.hotwordle package:com.google.android.wearable.reminders package:com.google.android.inputmethod.pinyin:~/Desktop$ adb -s
Woot! Alright now lets get to the most important part, undoing what we did to get back to normalcy.
Shut Down ADB
sudo adb kill-server
- Just as you followed the Android guide for enabling USB and Bluetooth debugging, go back and untoggle those items. You do NOT want to leave USB and Bluetooth debugging enabled on either your watch or phone.
- You can't undo developer options, you've walked out of the cave, there's no going back. But its just an extra menu which sits there now.
- Hold down the crown button on your watch for 15 seconds to reboot. You have to do this to remove some of the stuff which occurred during uninstallation.
- Once its back online, use your WearOS Companion App and take a look at the Watch Storage again. In my case i freed up about 57 MB. That's at least another offline album of running music (like Weezer's new awesome Teal Album). Also those apps don't appear anymore (because their size is zero). On your watch if you look at all apps installed (not through Play Store, but through Settings App Info) they will appear but with size zero bytes and if you expand detail it will say App Is Not Installed. I call this Friday night hack a success. If this write up helped others in any way with their Wear OS frustrations please lemme know. Also by all means I hope this doesn't give the impression the Fossil Sport is in anyway a bad watch, its really good. Especially if you are getting it as a fitness wearable. Some of us just like to hack things and make them better.