[ActivityManager] Prevent application holding AMS lock
Symptom: Watchdog timeout. Reproduce code: String action = "lets.deadlock"; Uri baseUri = Uri.parse("content://i.am.bad"); Uri uri = ContentUris.withAppendedId(baseUri, 1); Intent intent = new Intent(action, uri); sendStickyBroadcast(intent); IntentFilter filter = new IntentFilter(action); filter.addDataScheme(baseUri.getScheme()); filter.addDataAuthority(baseUri.getAuthority(), null); filter.addDataPath(uri.getPath(), 0); registerReceiver(null, filter); In target provider's getType: Invoke AMS function will result deadlock. Or sleep a long time will also trigger watchdog timeout. Root Cause: If broadcast is sticky with content scheme intent. Register receiver will trigger access provider when matching intent with IntentFilter, and it executes in ActivityManagerService's lock. Solution: Obtain necessary data to local to split lock block. Change-Id: I0fb94472cdc478997e40ba2a60a988c5f53badb2
Loading
Please register or sign in to comment