Handle Gnss Hal service death gracefully

Bug: 37460011
Fixes: 37460011
Test: adb shell
ps -A | grep 'gnss@1.0' | awk '{print $2}' | xargs kill

Change-Id: I6ff675fc198ab709d50637367f0b4648b55b021f
This commit is contained in:
Yu-Han Yang
2018-04-25 00:51:22 -07:00
parent 04489c6320
commit 5205762e45
2 changed files with 41 additions and 5 deletions

View File

@@ -1887,9 +1887,26 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
GPS_CAPABILITY_MEASUREMENTS));
mGnssNavigationMessageProvider.onCapabilitiesUpdated(hasCapability(
GPS_CAPABILITY_NAV_MESSAGES));
restartRequests();
}
});
}
}
private void restartRequests() {
Log.i(TAG, "restartRequests");
restartLocationRequest();
mGnssMeasurementsProvider.resumeIfStarted();
mGnssNavigationMessageProvider.resumeIfStarted();
mGnssBatchingProvider.resumeIfStarted();
mGnssGeofenceProvider.resumeIfStarted();
}
private void restartLocationRequest() {
if (DEBUG) Log.d(TAG, "restartLocationRequest");
mStarted = false;
updateRequirements();
}
/**
* Called from native code to inform us the hardware year.
@@ -1909,6 +1926,23 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
mHardwareModelName = modelName;
}
/**
* Called from native code to inform us GNSS HAL service died.
*/
private void reportGnssServiceDied() {
if (DEBUG) Log.d(TAG, "reportGnssServiceDied");
mHandler.post(() -> {
class_init_native();
native_init_once();
if (isEnabled()) {
// re-calls native_init() and other setup.
handleEnable();
// resend configuration into the restarted HAL service.
reloadGpsProperties(mContext, mProperties);
}
});
}
public interface GnssSystemInfoProvider {
/**
* Returns the year of underlying GPS hardware.

View File

@@ -64,6 +64,7 @@ static jmethodID method_reportGeofenceResumeStatus;
static jmethodID method_reportMeasurementData;
static jmethodID method_reportNavigationMessages;
static jmethodID method_reportLocationBatch;
static jmethodID method_reportGnssServiceDied;
/*
* Save a pointer to JavaVm to attach/detach threads executing
@@ -120,10 +121,10 @@ struct GnssDeathRecipient : virtual public hidl_death_recipient
{
// hidl_death_recipient interface
virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) override {
// TODO(b/37460011): implement a better death recovery mechanism without
// crashing system server process as described in go//treble-gnss-death
LOG_ALWAYS_FATAL("Abort due to IGNSS hidl service failure,"
" restarting system server");
ALOGE("IGNSS hidl service failed, trying to recover...");
JNIEnv* env = android::AndroidRuntime::getJNIEnv();
env->CallVoidMethod(mCallbacksObj, method_reportGnssServiceDied);
}
};
@@ -1177,6 +1178,7 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
clazz,
"reportLocationBatch",
"([Landroid/location/Location;)V");
method_reportGnssServiceDied = env->GetMethodID(clazz, "reportGnssServiceDied", "()V");
/*
* Save a pointer to JVM.