From 452d12b50af9972b4164e5a20d489e0bbd8aa417 Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Thu, 20 Mar 2025 20:11:18 +0000 Subject: Avoid calling IPC with a lock Bug: 355384257 Test: manual Flag: android.location.flags.fix_is_in_emergency_anr Change-Id: I5774b944ff682926790733d815487282eaf1450a --- .../java/android/location/flags/location.aconfig | 10 +++ .../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 @@ -198,6 +198,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" 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 -- cgit v1.2.3-59-g8ed1b