diff options
author | 2025-03-20 20:11:18 +0000 | |
---|---|---|
committer | 2025-03-20 21:02:00 +0000 | |
commit | 452d12b50af9972b4164e5a20d489e0bbd8aa417 (patch) | |
tree | 3e874ba614057a3c3f16ba1804a845227cb2d6a5 | |
parent | 0800ef92e35529f09badfa88a102a1fe9dfc97ca (diff) |
Avoid calling IPC with a lock
Bug: 355384257
Test: manual
Flag: android.location.flags.fix_is_in_emergency_anr
Change-Id: I5774b944ff682926790733d815487282eaf1450a
-rw-r--r-- | location/java/android/location/flags/location.aconfig | 10 | ||||
-rw-r--r-- | services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java | 81 |
2 files changed, 71 insertions, 20 deletions
diff --git a/location/java/android/location/flags/location.aconfig b/location/java/android/location/flags/location.aconfig index f26e72fa79f1..80fa6b7f9130 100644 --- a/location/java/android/location/flags/location.aconfig +++ b/location/java/android/location/flags/location.aconfig @@ -199,6 +199,16 @@ flag { } flag { + name: "fix_is_in_emergency_anr" + namespace: "location" + description: "Avoid calling IPC with a lock to avoid deadlock" + bug: "355384257" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "gnss_assistance_interface_jni" namespace: "location" description: "Flag for GNSS assistance interface JNI" diff --git a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java index 3f75b11befc2..ea4b3d426346 100644 --- a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java +++ b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java @@ -23,6 +23,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.location.flags.Flags; import android.os.SystemClock; import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; @@ -71,13 +72,25 @@ public class SystemEmergencyHelper extends EmergencyHelper { return; } - synchronized (SystemEmergencyHelper.this) { + if (Flags.fixIsInEmergencyAnr()) { try { - mIsInEmergencyCall = mTelephonyManager.isEmergencyNumber( + boolean isInEmergency = mTelephonyManager.isEmergencyNumber( intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)); + synchronized (SystemEmergencyHelper.this) { + mIsInEmergencyCall = isInEmergency; + } } catch (IllegalStateException | UnsupportedOperationException e) { Log.w(TAG, "Failed to call TelephonyManager.isEmergencyNumber().", e); } + } else { + synchronized (SystemEmergencyHelper.this) { + try { + mIsInEmergencyCall = mTelephonyManager.isEmergencyNumber( + intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)); + } catch (IllegalStateException | UnsupportedOperationException e) { + Log.w(TAG, "Failed to call TelephonyManager.isEmergencyNumber().", e); + } + } } dispatchEmergencyStateChanged(); @@ -98,27 +111,55 @@ public class SystemEmergencyHelper extends EmergencyHelper { } @Override - public synchronized boolean isInEmergency(long extensionTimeMs) { - if (mTelephonyManager == null) { - return false; - } + public boolean isInEmergency(long extensionTimeMs) { + if (Flags.fixIsInEmergencyAnr()) { + if (mTelephonyManager == null) { + return false; + } + boolean emergencyCallbackMode = false; + boolean emergencySmsMode = false; + PackageManager pm = mContext.getPackageManager(); + if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) { + emergencyCallbackMode = mTelephonyManager.getEmergencyCallbackMode(); + } + if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_MESSAGING)) { + emergencySmsMode = mTelephonyManager.isInEmergencySmsMode(); + } + boolean isInExtensionTime; + synchronized (this) { + isInExtensionTime = mEmergencyCallEndRealtimeMs != Long.MIN_VALUE + && (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) + < extensionTimeMs; + return mIsInEmergencyCall + || isInExtensionTime + || emergencyCallbackMode + || emergencySmsMode; + } + } else { + synchronized (this) { + if (mTelephonyManager == null) { + return false; + } - boolean isInExtensionTime = mEmergencyCallEndRealtimeMs != Long.MIN_VALUE - && (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) < extensionTimeMs; + boolean isInExtensionTime = mEmergencyCallEndRealtimeMs != Long.MIN_VALUE + && (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) + < extensionTimeMs; - boolean emergencyCallbackMode = false; - boolean emergencySmsMode = false; - PackageManager pm = mContext.getPackageManager(); - if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) { - emergencyCallbackMode = mTelephonyManager.getEmergencyCallbackMode(); - } - if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_MESSAGING)) { - emergencySmsMode = mTelephonyManager.isInEmergencySmsMode(); + boolean emergencyCallbackMode = false; + boolean emergencySmsMode = false; + PackageManager pm = mContext.getPackageManager(); + if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) { + emergencyCallbackMode = mTelephonyManager.getEmergencyCallbackMode(); + } + if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_MESSAGING)) { + emergencySmsMode = mTelephonyManager.isInEmergencySmsMode(); + } + return mIsInEmergencyCall + || isInExtensionTime + || emergencyCallbackMode + || emergencySmsMode; + } } - return mIsInEmergencyCall - || isInExtensionTime - || emergencyCallbackMode - || emergencySmsMode; } private class EmergencyCallTelephonyCallback extends TelephonyCallback implements |