bitwarden / bitwarden/android

Search slows in proportion to the amount of vault entries, such that it can crash ANR and crash the APK.

Open
#5,412 4 comments 1 reaction 0 assignees View on GitHub
app:password-manager bug
Dominant language
Kotlin
Stars
9.4k
Forks
1.1k
Avg merge
1d 14h
Merged PRs (30d)
67

Description

### Steps To Reproduce

1. Have 2 332 vault entries.

1. Search. The more characters, the slower, until it indefinitely hangs (ANRs).

### Expected Result

Searches for each character should be instantaneous, since it should first search the local database, then query the external one, and update it, or at least render a loading progress indicator if/when not.

### Actual Result

It slows, then, with large strings, hangs:

https://github.com/user-attachments/assets/fe7a2af3-dbae-4dfc-bf41-690e6c82df90

This causes it to ANR:

~~~YAML
ANR in com.x8bit.bitwarden (com.x8bit.bitwarden/.MainActivity)
PID: 29542
Reason: Input dispatching timed out (6493820 com.x8bit.bitwarden/com.x8bit.bitwarden.MainActivity (server) is not responding. Waited 5001ms for MotionEvent)
Parent: com.x8bit.bitwarden/.MainActivity
ErrorId: 2fdcd95b-1bc7-4c44-9879-a7c87d401a7d
Frozen: false
Load: 5.97 / 4.24 / 4.07
----- Output from /proc/pressure/memory -----
some avg10=0.17 avg60=1.08 avg300=0.55 total=1211735483
full avg10=0.05 avg60=0.26 avg300=0.12 total=386417125
----- End output from /proc/pressure/memory -----
----- Output from /proc/pressure/cpu -----
some avg10=8.83 avg60=10.24 avg300=6.64 total=20758745944
----- End output from /proc/pressure/cpu -----
----- Output from /proc/pressure/io -----
some avg10=0.12 avg60=1.29 avg300=0.82 total=4444143325
full avg10=0.04 avg60=0.42 avg300=0.30 total=2778158413
----- End output from /proc/pressure/io -----
CPU usage from 13864ms to -1ms ago (2025-06-23 22:22:51.541 to 2025-06-23 22:23:05.406):
128% 29542/com.x8bit.bitwarden: 124% user + 3.5% kernel / faults: 123739 minor 21 major
39% 1201/surfaceflinger: 30% user + 8.8% kernel / faults: 43 minor 2 major
20% 1544/system_server: 12% user + 8.1% kernel / faults: 1796 minor 53 major
13% 1129/media.hwcodec: 3% user + 10% kernel / faults: 18 minor 1 major
11% 21938/com.google.android.inputmethod.latin: 9% user + 2.6% kernel / faults: 1453 minor 54 major
10% 15664/com.spotify.music: 8% user + 2% kernel / faults: 819 minor 32 major
7.5% 1113/vendor.qti.hardware.display.composer-service: 5.7% user + 1.8% kernel / faults: 62 minor
5.9% 1597/cnss_diag: 5.4% user + 0.4% kernel
5.2% 1622/mediaserver: 2.8% user + 2.3% kernel / faults: 276 minor 3 major
3.3% 11465/com.google.android.gms.persistent: 2.3% user + 1% kernel / faults: 5539 minor 82 major
36% TOTAL: 26% user + 8.5% kernel + 0.1% iowait + 0.8% irq + 0.3% softirq
CPU usage from 59ms to 515ms later (2025-06-23 22:23:05.464 to 2025-06-23 22:23:05.921):
101% 1544/system_server: 43% user + 57% kernel / faults: 3136 minor 893 major
33% 1612/Signal Catcher: 21% user + 12% kernel
31% 29452/AnrAuxiliaryTas: 7.2% user + 24% kernel
7.2% 1544/system_server: 4.8% user + 2.4% kernel
4.8% 2476/InputDispatcher: 0% user + 4.8% kernel
2.4% 1618/HeapTaskDaemon: 2.4% user + 0% kernel
2.4% 1913/android.ui: 2.4% user + 0% kernel
2.4% 1915/android.display: 2.4% user + 0% kernel
2.4% 2051/batterystats-ha: 0% user + 2.4% kernel
2.4% 2477/InputReader: 2.4% user + 0% kernel
2.4% 2479/HwBinder:1544_2: 2.4% user + 0% kernel
2.4% 6305/binder:1544_20: 0% user + 2.4% kernel
2.4% 29451/AnrConsumer: 0% user + 2.4% kernel
121% 29542/com.x8bit.bitwarden: 109% user + 12% kernel / faults: 5671 minor 65 major
96% 29542/x8bit.bitwarden: 90% user + 6.2% kernel
21% 29543/Signal Catcher: 15% user + 6.2% kernel
57% 1201/surfaceflinger: 47% user + 9.5% kernel
31% 1201/surfaceflinger: 28% user + 2.3% kernel
19% 1365/RenderEngine: 11% user + 7.1% kernel
2.3% 1429/app: 0% user + 2.3% kernel
2.3% 2070/binder:1201_3: 2.3% user + 0% kernel
2.3% 2846/binder:1201_4: 2.3% user + 0% kernel
2.3% 3364/binder:1201_5: 0% user + 2.3% kernel
19% 1129/media.hwcodec: 4.7% user + 14% kernel / faults: 1 minor
16% 29326/EvtQ_c2.qti.avc: 7.1% user + 9.5% kernel
2.3% 2071/HwBinder:1129_4: 2.3% user + 0% kernel
2.3% 29328/poll_avcE_1593: 2.3% user + 0% kernel
22% 21938/com.google.android.inputmethod.latin: 19% user + 2.7% kernel / faults: 126 minor 10 major
8.3% 21938/putmethod.latin: 5.5% user + 2.7% kernel
5.5% 22055/DecoderWrapper-: 2.7% user + 2.7% kernel
5.5% 22086/RenderThread: 5.5% user + 0% kernel
9.4% 1113/vendor.qti.hardware.display.composer-service: 4.7% user + 4.7% kernel / faults: 4 minor
9.4% 1425/HwBinder:1113_2: 4.7% user + 4.7% kernel
10% 18963/io.heckel.ntfy: 10% user + 0% kernel / faults: 88 minor
5.4% 26297/OkHttp Dispatch: 5.4% user + 0% kernel
2.7% 22538/DefaultDispatch: 0% user + 2.7% kernel
7.2% 1622/mediaserver: 2.4% user + 4.8% kernel / faults: 1 minor
2.4% 14279/binder:1622_9: 2.4% user + 0% kernel
2.4% 29316/recorder_looper: 0% user + 2.4% kernel
2.4% 29324/codec_looper: 2.4% user + 0% kernel
2.4% 29332/MP4WtrVidTrkThr: 0% user + 2.4% kernel
4.5% 357/crtc_commit:113: 0% user + 4.5% kernel
4.5% 393/irq/290-goodix_: 0% user + 4.5% kernel
4.7% 1170/audioserver: 2.3% user + 2.3% kernel
2.3% 2093/AudioOut_25: 2.3% user + 0% kernel
4.8% 1597/cnss_diag: 4.8% user + 0% kernel
5.8% 27611/com.google.android.googlequicksearchbox:search: 0% user + 5.8% kernel / faults: 22 minor 15 major
2.9% 27658/Lite Thread #0: 0% user + 2.9% kernel
6.1% 28893/kworker/u16:3-msm_vidc_workerq_venus: 0% user + 6.1% kernel
2.1% 11/rcu_preempt: 0% user + 2.1% kernel
2.1% 52/rcuop/6: 0% user + 2.1% kernel
2.2% 150/system: 0% user + 2.2% kernel
2.2% 313/irq/61-mmc1: 0% user + 2.2% kernel
2.2% 358/crtc_event:113: 0% user + 2.2% kernel
2.3% 1096/android.hardware.wifi@1.0-service: 2.3% user + 0% kernel / faults: 15 minor
2.3% 3318/wifi@1.0-servic: 2.3% user + 0% kernel
2.3% 1112/vendor.qti.hardware.display.allocator-service: 0% user + 2.3% kernel / faults: 26 minor
4.7% 1426/HwBinder:1112_3: 2.3% user + 2.3% kernel
2.6% 11465/com.google.android.gms.persistent: 2.6% user + 0% kernel / faults: 3 minor
2.7% 15664/com.spotify.music: 2.7% user + 0% kernel / faults: 3 minor
2.7% 17038/RxComputationTh: 2.7% user + 0% kernel
2.7% 17053/network: 0% user + 2.7% kernel
2.7% 17160/AndroidAudioDri: 2.7% user + 0% kernel
2.7% 19998/kworker/1:1-events: 0% user + 2.7% kernel
2.7% 21124/kworker/u16:4-kverityd: 0% user + 2.7% kernel
2.8% 23580/kworker/u17:2-kgsl-events: 0% user + 2.8% kernel
2.8% 23632/com.life360.android.safetymapd: 0% user + 2.8% kernel / faults: 2 minor
2.8% 25982/kworker/u16:2-ufs_clkscaling_0: 0% user + 2.8% kernel
2.9% 27002/com.instagram.android: 2.9% user + 0% kernel / faults: 59 minor
2.9% 27189/MainStackMNSEve: 2.9% user + 0% kernel
3.1% 29381/kworker/1:1H-kblockd: 0% user + 3.1% kernel
54% TOTAL: 30% user + 20% kernel + 2.2% iowait + 1.1% irq + 0.5% softirq
Completed ANR of com.x8bit.bitwarden in 2573ms, latency 1ms
Process com.google.process.gservices (pid 26472) early provider death

