Clean up Gps/Flp Hardware on shut-down.
Ensures that the GPS and FLP HAL interfaces are deinitialized upon
system shut-down. This gives a chance for the underlying HAL to
close cleanly any resources it could be holding.
Note this approach only works for a device's power-off, scenarios
such as adb shell stop / start cannot be handled, because in such
cases the process is terminated sending SIGKILL to it.
Bug: 23279835
Bug: 23279593
Change-Id: I29b3306c0ae2b384d0542031080a15fdbe49dd71
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 468ead0..885c765 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -307,6 +307,7 @@
intentFilter.addAction(Intent.ACTION_USER_SWITCHED);
intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
+ intentFilter.addAction(Intent.ACTION_SHUTDOWN);
mContext.registerReceiverAsUser(new BroadcastReceiver() {
@Override
@@ -317,12 +318,36 @@
} else if (Intent.ACTION_MANAGED_PROFILE_ADDED.equals(action)
|| Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) {
updateUserProfiles(mCurrentUserId);
+ } else if (Intent.ACTION_SHUTDOWN.equals(action)) {
+ shutdownComponents();
}
}
}, UserHandle.ALL, intentFilter, null, mLocationHandler);
}
/**
+ * Provides a way for components held by the {@link LocationManagerService} to clean-up
+ * gracefully on system's shutdown.
+ *
+ * NOTES:
+ * 1) Only provides a chance to clean-up on an opt-in basis. This guarantees back-compat
+ * support for components that do not wish to handle such event.
+ */
+ private void shutdownComponents() {
+ if(D) Log.d(TAG, "Shutting down components...");
+
+ LocationProviderInterface gpsProvider = mProvidersByName.get(LocationManager.GPS_PROVIDER);
+ if (gpsProvider != null && gpsProvider.isEnabled()) {
+ gpsProvider.disable();
+ }
+
+ FlpHardwareProvider flpHardwareProvider = FlpHardwareProvider.getInstance(mContext);
+ if (FlpHardwareProvider.isSupported() && flpHardwareProvider != null) {
+ flpHardwareProvider.cleanup();
+ }
+ }
+
+ /**
* Makes a list of userids that are related to the current user. This is
* relevant when using managed profiles. Otherwise the list only contains
* the current user.
diff --git a/services/core/java/com/android/server/location/FlpHardwareProvider.java b/services/core/java/com/android/server/location/FlpHardwareProvider.java
index d4f3c4d..6d08c36 100644
--- a/services/core/java/com/android/server/location/FlpHardwareProvider.java
+++ b/services/core/java/com/android/server/location/FlpHardwareProvider.java
@@ -16,19 +16,18 @@
package com.android.server.location;
+import android.content.Context;
import android.hardware.location.GeofenceHardware;
import android.hardware.location.GeofenceHardwareImpl;
import android.hardware.location.GeofenceHardwareRequestParcelable;
import android.hardware.location.IFusedLocationHardware;
import android.hardware.location.IFusedLocationHardwareSink;
-import android.location.IFusedGeofenceHardware;
import android.location.FusedBatchOptions;
+import android.location.IFusedGeofenceHardware;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationRequest;
-
-import android.content.Context;
import android.os.Bundle;
import android.os.Looper;
import android.os.RemoteException;
@@ -301,7 +300,6 @@
private native void nativeRequestBatchedLocation(int lastNLocations);
private native void nativeFlushBatchedLocations();
private native void nativeInjectLocation(Location location);
- // TODO [Fix] sort out the lifetime of the instance
private native void nativeCleanup();
// FlpDiagnosticsInterface members
@@ -341,6 +339,11 @@
return mGeofenceHardwareService;
}
+ public void cleanup() {
+ Log.i(TAG, "Calling nativeCleanup()");
+ nativeCleanup();
+ }
+
private final IFusedLocationHardware mLocationHardware = new IFusedLocationHardware.Stub() {
@Override
public void registerSink(IFusedLocationHardwareSink eventSink) {
diff --git a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp
index 2ca5f5a..c0a0c9c 100644
--- a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp
+++ b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp
@@ -840,16 +840,6 @@
env->DeleteGlobalRef(sCallbacksObj);
sCallbacksObj = NULL;
}
-
- sFlpInterface = NULL;
- sFlpDiagnosticInterface = NULL;
- sFlpDeviceContextInterface = NULL;
- sFlpGeofencingInterface = NULL;
-
- if(sHardwareDevice != NULL) {
- sHardwareDevice->close(sHardwareDevice);
- sHardwareDevice = NULL;
- }
}
static void GetBatchedLocation(JNIEnv* env, jobject /* object */, jint lastNLocations) {