Fix monkey crash by guarding singleton initializing

Fixes: 35203476
Test: Run monkey test and observe no crash happens.
      adb shell monkey -p com.google.android.launcher -p com.android.settings
           -c android.intent.category.LAUNCHER --ignore-security-exceptions
	   --monitor-native-crashes -s 454 -v -v -v 125000
Change-Id: Ib13afcc4e14470510f3ccbb20d7e7d6009347149
This commit is contained in:
Tadashi G. Takaoka
2017-02-10 16:58:45 +09:00
parent ac3b32932a
commit 23372e8994

View File

@@ -129,7 +129,7 @@ public final class DynamicIndexableContentMonitor implements
mContext = context; mContext = context;
mIndex = index; mIndex = index;
PACKAGE_CHANGE_MONITOR.register(context); PACKAGE_CHANGE_MONITOR.registerMonitor(context);
mHasFeaturePrinting = context.getPackageManager() mHasFeaturePrinting = context.getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_PRINTING); .hasSystemFeature(PackageManager.FEATURE_PRINTING);
if (mHasFeaturePrinting) { if (mHasFeaturePrinting) {
@@ -154,7 +154,7 @@ public final class DynamicIndexableContentMonitor implements
public void unregister(Activity activity, int loaderId) { public void unregister(Activity activity, int loaderId) {
if (mIndex == null) return; if (mIndex == null) return;
PACKAGE_CHANGE_MONITOR.unregister(); PACKAGE_CHANGE_MONITOR.unregisterMonitor();
if (mHasFeaturePrinting) { if (mHasFeaturePrinting) {
activity.getLoaderManager().destroyLoader(loaderId); activity.getLoaderManager().destroyLoader(loaderId);
} }
@@ -240,15 +240,31 @@ public final class DynamicIndexableContentMonitor implements
private static class PackageChangeMonitor extends PackageMonitor { private static class PackageChangeMonitor extends PackageMonitor {
private static final String TAG = PackageChangeMonitor.class.getSimpleName(); private static final String TAG = PackageChangeMonitor.class.getSimpleName();
// Null if not initialized. // Null if not initialized. Guarded by {@link #mLock}.
@Nullable private PackageManager mPackageManager; @Nullable private PackageManager mPackageManager;
private final Object mLock = new Object();
public void register(Context context) { public void registerMonitor(Context context) {
mPackageManager = context.getPackageManager(); synchronized (mLock) {
if (mPackageManager != null) {
return;
}
mPackageManager = context.getPackageManager();
// Start tracking packages. Use background thread for monitoring. Note that no need to // Start tracking packages. Use background thread for monitoring. Note that no need
// unregister this monitor. This should be alive while Settings app is running. // to unregister this monitor. This should be alive while Settings app is running.
register(context, null /* thread */, UserHandle.CURRENT, false); super.register(context, null /* thread */, UserHandle.CURRENT, false);
}
}
public void unregisterMonitor() {
synchronized (mLock) {
if (mPackageManager == null) {
return;
}
super.unregister();
mPackageManager = null;
}
} }
// Covers installed, appeared external storage with the package, upgraded. // Covers installed, appeared external storage with the package, upgraded.