~~~

If, *in this state*, with `adb shell settings put global enable_freeform_support 1` pre-enabled, I close the application, then re-invoke it and convert it to "Freeform", it crashes:

~~~YAML
FATAL EXCEPTION: main
Process: com.x8bit.bitwarden, PID: 29542
java.lang.IllegalStateException: Cannot transition entry that is not in the back stack
at J2.i.g(Unknown Source:50)
at J2.v.invokeSuspend(Unknown Source:71)
at J2.v.invoke(Unknown Source:12)
at d.m.invokeSuspend(Unknown Source:66)
at yc.a.resumeWith(Unknown Source:7)
at Wc.L.run(Unknown Source:114)
at o1.Z.q0(Unknown Source:23)
at o1.Y.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8223)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:977)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [o1.H0@f300951, D0.e@ff0d5b6, v0{Cancelling}@b6ca2b7, Z@75f3a24]
~~~

I've included this because this is solely possible in this state. After re-invoking, I see:

![Image](https://github.com/user-attachments/assets/8468df02-d094-410c-9d2f-90371467b3c4)

### Screenshots or Videos

I'd capture a deterministic example, but I don't see `` [^1] in the APK.

[^1]: [`developer.android.com/studio/profile`][1]

[1]: https://developer.android.com/studio/profile#:~:text=profileable%20manifest%20configuration:-,%3Cprofileable%20android:shell=%22true%22%20/%3E,-Note:%20Use%20a

### Additional Context

This appears to be a lesser recurrence of https://github.com/bitwarden/android/issues/3207#issuecomment-2181382118.

### Build Version

`versionName=2025.5.0`

### What server are you connecting to?

US

### Environment Details

1. ~~~sh
#!/usr/bin/env sh
adb shell getprop | grep \
-e "ro.build.version.release" \
-e "ro.build.product" \
-e "ro.build.display.id"
~~~

1. > ~~~YAML
> [ro.build.version.release]: [14]
> [ro.build.product]: [FP5]
> [ro.build.display.id]: [FP5.UT2P.B.122.20250422​​]
> ~~~

### Issue Tracking Info

- [x] I understand that work is tracked outside of Github. A PR will be linked to this issue should one be opened to address it, but Bitwarden doesn't use fields like "assigned", "milestone", or "project" to track progress.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.