Close

Wear OS Smartwatch - Uninstall Hidden Bloatware & Performance Boost

A project log for Random Hacks of Kindness

Things I hack to make stuff better

Hyr0nHyr0n 01/27/2019 at 07:499 Comments

Background

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): 

DAFUQ?!?

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. 

Performance Boost

This first modification is actually the easiest and can be done on the watch itself without any extra tools, debuggers, etc.

  1. Enable developer settings on your watch
    1. Open the watch's Settings.
    2. Tap System > About.
    3. Scroll to Build number and tap the build number seven times.
    4. A dialog will appear confirming that you are now a developer.
  2. Swipe back to the main settings menu and scroll to the bottom and select "Developer Options"
    1. 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
  3. Scroll down to Transition Animation Scale
    1. Change it to Animation Off
    2. Swipe back
  4. Scroll down to Animator Duration Scale
    1. Change it to Animation Off
    2. Swipe back to main watch face
  5. 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.

Remove Bloatware

The second modification is going to be a bit more involved, but well worth it.

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...

$ 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...

Enabled Packages

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? 

package:com.mobvoi.wear.health.aw

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

hax0r@ubuntu:~/Desktop$ adb -s 127.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

Woot! Alright now lets get to the most important part, undoing what we did to get back to normalcy.

Clean Up

Shut Down ADB

$ sudo adb kill-server


Discussions

Omgloletcetc wrote 01/18/2020 at 20:12 point

Worked perfectly. Thanks! 

  Are you sure? yes | no

Micah Guttman wrote 01/05/2020 at 04:37 point

This command works on linux

adb -s 127.0.0.1:4444 shell pm list packages com.mobvoi | cut -d ':' -f 2 | tr -d '\r' | xargs -L1 -t adb -s 127.0.0.1:4444 shell pm uninstall -k --user 0

you just need to change com.mobvoi to whatever you want it to search for

here is the stack overflow thread that I used to make this snippet of code

https://stackoverflow.com/questions/44973594/uninstall-multiple-android-packages-using-adb

  Are you sure? yes | no

Jolan Rensen wrote 10/08/2019 at 18:53 point

After running these commands, my watch did feel a lot snappier, however, I found that the apps were still installed in the Settings -> Apps & Notifications -> App info -> System apps (all the way down). From there I found out the apps were still there and I disabled them from the ui. I think this is also possible to do without doing any ADB stuff, simply disabling the system apps. Fully uninstalling will never work as they're system apps, but disabling removes the part of the app stored on /data and only leaves the apk in /system. 

  Are you sure? yes | no

poo1Joo1 wrote 09/26/2019 at 15:32 point

I removed com.fossil.charge.darter and for the first time battery stats in WearOs App seem to work properly and the massive battery drain seems to be gone for now.

  Are you sure? yes | no

ajlitt wrote 09/06/2019 at 18:55 point

Here's a workaround for uninstalling all packages matching a substring:

for P in `pm list packages | grep mobvoi | sed -e 's/package://g'`; do pm uninstall -k --user 0 $P; done

Replace 'mobvoi' in the grep with whatever substring you want to match. 

  Are you sure? yes | no

Martin Lichtblau wrote 07/20/2019 at 13:40 point

Got same watch. Also unistalled fossil packages which greatly improved responsiveness. Please try and reply.

Uninstalled: 
com.fossil.twm
com.fossil.wearables.watchfaces
com.fossil.wearables.mk
com.fossil.wearables.ms

P.S.: Opening settings and going to installed system apps goes instantaneous now.

  Are you sure? yes | no

Martin Lichtblau wrote 07/20/2019 at 13:00 point

Commands run faster if screen is on; best combined with keep screen on when charging option.

  Are you sure? yes | no

Bart wrote 03/22/2019 at 15:35 point

After I did this, the Wear OS app on my phone crashes whenever I go to "Watch Storage" under "Advanced Settings". Any idea why that might be? I tried rebooting both my watch and my iPhone but it still happens

  Are you sure? yes | no

Mike Szczys wrote 01/28/2019 at 21:04 point

Wow, impressive due diligence on ensuring the stuff you're removing is actually bloatware. Like you I haven't had to go digging so far under the Android hood in a few years but may make the trip for a Fire tablet following this example Thanks for posting!

  Are you sure? yes | no