[go: nahoru, domu]

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