Defer initialization when `applicationContext` is `null`.
* When `applicationContext` is `null`, `InitializationProvider` does nothing.
* This is because most initializers expect applicationContext to be non-null.
Test: N/A
Fixes: b/197251887
Change-Id: Ib48ca3a7d106d7b77b5cad0af24569501b85f267
diff --git a/startup/startup-runtime/src/main/java/androidx/startup/AppInitializer.java b/startup/startup-runtime/src/main/java/androidx/startup/AppInitializer.java
index eda1040..1d23647 100644
--- a/startup/startup-runtime/src/main/java/androidx/startup/AppInitializer.java
+++ b/startup/startup-runtime/src/main/java/androidx/startup/AppInitializer.java
@@ -69,10 +69,7 @@
* @param context The application context
*/
AppInitializer(@NonNull Context context) {
- // We cannot always rely on getApplicationContext()
- // More context: b/196959015
- Context applicationContext = context.getApplicationContext();
- mContext = applicationContext == null ? context : applicationContext;
+ mContext = context.getApplicationContext();
mDiscovered = new HashSet<>();
mInitialized = new HashMap<>();
}
diff --git a/startup/startup-runtime/src/main/java/androidx/startup/InitializationProvider.java b/startup/startup-runtime/src/main/java/androidx/startup/InitializationProvider.java
index a14ce54..764e278 100644
--- a/startup/startup-runtime/src/main/java/androidx/startup/InitializationProvider.java
+++ b/startup/startup-runtime/src/main/java/androidx/startup/InitializationProvider.java
@@ -31,11 +31,21 @@
* initializes them before {@link Application#onCreate()}.
*/
public class InitializationProvider extends ContentProvider {
+
@Override
public final boolean onCreate() {
Context context = getContext();
if (context != null) {
- AppInitializer.getInstance(context).discoverAndInitialize();
+ // Many Initializer's expect the `applicationContext` to be non-null. This
+ // typically happens when `android:sharedUid` is used. In such cases, we postpone
+ // initialization altogether, and rely on lazy init.
+ // More context: b/196959015
+ Context applicationContext = context.getApplicationContext();
+ if (applicationContext != null) {
+ AppInitializer.getInstance(context).discoverAndInitialize();
+ } else {
+ StartupLogger.w("Deferring initialization because `applicationContext` is null.");
+ }
} else {
throw new StartupException("Context cannot be null");
}
diff --git a/startup/startup-runtime/src/main/java/androidx/startup/StartupLogger.java b/startup/startup-runtime/src/main/java/androidx/startup/StartupLogger.java
index a2465b4..8034b2a 100644
--- a/startup/startup-runtime/src/main/java/androidx/startup/StartupLogger.java
+++ b/startup/startup-runtime/src/main/java/androidx/startup/StartupLogger.java
@@ -53,6 +53,15 @@
}
/**
+ * Warning level logging.
+ *
+ * @param message The message being logged
+ */
+ public static void w(@NonNull String message) {
+ Log.w(TAG, message);
+ }
+
+ /**
* Error level logging
*
* @param message The message being logged