Merge pull request #6191 from robolectric/piper_351888459

Add opt-in lazy loading of application+instrumentation in Robolectric
diff --git a/annotations/src/main/java/org/robolectric/annotation/LazyLoadApplication.java b/annotations/src/main/java/org/robolectric/annotation/LazyLoadApplication.java
new file mode 100644
index 0000000..ba72fc9
--- /dev/null
+++ b/annotations/src/main/java/org/robolectric/annotation/LazyLoadApplication.java
@@ -0,0 +1,28 @@
+package org.robolectric.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * A {@link org.robolectric.pluginapi.config.Configurer} annotation that dictates whether or not
+ * Robolectric should lazily instantiate the Application under test (as well as the test
+ * Instrumentation).
+ *
+ * <p>In particular, any test with {@link LazyLoad.ON} that does not need either of the Application
+ * or the Instrumentation will load neither (and recoup the associated cost)
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.PACKAGE, ElementType.TYPE, ElementType.METHOD})
+public @interface LazyLoadApplication {
+
+  /** Whether or not the Application should be lazily loaded */
+  LazyLoad value();
+
+  /** Whether or not the Application should be lazily loaded */
+  enum LazyLoad {
+    ON,
+    OFF,
+  }
+}
diff --git a/robolectric/src/main/java/org/robolectric/DefaultTestLifecycle.java b/robolectric/src/main/java/org/robolectric/DefaultTestLifecycle.java
index 7602d54..2e002eb 100644
--- a/robolectric/src/main/java/org/robolectric/DefaultTestLifecycle.java
+++ b/robolectric/src/main/java/org/robolectric/DefaultTestLifecycle.java
@@ -2,6 +2,13 @@
 
 import java.lang.reflect.Method;
 
+/**
+ * The default {@link TestLifecycle} used by Robolectric.
+ *
+ * <p>Owing to tradeoffs, this class is not guaranteed to work with {@link
+ * org.robolectric.annotation.LazyLoadApplication} enabled on tests where the application is
+ * inferred from the apk (instead of explicitly specified in AndroidManifest.xml).
+ */
 public class DefaultTestLifecycle implements TestLifecycle {
 
   /**
@@ -10,14 +17,14 @@
    * @param method the test method about to be run
    */
   @Override public void beforeTest(final Method method) {
-    if (RuntimeEnvironment.application instanceof TestLifecycleApplication) {
-      ((TestLifecycleApplication) RuntimeEnvironment.application).beforeTest(method);
+    if (isTestLifecycleApplicationClass(RuntimeEnvironment.getConfiguredApplicationClass())) {
+      ((TestLifecycleApplication) RuntimeEnvironment.getApplication()).beforeTest(method);
     }
   }
 
   @Override public void prepareTest(final Object test) {
-    if (RuntimeEnvironment.application instanceof TestLifecycleApplication) {
-      ((TestLifecycleApplication) RuntimeEnvironment.application).prepareTest(test);
+    if (isTestLifecycleApplicationClass(RuntimeEnvironment.getConfiguredApplicationClass())) {
+      ((TestLifecycleApplication) RuntimeEnvironment.getApplication()).prepareTest(test);
     }
   }
 
@@ -27,8 +34,13 @@
    * @param method the test method that just ran.
    */
   @Override public void afterTest(final Method method) {
-    if (RuntimeEnvironment.application instanceof TestLifecycleApplication) {
-      ((TestLifecycleApplication) RuntimeEnvironment.application).afterTest(method);
+    if (isTestLifecycleApplicationClass(RuntimeEnvironment.getConfiguredApplicationClass())) {
+      ((TestLifecycleApplication) RuntimeEnvironment.getApplication()).afterTest(method);
     }
   }
+
+  private boolean isTestLifecycleApplicationClass(Class<?> applicationClass) {
+    return applicationClass != null
+        && TestLifecycleApplication.class.isAssignableFrom(applicationClass);
+  }
 }
diff --git a/robolectric/src/main/java/org/robolectric/Robolectric.java b/robolectric/src/main/java/org/robolectric/Robolectric.java
index 431e459..3f99f77 100644
--- a/robolectric/src/main/java/org/robolectric/Robolectric.java
+++ b/robolectric/src/main/java/org/robolectric/Robolectric.java
@@ -277,11 +277,12 @@
   public static org.robolectric.android.AttributeSetBuilder buildAttributeSet() {
     if (useLegacy()) {
       return new AttributeSetBuilderImpl(
-          new LegacyResourceResolver(RuntimeEnvironment.application,
+          new LegacyResourceResolver(
+              RuntimeEnvironment.getApplication(),
               RuntimeEnvironment.getCompileTimeResourceTable())) {};
     } else {
       return new AttributeSetBuilderImpl(
-          new ArscResourceResolver(RuntimeEnvironment.application)) {};
+          new ArscResourceResolver(RuntimeEnvironment.getApplication())) {};
     }
   }
 
diff --git a/robolectric/src/main/java/org/robolectric/android/internal/AndroidTestEnvironment.java b/robolectric/src/main/java/org/robolectric/android/internal/AndroidTestEnvironment.java
index dcb5453..e9e0d40 100755
--- a/robolectric/src/main/java/org/robolectric/android/internal/AndroidTestEnvironment.java
+++ b/robolectric/src/main/java/org/robolectric/android/internal/AndroidTestEnvironment.java
@@ -27,6 +27,8 @@
 import android.os.Looper;
 import android.provider.FontsContract;
 import android.util.DisplayMetrics;
+import androidx.test.platform.app.InstrumentationProvider;
+import androidx.test.platform.app.InstrumentationRegistry;
 import com.google.common.annotations.VisibleForTesting;
 import java.lang.reflect.Method;
 import java.nio.file.FileSystem;
@@ -41,6 +43,7 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.Bootstrap;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LazyLoadApplication.LazyLoad;
 import org.robolectric.annotation.LooperMode;
 import org.robolectric.config.ConfigurationRegistry;
 import org.robolectric.internal.ResourcesMode;
@@ -167,7 +170,23 @@
 
     preloadClasses(apiLevel);
 
-    installAndCreateApplication(appManifest, config, androidConfiguration, displayMetrics);
+    if (configuration.get(LazyLoad.class) == LazyLoad.ON) {
+      RuntimeEnvironment.setConfiguredApplicationClass(
+          getApplicationClass(appManifest, config, new ApplicationInfo()));
+
+      InstrumentationProvider provider =
+          new InstrumentationProvider() {
+            @Override
+            public Instrumentation provide() {
+              return installAndCreateApplication(
+                  appManifest, config, androidConfiguration, displayMetrics);
+            }
+          };
+
+      InstrumentationRegistry.registerInstrumentationProvider(provider, new Bundle());
+    } else { // LoadingMode.EAGER
+      installAndCreateApplication(appManifest, config, androidConfiguration, displayMetrics);
+    }
   }
 
   // If certain Android classes are required to be loaded in a particular order, do so here.
@@ -185,9 +204,11 @@
     }
   }
 
-  private void installAndCreateApplication(AndroidManifest appManifest, Config config,
-      android.content.res.Configuration androidConfiguration, DisplayMetrics displayMetrics) {
-
+  private Instrumentation installAndCreateApplication(
+      AndroidManifest appManifest,
+      Config config,
+      android.content.res.Configuration androidConfiguration,
+      DisplayMetrics displayMetrics) {
     final ActivityThread activityThread = ReflectionHelpers.newInstance(ActivityThread.class);
     RuntimeEnvironment.setActivityThread(activityThread);
     final _ActivityThread_ _activityThread_ = reflector(_ActivityThread_.class, activityThread);
@@ -233,6 +254,8 @@
     systemResources.updateConfiguration(androidConfiguration, displayMetrics);
 
     Application application = createApplication(appManifest, config, applicationInfo);
+    RuntimeEnvironment.setConfiguredApplicationClass(application.getClass());
+
     RuntimeEnvironment.application = application;
 
     Instrumentation instrumentation =
@@ -294,6 +317,8 @@
       PerfStatsCollector.getInstance()
           .measure("application onCreate()", () -> application.onCreate());
     }
+
+    return instrumentation;
   }
 
   private Package loadAppPackage(Config config, AndroidManifest appManifest) {
@@ -395,41 +420,27 @@
   @VisibleForTesting
   static Application createApplication(AndroidManifest appManifest, Config config,
       ApplicationInfo applicationInfo) {
-    Application application = null;
+    return ReflectionHelpers.callConstructor(
+        getApplicationClass(appManifest, config, applicationInfo));
+  }
+
+  private static Class<? extends Application> getApplicationClass(
+      AndroidManifest appManifest, Config config, ApplicationInfo applicationInfo) {
+    Class<? extends Application> applicationClass = null;
     if (config != null && !Config.Builder.isDefaultApplication(config.application())) {
       if (config.application().getCanonicalName() != null) {
-        Class<? extends Application> applicationClass;
         try {
           applicationClass = ClassNameResolver.resolve(null, config.application().getName());
         } catch (ClassNotFoundException e) {
           throw new RuntimeException(e);
         }
-        application = ReflectionHelpers.callConstructor(applicationClass);
       }
     } else if (appManifest != null && appManifest.getApplicationName() != null) {
-      Class<? extends Application> applicationClass = null;
       try {
-        applicationClass = ClassNameResolver.resolve(appManifest.getPackageName(),
-            getTestApplicationName(appManifest.getApplicationName()));
-      } catch (ClassNotFoundException e) {
-        // no problem
-      }
-
-      if (applicationClass == null) {
-        try {
-          applicationClass = ClassNameResolver.resolve(appManifest.getPackageName(),
-              appManifest.getApplicationName());
-        } catch (ClassNotFoundException e) {
-          throw new RuntimeException(e);
-        }
-      }
-
-      application = ReflectionHelpers.callConstructor(applicationClass);
-    } else if (applicationInfo.className != null) {
-      Class<? extends Application> applicationClass = null;
-      try {
-        applicationClass = (Class<? extends Application>) Class.forName(
-            getTestApplicationName(applicationInfo.className));
+        applicationClass =
+            ClassNameResolver.resolve(
+                appManifest.getPackageName(),
+                getTestApplicationName(appManifest.getApplicationName()));
       } catch (ClassNotFoundException e) {
         // no problem
       }
@@ -437,18 +448,36 @@
       if (applicationClass == null) {
         try {
           applicationClass =
-              (Class<? extends Application>) Class.forName(applicationInfo.className);
+              ClassNameResolver.resolve(
+                  appManifest.getPackageName(), appManifest.getApplicationName());
         } catch (ClassNotFoundException e) {
           throw new RuntimeException(e);
         }
       }
-
-      application = ReflectionHelpers.callConstructor(applicationClass);
     } else {
-      application = new Application();
+      if (applicationInfo.className != null) {
+        try {
+          applicationClass =
+              (Class<? extends Application>)
+                  Class.forName(getTestApplicationName(applicationInfo.className));
+        } catch (ClassNotFoundException e) {
+          // no problem
+        }
+
+        if (applicationClass == null) {
+          try {
+            applicationClass =
+                (Class<? extends Application>) Class.forName(applicationInfo.className);
+          } catch (ClassNotFoundException e) {
+            throw new RuntimeException(e);
+          }
+        }
+      } else {
+        applicationClass = Application.class;
+      }
     }
 
-    return application;
+    return applicationClass;
   }
 
   @VisibleForTesting
diff --git a/robolectric/src/main/java/org/robolectric/plugins/LazyLoadingConfigurer.java b/robolectric/src/main/java/org/robolectric/plugins/LazyLoadingConfigurer.java
new file mode 100644
index 0000000..1fca3c7
--- /dev/null
+++ b/robolectric/src/main/java/org/robolectric/plugins/LazyLoadingConfigurer.java
@@ -0,0 +1,67 @@
+package org.robolectric.plugins;
+
+import com.google.auto.service.AutoService;
+import java.lang.reflect.Method;
+import javax.annotation.Nonnull;
+import org.robolectric.annotation.LazyLoadApplication;
+import org.robolectric.annotation.LazyLoadApplication.LazyLoad;
+import org.robolectric.pluginapi.config.Configurer;
+
+/**
+ * A {@link org.robolectric.pluginapi.config.Configurer} that reads the {@link LazyLoadApplication}
+ * to dictate whether Robolectric should lazily instantiate the Application under test (as well as
+ * the test Instrumentation).
+ */
+@AutoService(Configurer.class)
+public class LazyLoadingConfigurer implements Configurer<LazyLoad> {
+
+  @Override
+  public Class<LazyLoad> getConfigClass() {
+    return LazyLoad.class;
+  }
+
+  @Nonnull
+  @Override
+  public LazyLoad defaultConfig() {
+    return LazyLoad.OFF;
+  }
+
+  @Nonnull
+  @Override
+  public LazyLoad getConfigFor(@Nonnull String packageName) {
+    try {
+      Package pkg = Class.forName(packageName + ".package-info").getPackage();
+      if (pkg.isAnnotationPresent(LazyLoadApplication.class)) {
+        return pkg.getAnnotation(LazyLoadApplication.class).value();
+      }
+    } catch (ClassNotFoundException e) {
+      // ignore
+    }
+    return defaultConfig();
+  }
+
+  @Override
+  public LazyLoad getConfigFor(@Nonnull Class<?> testClass) {
+    if (testClass.isAnnotationPresent(LazyLoadApplication.class)) {
+      return testClass.getAnnotation(LazyLoadApplication.class).value();
+    } else {
+      return defaultConfig();
+    }
+  }
+
+  @Override
+  public LazyLoad getConfigFor(@Nonnull Method method) {
+    if (method.isAnnotationPresent(LazyLoadApplication.class)) {
+      return method.getAnnotation(LazyLoadApplication.class).value();
+    } else {
+      return defaultConfig();
+    }
+  }
+
+  /** "Merges" two configurations together. Child configuration always overrides the parent */
+  @Nonnull
+  @Override
+  public LazyLoad merge(@Nonnull LazyLoad parentConfig, @Nonnull LazyLoad childConfig) {
+    return childConfig;
+  }
+}
diff --git a/robolectric/src/test/java/org/robolectric/android/DrawableResourceLoaderTest.java b/robolectric/src/test/java/org/robolectric/android/DrawableResourceLoaderTest.java
index ccc13bb..87ddb07 100644
--- a/robolectric/src/test/java/org/robolectric/android/DrawableResourceLoaderTest.java
+++ b/robolectric/src/test/java/org/robolectric/android/DrawableResourceLoaderTest.java
@@ -6,7 +6,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assume.assumeTrue;
-import static org.robolectric.RuntimeEnvironment.application;
 import static org.robolectric.shadows.ShadowAssetManager.useLegacy;
 
 import android.animation.Animator;
@@ -23,6 +22,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.R;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 @RunWith(AndroidJUnit4.class)
@@ -94,7 +94,8 @@
 
   @Test
   public void shouldCreateAnimators() throws Exception {
-    Animator animator = AnimatorInflater.loadAnimator(application, R.animator.spinning);
+    Animator animator =
+        AnimatorInflater.loadAnimator(RuntimeEnvironment.getApplication(), R.animator.spinning);
     assertThat(animator).isInstanceOf((Class<? extends Animator>) Animator.class);
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/plugins/LazyLoadingConfigurerTest.java b/robolectric/src/test/java/org/robolectric/plugins/LazyLoadingConfigurerTest.java
new file mode 100644
index 0000000..0cfbb37
--- /dev/null
+++ b/robolectric/src/test/java/org/robolectric/plugins/LazyLoadingConfigurerTest.java
@@ -0,0 +1,22 @@
+package org.robolectric.plugins;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.robolectric.annotation.LazyLoadApplication.LazyLoad.OFF;
+import static org.robolectric.annotation.LazyLoadApplication.LazyLoad.ON;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit test for {@link LazyLoadingConfigurer} */
+@RunWith(JUnit4.class)
+public class LazyLoadingConfigurerTest {
+
+  private LazyLoadingConfigurer configurer = new LazyLoadingConfigurer();
+
+  @Test
+  public void merge_explicitChildConfigOverridesParent() {
+    assertThat(configurer.merge(ON, OFF)).isEqualTo(OFF);
+    assertThat(configurer.merge(OFF, ON)).isEqualTo(ON);
+  }
+}
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityTest.java
index e6657b2..8dfce7f 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityTest.java
@@ -20,7 +20,7 @@
 import static org.junit.Assert.fail;
 import static org.robolectric.Robolectric.buildActivity;
 import static org.robolectric.Robolectric.setupActivity;
-import static org.robolectric.RuntimeEnvironment.application;
+import static org.robolectric.RuntimeEnvironment.getApplication;
 import static org.robolectric.RuntimeEnvironment.systemContext;
 import static org.robolectric.Shadows.shadowOf;
 import static org.robolectric.annotation.LooperMode.Mode.LEGACY;
@@ -546,9 +546,9 @@
   }
 
   @Test public void setContentView_shouldReplaceOldContentView() throws Exception {
-    View view1 = new View(application);
+    View view1 = new View(getApplication());
     view1.setId(R.id.burritos);
-    View view2 = new View(application);
+    View view2 = new View(getApplication());
     view2.setId(R.id.button);
 
     Activity activity = buildActivity(Activity.class).create().get();
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowAlertDialogTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowAlertDialogTest.java
index d5b45f1..eada085 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowAlertDialogTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowAlertDialogTest.java
@@ -7,7 +7,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.robolectric.RuntimeEnvironment.application;
+import static org.robolectric.RuntimeEnvironment.getApplication;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.app.Activity;
@@ -43,7 +43,7 @@
 
   @Test
   public void testBuilder() throws Exception {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
     builder.setTitle("title").setMessage("message");
     builder.setCancelable(true);
     AlertDialog alert = builder.create();
@@ -62,9 +62,10 @@
 
   @Test
   public void nullTitleAndMessageAreOkay() throws Exception {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application) //
-        .setTitle(null) //
-        .setMessage(null);
+    AlertDialog.Builder builder =
+        new AlertDialog.Builder(getApplication()) //
+            .setTitle(null) //
+            .setMessage(null);
     ShadowAlertDialog shadowAlertDialog = shadowOf(builder.create());
     assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo("");
     assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo("");
@@ -74,13 +75,13 @@
   public void getLatestAlertDialog_shouldReturnARealAlertDialog() throws Exception {
     assertThat(ShadowAlertDialog.getLatestAlertDialog()).isNull();
 
-    AlertDialog dialog = new AlertDialog.Builder(application).show();
+    AlertDialog dialog = new AlertDialog.Builder(getApplication()).show();
     assertThat(ShadowAlertDialog.getLatestAlertDialog()).isSameInstanceAs(dialog);
   }
 
   @Test
   public void shouldOnlyCreateRequestedButtons() throws Exception {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
     builder.setPositiveButton("OK", null);
     AlertDialog dialog = builder.create();
     dialog.show();
@@ -91,7 +92,7 @@
 
   @Test
   public void shouldAllowNullButtonListeners() throws Exception {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
     builder.setPositiveButton("OK", null);
     AlertDialog dialog = builder.create();
     dialog.show();
@@ -100,7 +101,7 @@
 
   @Test
   public void testSetMessageAfterCreation() {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
     builder.setTitle("title").setMessage("message");
     AlertDialog alert = builder.create();
 
@@ -116,7 +117,7 @@
 
   @Test
   public void shouldSetMessageFromResourceId() throws Exception {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
     builder.setTitle("title").setMessage(R.string.hello);
 
     AlertDialog alert = builder.create();
@@ -126,8 +127,8 @@
 
   @Test
   public void shouldSetView() throws Exception {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
-    EditText view = new EditText(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
+    EditText view = new EditText(getApplication());
     builder.setView(view);
 
     AlertDialog alert = builder.create();
@@ -137,7 +138,7 @@
   @Test
   @Config(minSdk = LOLLIPOP)
   public void shouldSetView_withLayoutId() throws Exception {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
     builder.setView(R.layout.custom_layout);
 
     AlertDialog alert = builder.create();
@@ -147,8 +148,8 @@
 
   @Test
   public void shouldSetCustomTitleView() throws Exception {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
-    View view = new View(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
+    View view = new View(getApplication());
     assertThat(builder.setCustomTitle(view)).isSameInstanceAs(builder);
 
     AlertDialog alert = builder.create();
@@ -157,8 +158,8 @@
 
   @Test
   public void clickingPositiveButtonDismissesDialog() throws Exception {
-    AlertDialog alertDialog = new AlertDialog.Builder(application)
-        .setPositiveButton("Positive", null).create();
+    AlertDialog alertDialog =
+        new AlertDialog.Builder(getApplication()).setPositiveButton("Positive", null).create();
     alertDialog.show();
 
     assertTrue(alertDialog.isShowing());
@@ -168,12 +169,15 @@
 
   @Test
   public void clickingNeutralButtonDismissesDialog() throws Exception {
-    AlertDialog alertDialog = new AlertDialog.Builder(application)
-        .setNeutralButton("Neutral", new DialogInterface.OnClickListener() {
-          @Override
-          public void onClick(DialogInterface dialog, int which) {
-          }
-        }).create();
+    AlertDialog alertDialog =
+        new AlertDialog.Builder(getApplication())
+            .setNeutralButton(
+                "Neutral",
+                new DialogInterface.OnClickListener() {
+                  @Override
+                  public void onClick(DialogInterface dialog, int which) {}
+                })
+            .create();
     alertDialog.show();
 
     assertTrue(alertDialog.isShowing());
@@ -183,12 +187,15 @@
 
   @Test
   public void clickingNegativeButtonDismissesDialog() throws Exception {
-    AlertDialog alertDialog = new AlertDialog.Builder(application)
-        .setNegativeButton("Negative", new DialogInterface.OnClickListener() {
-          @Override
-          public void onClick(DialogInterface dialog, int which) {
-          }
-        }).create();
+    AlertDialog alertDialog =
+        new AlertDialog.Builder(getApplication())
+            .setNegativeButton(
+                "Negative",
+                new DialogInterface.OnClickListener() {
+                  @Override
+                  public void onClick(DialogInterface dialog, int which) {}
+                })
+            .create();
     alertDialog.show();
 
     assertTrue(alertDialog.isShowing());
@@ -224,7 +231,7 @@
     list.add(77);
     ArrayAdapter<Integer> adapter = new ArrayAdapter<>(context, R.layout.main, R.id.title, list);
 
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
     builder.setSingleChoiceItems(adapter, -1, new DialogInterface.OnClickListener() {
       @Override
       public void onClick(DialogInterface dialog, int item) {
@@ -317,7 +324,7 @@
 
   @Test
   public void alertControllerShouldStoreCorrectIconIdFromBuilder() {
-    AlertDialog.Builder builder = new AlertDialog.Builder(application);
+    AlertDialog.Builder builder = new AlertDialog.Builder(getApplication());
     builder.setIcon(R.drawable.an_image);
 
     AlertDialog alertDialog = builder.create();
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowApplicationTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowApplicationTest.java
index 5ea048c..97d3761 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowApplicationTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowApplicationTest.java
@@ -865,7 +865,7 @@
     pw.showAtLocation(new LinearLayout(context), Gravity.CENTER, 0, 0);
 
     PopupWindow latestPopupWindow =
-        Shadows.shadowOf(RuntimeEnvironment.application).getLatestPopupWindow();
+        Shadows.shadowOf(RuntimeEnvironment.getApplication()).getLatestPopupWindow();
     assertThat(latestPopupWindow).isSameInstanceAs(pw);
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothAdapterTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothAdapterTest.java
index 032a8ec..11e97c9 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothAdapterTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothAdapterTest.java
@@ -302,7 +302,7 @@
 
     boolean result =
         bluetoothAdapter.getProfileProxy(
-            RuntimeEnvironment.application, mockServiceListener, MOCK_PROFILE1);
+            RuntimeEnvironment.getApplication(), mockServiceListener, MOCK_PROFILE1);
 
     assertThat(result).isTrue();
     verify(mockServiceListener).onServiceConnected(MOCK_PROFILE1, mockProxy);
@@ -316,7 +316,7 @@
 
     boolean result =
         bluetoothAdapter.getProfileProxy(
-            RuntimeEnvironment.application, mockServiceListener, MOCK_PROFILE1);
+            RuntimeEnvironment.getApplication(), mockServiceListener, MOCK_PROFILE1);
 
     assertThat(result).isFalse();
     verifyZeroInteractions(mockServiceListener);
@@ -333,10 +333,10 @@
 
     boolean result1 =
         bluetoothAdapter.getProfileProxy(
-            RuntimeEnvironment.application, mockServiceListener, MOCK_PROFILE1);
+            RuntimeEnvironment.getApplication(), mockServiceListener, MOCK_PROFILE1);
     boolean result2 =
         bluetoothAdapter.getProfileProxy(
-            RuntimeEnvironment.application, mockServiceListener, MOCK_PROFILE2);
+            RuntimeEnvironment.getApplication(), mockServiceListener, MOCK_PROFILE2);
 
     assertThat(result1).isTrue();
     assertThat(result2).isTrue();
@@ -370,7 +370,7 @@
     bluetoothAdapter.closeProfileProxy(MOCK_PROFILE1, mockProxy);
     boolean result =
         bluetoothAdapter.getProfileProxy(
-            RuntimeEnvironment.application, mockServiceListener, MOCK_PROFILE1);
+            RuntimeEnvironment.getApplication(), mockServiceListener, MOCK_PROFILE1);
 
     assertThat(result).isFalse();
     verifyZeroInteractions(mockServiceListener);
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowContextWrapperTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowContextWrapperTest.java
index edfc127..4a0e9b4 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowContextWrapperTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowContextWrapperTest.java
@@ -18,7 +18,6 @@
 import android.app.Application;
 import android.appwidget.AppWidgetProvider;
 import android.content.BroadcastReceiver;
-import android.content.BroadcastReceiver.PendingResult;
 import android.content.Context;
 import android.content.ContextWrapper;
 import android.content.Intent;
@@ -739,8 +738,10 @@
     final Intent pick = new Intent(Intent.ACTION_PICK).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     contextWrapper.startActivities(new Intent[] {view, pick});
 
-    assertThat(shadowOf(RuntimeEnvironment.application).getNextStartedActivity()).isEqualTo(pick);
-    assertThat(shadowOf(RuntimeEnvironment.application).getNextStartedActivity()).isEqualTo(view);
+    assertThat(shadowOf(RuntimeEnvironment.getApplication()).getNextStartedActivity())
+        .isEqualTo(pick);
+    assertThat(shadowOf(RuntimeEnvironment.getApplication()).getNextStartedActivity())
+        .isEqualTo(view);
   }
 
   @Test
@@ -749,8 +750,10 @@
     final Intent pick = new Intent(Intent.ACTION_PICK).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     contextWrapper.startActivities(new Intent[] {view, pick}, new Bundle());
 
-    assertThat(shadowOf(RuntimeEnvironment.application).getNextStartedActivity()).isEqualTo(pick);
-    assertThat(shadowOf(RuntimeEnvironment.application).getNextStartedActivity()).isEqualTo(view);
+    assertThat(shadowOf(RuntimeEnvironment.getApplication()).getNextStartedActivity())
+        .isEqualTo(pick);
+    assertThat(shadowOf(RuntimeEnvironment.getApplication()).getNextStartedActivity())
+        .isEqualTo(view);
   }
 
   @Test
@@ -760,9 +763,9 @@
     contextWrapper.startActivities(new Intent[] {view, pick});
 
     IntentForResult second =
-        shadowOf(RuntimeEnvironment.application).getNextStartedActivityForResult();
+        shadowOf(RuntimeEnvironment.getApplication()).getNextStartedActivityForResult();
     IntentForResult first =
-        shadowOf(RuntimeEnvironment.application).getNextStartedActivityForResult();
+        shadowOf(RuntimeEnvironment.getApplication()).getNextStartedActivityForResult();
 
     assertThat(second.intent).isEqualTo(pick);
     assertThat(second.options).isNull();
@@ -780,9 +783,9 @@
     contextWrapper.startActivities(new Intent[] {view, pick}, options);
 
     IntentForResult second =
-        shadowOf(RuntimeEnvironment.application).getNextStartedActivityForResult();
+        shadowOf(RuntimeEnvironment.getApplication()).getNextStartedActivityForResult();
     IntentForResult first =
-        shadowOf(RuntimeEnvironment.application).getNextStartedActivityForResult();
+        shadowOf(RuntimeEnvironment.getApplication()).getNextStartedActivityForResult();
 
     assertThat(second.intent).isEqualTo(pick);
     assertThat(second.options).isEqualTo(options);
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowEnvironmentTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowEnvironmentTest.java
index e631fe6..e0c245b 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowEnvironmentTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowEnvironmentTest.java
@@ -178,8 +178,9 @@
     assertThat(externalFilesDirs[1].getCanonicalPath()).contains("external_dir_2");
 
     // TODO(jongerrish): This fails because ShadowContext overwrites getExternalFilesDir.
-//     assertThat(RuntimeEnvironment.application.getExternalFilesDir(Environment.DIRECTORY_MOVIES)
-//         .getCanonicalPath()).contains("external_dir_1");
+    //
+    // assertThat(RuntimeEnvironment.getApplication().getExternalFilesDir(Environment.DIRECTORY_MOVIES)
+    //         .getCanonicalPath()).contains("external_dir_1");
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowListViewTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowListViewTest.java
index d3ac383..61f0a92 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowListViewTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowListViewTest.java
@@ -4,7 +4,7 @@
 import static java.util.Arrays.asList;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
-import static org.robolectric.RuntimeEnvironment.application;
+import static org.robolectric.RuntimeEnvironment.getApplication;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.app.Application;
@@ -184,7 +184,8 @@
     adapterFileList.add("Item 1");
     adapterFileList.add("Item 2");
     adapterFileList.add("Item 3");
-    final ArrayAdapter<String> adapter = new ArrayAdapter<>(application, android.R.layout.simple_list_item_1, adapterFileList);
+    final ArrayAdapter<String> adapter =
+        new ArrayAdapter<>(getApplication(), android.R.layout.simple_list_item_1, adapterFileList);
     listView.setAdapter(adapter);
     shadowOf(listView).populateItems();
     ShadowListView shadowListView = shadowOf(listView);
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowNotificationTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowNotificationTest.java
index 5c326c8..9bf279c 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowNotificationTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowNotificationTest.java
@@ -1,7 +1,7 @@
 package org.robolectric.shadows;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.robolectric.RuntimeEnvironment.application;
+import static org.robolectric.RuntimeEnvironment.getApplication;
 
 import android.app.Notification;
 import android.app.PendingIntent;
@@ -15,9 +15,9 @@
 
   @Test
   public void setLatestEventInfo__shouldCaptureContentIntent() throws Exception {
-    PendingIntent pendingIntent = PendingIntent.getActivity(application, 0, new Intent(), 0);
+    PendingIntent pendingIntent = PendingIntent.getActivity(getApplication(), 0, new Intent(), 0);
     Notification notification = new Notification();
-    notification.setLatestEventInfo(application, "title", "content", pendingIntent);
+    notification.setLatestEventInfo(getApplication(), "title", "content", pendingIntent);
     assertThat(notification.contentIntent).isSameInstanceAs(pendingIntent);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowProgressBarTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowProgressBarTest.java
index 5f15836..79048eb 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowProgressBarTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowProgressBarTest.java
@@ -4,7 +4,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.robolectric.RuntimeEnvironment.application;
+import static org.robolectric.RuntimeEnvironment.getApplication;
 
 import android.util.AttributeSet;
 import android.widget.ProgressBar;
@@ -28,7 +28,7 @@
         .addAttribute(android.R.attr.indeterminateOnly, "false")
         .build();
 
-    progressBar = new ProgressBar(application, attrs);
+    progressBar = new ProgressBar(getApplication(), attrs);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowRoleManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowRoleManagerTest.java
index 8f26098..d58cfb3 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowRoleManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowRoleManagerTest.java
@@ -1,7 +1,7 @@
 package org.robolectric.shadows;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.robolectric.RuntimeEnvironment.application;
+import static org.robolectric.RuntimeEnvironment.getApplication;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.app.role.RoleManager;
@@ -21,7 +21,7 @@
 
   @Before
   public void setUp() throws Exception {
-    roleManager = (RoleManager) application.getSystemService(Context.ROLE_SERVICE);
+    roleManager = (RoleManager) getApplication().getSystemService(Context.ROLE_SERVICE);
   }
 
   @Test(expected = IllegalArgumentException.class)
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowServiceTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowServiceTest.java
index 175afa6..5bb3641 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowServiceTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowServiceTest.java
@@ -62,7 +62,7 @@
 
   @Test
   public void shouldUnbindServiceWithExceptionWhenRequested() {
-    shadowOf(RuntimeEnvironment.application).setUnbindServiceShouldThrowIllegalArgument(true);
+    shadowOf(RuntimeEnvironment.getApplication()).setUnbindServiceShouldThrowIllegalArgument(true);
     ServiceConnection conn = Shadow.newInstanceOf(MediaScannerConnection.class);
     try {
       service.unbindService(conn);
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSliceManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSliceManagerTest.java
index 48161d7..a88f30a 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowSliceManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSliceManagerTest.java
@@ -34,7 +34,7 @@
 
   @Before
   public void setUp() {
-    PackageManager packageManager = RuntimeEnvironment.application.getPackageManager();
+    PackageManager packageManager = RuntimeEnvironment.getApplication().getPackageManager();
     ShadowApplicationPackageManager shadowPackageManager =
         (ShadowApplicationPackageManager) shadowOf(packageManager);
     shadowPackageManager.setPackagesForUid(PACKAGE_1_UID, new String[] {PACKAGE_NAME_1});
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowStorageManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowStorageManagerTest.java
index d7aae6c..8868da4 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowStorageManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowStorageManagerTest.java
@@ -3,7 +3,7 @@
 import static android.os.Build.VERSION_CODES.N;
 import static android.os.Build.VERSION_CODES.R;
 import static com.google.common.truth.Truth.assertThat;
-import static org.robolectric.RuntimeEnvironment.application;
+import static org.robolectric.RuntimeEnvironment.getApplication;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.content.Context;
@@ -31,7 +31,7 @@
 
   @Before
   public void setUp() {
-    storageManager = (StorageManager) application.getSystemService(Context.STORAGE_SERVICE);
+    storageManager = (StorageManager) getApplication().getSystemService(Context.STORAGE_SERVICE);
   }
 
   @Test
@@ -87,7 +87,7 @@
   @Test
   @Config(minSdk = N)
   public void isUserKeyUnlocked() {
-    shadowOf(application.getSystemService(UserManager.class)).setUserUnlocked(true);
+    shadowOf(getApplication().getSystemService(UserManager.class)).setUserUnlocked(true);
     assertThat(StorageManager.isUserKeyUnlocked(0)).isTrue();
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowTelephonyManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowTelephonyManagerTest.java
index 1d1ff85..7922951 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowTelephonyManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowTelephonyManagerTest.java
@@ -34,7 +34,7 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.robolectric.RuntimeEnvironment.application;
+import static org.robolectric.RuntimeEnvironment.getApplication;
 import static org.robolectric.Shadows.shadowOf;
 import static org.robolectric.shadows.ShadowTelephonyManager.createTelephonyDisplayInfo;
 
@@ -79,7 +79,7 @@
 
   @Before
   public void setUp() throws Exception {
-    telephonyManager = (TelephonyManager) application.getSystemService(TELEPHONY_SERVICE);
+    telephonyManager = (TelephonyManager) getApplication().getSystemService(TELEPHONY_SERVICE);
     shadowTelephonyManager = Shadow.extract(telephonyManager);
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowWifiInfoTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowWifiInfoTest.java
index c5f9c02..460e43c 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowWifiInfoTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowWifiInfoTest.java
@@ -3,7 +3,7 @@
 import static android.content.Context.WIFI_SERVICE;
 import static android.os.Build.VERSION_CODES.LOLLIPOP;
 import static com.google.common.truth.Truth.assertThat;
-import static org.robolectric.RuntimeEnvironment.application;
+import static org.robolectric.RuntimeEnvironment.getApplication;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.net.wifi.SupplicantState;
@@ -23,7 +23,7 @@
 
   @Before
   public void setUp() {
-    wifiManager = (WifiManager) application.getSystemService(WIFI_SERVICE);
+    wifiManager = (WifiManager) getApplication().getSystemService(WIFI_SERVICE);
   }
 
   @Test
diff --git a/shadows/framework/src/main/java/org/robolectric/RuntimeEnvironment.java b/shadows/framework/src/main/java/org/robolectric/RuntimeEnvironment.java
index 30823cd..73cf10e 100755
--- a/shadows/framework/src/main/java/org/robolectric/RuntimeEnvironment.java
+++ b/shadows/framework/src/main/java/org/robolectric/RuntimeEnvironment.java
@@ -9,6 +9,7 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.util.DisplayMetrics;
+import androidx.test.platform.app.InstrumentationRegistry;
 import java.nio.file.Path;
 import org.robolectric.android.Bootstrap;
 import org.robolectric.android.ConfigurationV25;
@@ -39,6 +40,38 @@
   private static boolean useLegacyResources;
 
   /**
+   * Get a reference to the {@link Application} under test.
+   *
+   * The Application may be created a test setup time or created lazily at call time, based on the
+   * test's {@Link LazyLoadApplication) setting. If lazy loading is enabled, this method must be
+   * called on the main/test thread.
+   *
+   * An alternate API is
+   * {@link androidx.test.core.app.ApplicationProvider#getApplicationContext()}, which is
+   * preferable if you desire cross platform tests that work on the JVM and real Android devices.
+   */
+  public static Application getApplication() {
+    if (application == null) {
+      application =
+          (Application)
+              InstrumentationRegistry.getInstrumentation()
+                  .getTargetContext()
+                  .getApplicationContext();
+    }
+    return application;
+  }
+
+  private static Class<? extends Application> applicationClass;
+
+  public static Class<? extends Application> getConfiguredApplicationClass() {
+    return applicationClass;
+  }
+
+  public static void setConfiguredApplicationClass(Class<? extends Application> clazz) {
+    applicationClass = clazz;
+  }
+
+  /**
    * Tests if the given thread is currently set as the main thread.
    *
    * @param thread the thread to test.
@@ -145,8 +178,8 @@
     Resources systemResources = Resources.getSystem();
     systemResources.updateConfiguration(configuration, displayMetrics);
 
-    if (application != null) {
-      application.getResources().updateConfiguration(configuration, displayMetrics);
+    if (getApplication() != null) {
+      getApplication().getResources().updateConfiguration(configuration, displayMetrics);
     }
   }
 
diff --git a/shadows/framework/src/main/java/org/robolectric/android/controller/ActivityController.java b/shadows/framework/src/main/java/org/robolectric/android/controller/ActivityController.java
index de69a28..a40f0e1 100644
--- a/shadows/framework/src/main/java/org/robolectric/android/controller/ActivityController.java
+++ b/shadows/framework/src/main/java/org/robolectric/android/controller/ActivityController.java
@@ -74,7 +74,7 @@
       return this;
     }
     // make sure the component is enabled
-    Context context = RuntimeEnvironment.application.getBaseContext();
+    Context context = RuntimeEnvironment.getApplication().getBaseContext();
     PackageManager packageManager = context.getPackageManager();
     ComponentName componentName =
         new ComponentName(context.getPackageName(), this.component.getClass().getName());
diff --git a/shadows/framework/src/main/java/org/robolectric/android/controller/BackupAgentController.java b/shadows/framework/src/main/java/org/robolectric/android/controller/BackupAgentController.java
index 5742834..68aba8e 100644
--- a/shadows/framework/src/main/java/org/robolectric/android/controller/BackupAgentController.java
+++ b/shadows/framework/src/main/java/org/robolectric/android/controller/BackupAgentController.java
@@ -19,7 +19,7 @@
     if (attached) {
       return this;
     }
-    Context baseContext = RuntimeEnvironment.application.getBaseContext();
+    Context baseContext = RuntimeEnvironment.getApplication().getBaseContext();
     ReflectionHelpers.callInstanceMethod(BackupAgent.class, component, "attach",
         ReflectionHelpers.ClassParameter.from(Context.class, baseContext));
     return this;
diff --git a/shadows/framework/src/main/java/org/robolectric/android/controller/ComponentController.java b/shadows/framework/src/main/java/org/robolectric/android/controller/ComponentController.java
index 3241f06..0b997aa 100644
--- a/shadows/framework/src/main/java/org/robolectric/android/controller/ComponentController.java
+++ b/shadows/framework/src/main/java/org/robolectric/android/controller/ComponentController.java
@@ -39,9 +39,12 @@
   public abstract C destroy();
 
   public Intent getIntent() {
-    Intent intent = this.intent == null ? new Intent(RuntimeEnvironment.application, component.getClass()) : this.intent;
+    Intent intent =
+        this.intent == null
+            ? new Intent(RuntimeEnvironment.getApplication(), component.getClass())
+            : this.intent;
     if (intent.getComponent() == null) {
-      intent.setClass(RuntimeEnvironment.application, component.getClass());
+      intent.setClass(RuntimeEnvironment.getApplication(), component.getClass());
     }
     return intent;
   }
diff --git a/shadows/framework/src/main/java/org/robolectric/android/controller/ContentProviderController.java b/shadows/framework/src/main/java/org/robolectric/android/controller/ContentProviderController.java
index 62ccd1a..3643b16 100644
--- a/shadows/framework/src/main/java/org/robolectric/android/controller/ContentProviderController.java
+++ b/shadows/framework/src/main/java/org/robolectric/android/controller/ContentProviderController.java
@@ -27,7 +27,7 @@
    * Create and register {@link ContentProvider} using {@link ProviderInfo} found from manifest.
    */
   public ContentProviderController<T> create() {
-    Context baseContext = RuntimeEnvironment.application.getBaseContext();
+    Context baseContext = RuntimeEnvironment.getApplication().getBaseContext();
 
     ComponentName componentName = createRelative(baseContext.getPackageName(), contentProvider.getClass().getName());
 
@@ -68,7 +68,7 @@
           !Strings.isNullOrEmpty(providerInfo.authority),
           "ProviderInfo.authority must not be null or empty");
     }
-    Context baseContext = RuntimeEnvironment.application.getBaseContext();
+    Context baseContext = RuntimeEnvironment.getApplication().getBaseContext();
     // make sure the component is enabled
     ComponentName componentName =
         createRelative(baseContext.getPackageName(), contentProvider.getClass().getName());
diff --git a/shadows/framework/src/main/java/org/robolectric/android/controller/IntentServiceController.java b/shadows/framework/src/main/java/org/robolectric/android/controller/IntentServiceController.java
index dccc93d..4c5911e 100644
--- a/shadows/framework/src/main/java/org/robolectric/android/controller/IntentServiceController.java
+++ b/shadows/framework/src/main/java/org/robolectric/android/controller/IntentServiceController.java
@@ -31,19 +31,22 @@
       return this;
     }
     // make sure the component is enabled
-    Context context = RuntimeEnvironment.application.getBaseContext();
+    Context context = RuntimeEnvironment.getApplication().getBaseContext();
     ComponentName name =
         new ComponentName(context.getPackageName(), component.getClass().getName());
     context
         .getPackageManager()
         .setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
-    ReflectionHelpers.callInstanceMethod(Service.class, component, "attach",
-       from(Context.class, RuntimeEnvironment.application.getBaseContext()),
-       from(ActivityThread.class, null),
-       from(String.class, component.getClass().getSimpleName()),
-       from(IBinder.class, null),
-       from(Application.class, RuntimeEnvironment.application),
-       from(Object.class, null));
+    ReflectionHelpers.callInstanceMethod(
+        Service.class,
+        component,
+        "attach",
+        from(Context.class, RuntimeEnvironment.getApplication().getBaseContext()),
+        from(ActivityThread.class, null),
+        from(String.class, component.getClass().getSimpleName()),
+        from(IBinder.class, null),
+        from(Application.class, RuntimeEnvironment.getApplication()),
+        from(Object.class, null));
 
     attached = true;
     return this;
diff --git a/shadows/framework/src/main/java/org/robolectric/android/controller/ServiceController.java b/shadows/framework/src/main/java/org/robolectric/android/controller/ServiceController.java
index da51708..1c51823 100644
--- a/shadows/framework/src/main/java/org/robolectric/android/controller/ServiceController.java
+++ b/shadows/framework/src/main/java/org/robolectric/android/controller/ServiceController.java
@@ -30,19 +30,22 @@
       return this;
     }
     // make sure the component is enabled
-    Context context = RuntimeEnvironment.application.getBaseContext();
+    Context context = RuntimeEnvironment.getApplication().getBaseContext();
     ComponentName name =
         new ComponentName(context.getPackageName(), component.getClass().getName());
     context
         .getPackageManager()
         .setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
 
-    ReflectionHelpers.callInstanceMethod(Service.class, component, "attach",
-        from(Context.class, RuntimeEnvironment.application.getBaseContext()),
+    ReflectionHelpers.callInstanceMethod(
+        Service.class,
+        component,
+        "attach",
+        from(Context.class, RuntimeEnvironment.getApplication().getBaseContext()),
         from(ActivityThread.class, null),
         from(String.class, component.getClass().getSimpleName()),
         from(IBinder.class, null),
-        from(Application.class, RuntimeEnvironment.application),
+        from(Application.class, RuntimeEnvironment.getApplication()),
         from(Object.class, null));
 
     attached = true;
@@ -74,7 +77,11 @@
   }
 
   public ServiceController<T> startCommand(int flags, int startId) {
-    invokeWhilePaused("onStartCommand", from(Intent.class, getIntent()), from(int.class, flags), from(int.class, startId));
+    invokeWhilePaused(
+        "onStartCommand",
+        from(Intent.class, getIntent()),
+        from(int.class, flags),
+        from(int.class, startId));
     shadowMainLooper.idleIfPaused();
     return this;
   }
diff --git a/shadows/framework/src/main/java/org/robolectric/fakes/RoboMenu.java b/shadows/framework/src/main/java/org/robolectric/fakes/RoboMenu.java
index 893b6cf..9a755f0 100644
--- a/shadows/framework/src/main/java/org/robolectric/fakes/RoboMenu.java
+++ b/shadows/framework/src/main/java/org/robolectric/fakes/RoboMenu.java
@@ -21,7 +21,7 @@
   private Context context;
 
   public RoboMenu() {
-    this(RuntimeEnvironment.application);
+    this(RuntimeEnvironment.getApplication());
   }
 
   public RoboMenu(Context context) {
diff --git a/shadows/framework/src/main/java/org/robolectric/fakes/RoboMenuItem.java b/shadows/framework/src/main/java/org/robolectric/fakes/RoboMenuItem.java
index 597d144..f94d45c 100644
--- a/shadows/framework/src/main/java/org/robolectric/fakes/RoboMenuItem.java
+++ b/shadows/framework/src/main/java/org/robolectric/fakes/RoboMenuItem.java
@@ -33,7 +33,7 @@
   private Context context;
 
   public RoboMenuItem() {
-    this(RuntimeEnvironment.application);
+    this(RuntimeEnvironment.getApplication());
   }
 
   public RoboMenuItem(Context context) {
diff --git a/shadows/framework/src/main/java/org/robolectric/fakes/RoboSubMenu.java b/shadows/framework/src/main/java/org/robolectric/fakes/RoboSubMenu.java
index 2a5d6c7..462d2b0 100644
--- a/shadows/framework/src/main/java/org/robolectric/fakes/RoboSubMenu.java
+++ b/shadows/framework/src/main/java/org/robolectric/fakes/RoboSubMenu.java
@@ -13,7 +13,7 @@
 public class RoboSubMenu extends RoboMenu implements SubMenu {
 
   public RoboSubMenu() {
-    this(RuntimeEnvironment.application);
+    this(RuntimeEnvironment.getApplication());
   }
 
   public RoboSubMenu(Context context) {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAccessibilityNodeInfo.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAccessibilityNodeInfo.java
index 6f53462..9811ef4 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAccessibilityNodeInfo.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAccessibilityNodeInfo.java
@@ -243,7 +243,7 @@
 
   @Implementation
   protected static AccessibilityNodeInfo obtain() {
-    return obtain(new View(RuntimeEnvironment.application.getApplicationContext()));
+    return obtain(new View(RuntimeEnvironment.getApplication().getApplicationContext()));
   }
 
   @Implementation
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivity.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivity.java
index 208ebdf..ce7b1c2 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivity.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivity.java
@@ -101,7 +101,7 @@
       Intent intent,
       @Nullable @WithType("android.app.Activity$NonConfigurationInstances")
           Object lastNonConfigurationInstances) {
-    Application application = RuntimeEnvironment.application;
+    Application application = RuntimeEnvironment.getApplication();
     Context baseContext = application.getBaseContext();
 
     ComponentName componentName =
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityManager.java
index 31589f1..fd6e17e 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityManager.java
@@ -55,8 +55,8 @@
   public ShadowActivityManager() {
     ActivityManager.RunningAppProcessInfo processInfo = new ActivityManager.RunningAppProcessInfo();
     fillInProcessInfo(processInfo);
-    processInfo.processName = RuntimeEnvironment.application.getPackageName();
-    processInfo.pkgList = new String[] {RuntimeEnvironment.application.getPackageName()};
+    processInfo.processName = RuntimeEnvironment.getApplication().getPackageName();
+    processInfo.pkgList = new String[] {RuntimeEnvironment.getApplication().getPackageName()};
     processes.add(processInfo);
   }
 
@@ -138,7 +138,7 @@
   @Implementation(minSdk = JELLY_BEAN_MR1)
   protected boolean switchUser(int userid) {
     ShadowUserManager shadowUserManager =
-        Shadow.extract(RuntimeEnvironment.application.getSystemService(Context.USER_SERVICE));
+        Shadow.extract(RuntimeEnvironment.getApplication().getSystemService(Context.USER_SERVICE));
     shadowUserManager.switchUser(userid);
     return true;
   }
@@ -303,7 +303,7 @@
   protected boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
     // The real ActivityManager calls clearApplicationUserData on the ActivityManagerService that
     // calls PackageManager#clearApplicationUserData.
-    RuntimeEnvironment.application
+    RuntimeEnvironment.getApplication()
         .getPackageManager()
         .clearApplicationUserData(packageName, observer);
     return true;
@@ -314,9 +314,9 @@
    * ActivityManager#clearApplicationUserData()}.
    */
   public boolean isApplicationUserDataCleared() {
-    PackageManager packageManager = RuntimeEnvironment.application.getPackageManager();
+    PackageManager packageManager = RuntimeEnvironment.getApplication().getPackageManager();
     return Shadow.<ShadowApplicationPackageManager>extract(packageManager)
         .getClearedApplicationUserDataPackages()
-        .contains(RuntimeEnvironment.application.getPackageName());
+        .contains(RuntimeEnvironment.getApplication().getPackageName());
   }
 }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityThread.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityThread.java
index b727133..2b5f5b4 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityThread.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityThread.java
@@ -48,7 +48,7 @@
               }
 
               try {
-                return RuntimeEnvironment.application
+                return RuntimeEnvironment.getApplication()
                     .getPackageManager()
                     .getApplicationInfo(packageName, flags);
               } catch (PackageManager.NameNotFoundException e) {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlertController.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlertController.java
index 93d0b67..53abb63 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlertController.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlertController.java
@@ -64,7 +64,7 @@
 
   @Implementation(minSdk = LOLLIPOP)
   public void setView(int resourceId) {
-    setView(LayoutInflater.from(RuntimeEnvironment.application).inflate(resourceId, null));
+    setView(LayoutInflater.from(RuntimeEnvironment.getApplication()).inflate(resourceId, null));
   }
 
   @Implementation
@@ -82,6 +82,7 @@
   }
 
   public Adapter getAdapter() {
-    return ReflectionHelpers.<ListView>callInstanceMethod(realAlertController, "getListView").getAdapter();
+    return ReflectionHelpers.<ListView>callInstanceMethod(realAlertController, "getListView")
+        .getAdapter();
   }
 }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlertDialog.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlertDialog.java
index deace5b..e9f9511 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlertDialog.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlertDialog.java
@@ -29,7 +29,7 @@
    * @return the most recently created {@code AlertDialog}, or null if none has been created during this test run
    */
   public static AlertDialog getLatestAlertDialog() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     ShadowAlertDialog dialog = shadowApplication.getLatestAlertDialog();
     return dialog == null ? null : dialog.realAlertDialog;
   }
@@ -45,7 +45,7 @@
    * Resets the tracking of the most recently created {@code AlertDialog}
    */
   public static void reset() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     shadowApplication.setLatestAlertDialog(null);
   }
 
@@ -91,7 +91,7 @@
   @Override
   public void show() {
     super.show();
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     shadowApplication.setLatestAlertDialog(this);
   }
 
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppWidgetManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppWidgetManager.java
index 1982e0d..dc99f35 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppWidgetManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppWidgetManager.java
@@ -203,7 +203,7 @@
   }
 
   private View createWidgetView(int widgetLayoutId) {
-    return LayoutInflater.from(RuntimeEnvironment.application).inflate(widgetLayoutId, null);
+    return LayoutInflater.from(RuntimeEnvironment.getApplication()).inflate(widgetLayoutId, null);
   }
 
   /**
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java
index 77266df..cdc0b58 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java
@@ -762,7 +762,7 @@
         // the manifest XML. The parser populates the requestedPermissionsFlags, but doesn't grant
         // the permissions. Several tests rely on the test package being granted all permissions, so
         // we treat this as a special case.
-        || pkgName.equals(RuntimeEnvironment.application.getPackageName());
+        || pkgName.equals(RuntimeEnvironment.getApplication().getPackageName());
   }
 
   @Implementation
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBackupManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBackupManager.java
index 94138e2..45567fa 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBackupManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBackupManager.java
@@ -117,8 +117,8 @@
   }
 
   private void enforceBackupPermission(String message) {
-    RuntimeEnvironment.application.enforceCallingOrSelfPermission(
-        android.Manifest.permission.BACKUP, message);
+    RuntimeEnvironment.getApplication()
+        .enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, message);
   }
 
   private static class FakeRestoreSession implements IRestoreSession {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBiometricManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBiometricManager.java
index 5abd78e..0100814 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBiometricManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBiometricManager.java
@@ -43,7 +43,7 @@
               BiometricManager.class,
               "hasBiometrics",
               ClassParameter.from(
-                  Context.class, RuntimeEnvironment.application.getApplicationContext()));
+                  Context.class, RuntimeEnvironment.getApplication().getApplicationContext()));
       if (!hasBiomatrics) {
         return BIOMETRIC_ERROR_NO_HARDWARE;
       } else {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBitmapFactory.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBitmapFactory.java
index 1707766..fa66307 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBitmapFactory.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBitmapFactory.java
@@ -264,7 +264,8 @@
 
   public static void provideWidthAndHeightHints(int resourceId, int width, int height) {
     widthAndHeightMap.put(
-        "resource:" + RuntimeEnvironment.application.getResources().getResourceName(resourceId),
+        "resource:"
+            + RuntimeEnvironment.getApplication().getResources().getResourceName(resourceId),
         new Point(width, height));
   }
 
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothAdapter.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothAdapter.java
index 29a25ca..60905fa 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothAdapter.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothAdapter.java
@@ -174,7 +174,7 @@
    * isBleScanAlwaysAvailable(); }
    */
   private static boolean isAirplaneMode() {
-    Context context = RuntimeEnvironment.application;
+    Context context = RuntimeEnvironment.getApplication();
     return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0)
         != 0;
   }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothGatt.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothGatt.java
index 1020f38..4fa8ecd 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothGatt.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothGatt.java
@@ -55,13 +55,13 @@
                 new Class<?>[] {
                   Context.class, iBluetoothGattClass, BluetoothDevice.class, Integer.TYPE
                 },
-                new Object[] {RuntimeEnvironment.application, null, device, 0});
+                new Object[] {RuntimeEnvironment.getApplication(), null, device, 0});
       } else {
         bluetoothGatt =
             Shadow.newInstance(
                 BluetoothGatt.class,
                 new Class<?>[] {Context.class, iBluetoothGattClass, BluetoothDevice.class},
-                new Object[] {RuntimeEnvironment.application, null, device});
+                new Object[] {RuntimeEnvironment.getApplication(), null, device});
       }
       return bluetoothGatt;
     } catch (ClassNotFoundException e) {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothHeadset.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothHeadset.java
index 2ec619b..e36fe0e 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothHeadset.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothHeadset.java
@@ -133,6 +133,6 @@
             .putExtra(BluetoothProfile.EXTRA_STATE, bluetoothProfileExtraState)
             .putExtra(BluetoothDevice.EXTRA_DEVICE, bluetoothDevice);
 
-    RuntimeEnvironment.application.sendBroadcast(connectedIntent);
+    RuntimeEnvironment.getApplication().sendBroadcast(connectedIntent);
   }
 }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowContentResolver.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowContentResolver.java
index ec92687..e1b5209 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowContentResolver.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowContentResolver.java
@@ -1,3 +1,4 @@
+
 package org.robolectric.shadows;
 
 import static android.content.ContentResolver.QUERY_ARG_SQL_SELECTION;
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDebug.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDebug.java
index 729868f..b2f520e 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDebug.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDebug.java
@@ -96,7 +96,7 @@
     String defaultTraceExtension = ".trace";
 
     if (tracePath == null || tracePath.charAt(0) != '/') {
-      final File dir = RuntimeEnvironment.application.getExternalFilesDir(null);
+      final File dir = RuntimeEnvironment.getApplication().getExternalFilesDir(null);
       if (tracePath == null) {
         tracePath = new File(dir, defaultTraceBody).getAbsolutePath();
       } else {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDisplay.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDisplay.java
index 699f299..3fce4ae 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDisplay.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDisplay.java
@@ -37,7 +37,8 @@
    */
   public static Display getDefaultDisplay() {
     WindowManager windowManager =
-        (WindowManager) RuntimeEnvironment.application.getSystemService(Context.WINDOW_SERVICE);
+        (WindowManager)
+            RuntimeEnvironment.getApplication().getSystemService(Context.WINDOW_SERVICE);
     return windowManager.getDefaultDisplay();
   }
 
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowInstrumentation.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowInstrumentation.java
index d78d061..28581cc 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowInstrumentation.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowInstrumentation.java
@@ -161,7 +161,7 @@
 
   private void verifyActivityInManifest(Intent intent) {
     if (checkActivities
-        && RuntimeEnvironment.application
+        && RuntimeEnvironment.getApplication()
                 .getPackageManager()
                 .resolveActivity(intent, MATCH_DEFAULT_ONLY)
             == null) {
@@ -347,7 +347,7 @@
   private static boolean hasRequiredPermissionForBroadcast(
       Context context, @Nullable String requiredPermission) {
     return requiredPermission == null
-        || RuntimeEnvironment.application
+        || RuntimeEnvironment.getApplication()
                 .getPackageManager()
                 .checkPermission(requiredPermission, context.getPackageName())
             == PERMISSION_GRANTED;
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLegacyAssetManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLegacyAssetManager.java
index b56264a..d3d0739 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLegacyAssetManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLegacyAssetManager.java
@@ -506,7 +506,8 @@
       }
       return ResName.qualifyFromFilePath("android", fileName.replaceFirst("jar:", ""));
     } else {
-      return ResName.qualifyFromFilePath(RuntimeEnvironment.application.getPackageName(), fileName);
+      return ResName.qualifyFromFilePath(
+          RuntimeEnvironment.getApplication().getPackageName(), fileName);
     }
   }
 
@@ -1229,7 +1230,7 @@
             String defaultPackageName =
                 ResourceIds.isFrameworkResource(resId)
                     ? "android"
-                    : RuntimeEnvironment.application.getPackageName();
+                    : RuntimeEnvironment.getApplication().getPackageName();
             ResName resName =
                 ResName.qualifyResName(
                     attributeSet.getAttributeName(i), defaultPackageName, "attr");
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowListPopupWindow.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowListPopupWindow.java
index ae129e0..1d5dd6b 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowListPopupWindow.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowListPopupWindow.java
@@ -17,13 +17,13 @@
 
   @Implementation
   protected void show() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     shadowApplication.setLatestListPopupWindow(realListPopupWindow);
     directlyOn(realListPopupWindow, ListPopupWindow.class).show();
   }
 
   public static ListPopupWindow getLatestListPopupWindow() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     return shadowApplication.getLatestListPopupWindow();
   }
 }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNfcAdapter.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNfcAdapter.java
index 2c2a82a..2dc7e4b 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNfcAdapter.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNfcAdapter.java
@@ -58,7 +58,7 @@
   @Implementation(minSdk = Build.VERSION_CODES.KITKAT)
   protected void enableReaderMode(
       Activity activity, NfcAdapter.ReaderCallback callback, int flags, Bundle extras) {
-    if (!RuntimeEnvironment.application
+    if (!RuntimeEnvironment.getApplication()
         .getPackageManager()
         .hasSystemFeature(PackageManager.FEATURE_NFC)) {
       throw new UnsupportedOperationException();
@@ -71,7 +71,7 @@
 
   @Implementation(minSdk = Build.VERSION_CODES.KITKAT)
   protected void disableReaderMode(Activity activity) {
-    if (!RuntimeEnvironment.application
+    if (!RuntimeEnvironment.getApplication()
         .getPackageManager()
         .hasSystemFeature(PackageManager.FEATURE_NFC)) {
       throw new UnsupportedOperationException();
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNotification.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNotification.java
index f2e63d1..164f5bd 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNotification.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNotification.java
@@ -80,7 +80,8 @@
     if (RuntimeEnvironment.getApiLevel() >= Build.VERSION_CODES.N) {
       return realNotification.extras.getParcelable(Notification.EXTRA_PICTURE);
     } else {
-      ImageView imageView = (ImageView) applyBigContentView().findViewById(getInternalResourceId("big_picture"));
+      ImageView imageView =
+          (ImageView) applyBigContentView().findViewById(getInternalResourceId("big_picture"));
       return imageView != null && imageView.getDrawable() != null
           ? ((BitmapDrawable) imageView.getDrawable()).getBitmap() : null;
     }
@@ -122,11 +123,13 @@
   }
 
   private View applyContentView() {
-    return realNotification.contentView.apply(RuntimeEnvironment.application, new FrameLayout(RuntimeEnvironment.application));
+    return realNotification.contentView.apply(
+        RuntimeEnvironment.getApplication(), new FrameLayout(RuntimeEnvironment.getApplication()));
   }
 
   private View applyBigContentView() {
-    return realNotification.bigContentView.apply(RuntimeEnvironment.application, new FrameLayout(RuntimeEnvironment.application));
+    return realNotification.bigContentView.apply(
+        RuntimeEnvironment.getApplication(), new FrameLayout(RuntimeEnvironment.getApplication()));
   }
 
   private CharSequence findText(View view, String resourceName) {
@@ -140,7 +143,8 @@
       ByteArrayOutputStream buf = new ByteArrayOutputStream();
       ShadowView shadowView = Shadow.extract(view);
       shadowView.dump(new PrintStream(buf), 4);
-      throw new IllegalArgumentException("no id." + resourceName + " found in view:\n" + buf.toString());
+      throw new IllegalArgumentException(
+          "no id." + resourceName + " found in view:\n" + buf.toString());
     }
     return subView;
   }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNotificationManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNotificationManager.java
index b61a7f7..3045eae 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNotificationManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNotificationManager.java
@@ -98,7 +98,7 @@
     for (Map.Entry<Key, PostedNotification> entry : notifsCopy.entrySet()) {
       statusBarNotifications[i++] =
           new StatusBarNotification(
-              RuntimeEnvironment.application.getPackageName(),
+              RuntimeEnvironment.getApplication().getPackageName(),
               null /* opPkg */,
               entry.getKey().id,
               entry.getKey().tag,
@@ -327,7 +327,7 @@
   protected boolean canNotifyAsPackage(@NonNull String pkg) {
     // TODO: This doesn't work correctly with notification delegates because
     // ShadowNotificationManager doesn't respect the associated context, it just uses the global
-    // RuntimeEnvironment.application context.
+    // RuntimeEnvironment.getApplication() context.
 
     // So for the sake of testing, we will compare with values set using
     // setCanNotifyAsPackage()
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageInstaller.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageInstaller.java
index 03d6323..7ac5795 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageInstaller.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageInstaller.java
@@ -151,8 +151,8 @@
     ShadowSession shadowSession = Shadow.extract(session);
     if (success) {
       try {
-        shadowSession.statusReceiver
-            .sendIntent(RuntimeEnvironment.application, 0, null, null, null, null);
+        shadowSession.statusReceiver.sendIntent(
+            RuntimeEnvironment.getApplication(), 0, null, null, null, null);
       } catch (SendIntentException e) {
         throw new RuntimeException(e);
       }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java
index 1af5393..61590d3 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java
@@ -1115,7 +1115,8 @@
     synchronized (lock) {
       boolean hasDeletePackagesPermission = false;
       String[] requestedPermissions =
-          packageInfos.get(RuntimeEnvironment.application.getPackageName()).requestedPermissions;
+          packageInfos.get(RuntimeEnvironment.getApplication().getPackageName())
+              .requestedPermissions;
       if (requestedPermissions != null) {
         for (String permission : requestedPermissions) {
           if (Manifest.permission.DELETE_PACKAGES.equals(permission)) {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPendingIntent.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPendingIntent.java
index 0bf239f..e765aca 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPendingIntent.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPendingIntent.java
@@ -318,7 +318,7 @@
   @Implementation(minSdk = JELLY_BEAN_MR1)
   protected String getCreatorPackage() {
     return (creatorPackage == null)
-        ? RuntimeEnvironment.application.getPackageName()
+        ? RuntimeEnvironment.getApplication().getPackageName()
         : creatorPackage;
   }
 
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPopupMenu.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPopupMenu.java
index 4c57271..9349a71 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPopupMenu.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPopupMenu.java
@@ -42,13 +42,13 @@
   }
 
   public static PopupMenu getLatestPopupMenu() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     ShadowPopupMenu popupMenu = shadowApplication.getLatestPopupMenu();
     return popupMenu == null ? null : popupMenu.realPopupMenu;
   }
 
   public static void setLatestPopupMenu(ShadowPopupMenu latestPopupMenu) {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     if (shadowApplication != null) shadowApplication.setLatestPopupMenu(latestPopupMenu);
   }
 
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPowerManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPowerManager.java
index b1dae76..3e3d894 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPowerManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPowerManager.java
@@ -204,7 +204,7 @@
    * @return Most recent wake lock.
    */
   public static PowerManager.WakeLock getLatestWakeLock() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     return shadowApplication.getLatestWakeLock();
   }
 
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowService.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowService.java
index 46e27b4..84ba070 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowService.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowService.java
@@ -58,7 +58,9 @@
     lastForegroundNotification = notification;
     lastForegroundNotificationAttached = true;
     notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
-    NotificationManager nm = (NotificationManager)RuntimeEnvironment.application.getSystemService(Context.NOTIFICATION_SERVICE);
+    NotificationManager nm =
+        (NotificationManager)
+            RuntimeEnvironment.getApplication().getSystemService(Context.NOTIFICATION_SERVICE);
     nm.notify(id, notification);
   }
 
@@ -79,7 +81,9 @@
   }
 
   private void removeForegroundNotification() {
-    NotificationManager nm = (NotificationManager)RuntimeEnvironment.application.getSystemService(Context.NOTIFICATION_SERVICE);
+    NotificationManager nm =
+        (NotificationManager)
+            RuntimeEnvironment.getApplication().getSystemService(Context.NOTIFICATION_SERVICE);
     nm.cancel(lastForegroundNotificationId);
     lastForegroundNotification = null;
     lastForegroundNotificationAttached = false;
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSettings.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSettings.java
index f27731e..731f8a8 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSettings.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSettings.java
@@ -515,11 +515,11 @@
    */
   public static void setAirplaneMode(boolean isAirplaneMode) {
     Settings.Global.putInt(
-        RuntimeEnvironment.application.getContentResolver(),
+        RuntimeEnvironment.getApplication().getContentResolver(),
         Settings.Global.AIRPLANE_MODE_ON,
         isAirplaneMode ? 1 : 0);
     Settings.System.putInt(
-        RuntimeEnvironment.application.getContentResolver(),
+        RuntimeEnvironment.getApplication().getContentResolver(),
         Settings.System.AIRPLANE_MODE_ON,
         isAirplaneMode ? 1 : 0);
   }
@@ -531,9 +531,13 @@
    */
   public static void setWifiOn(boolean isOn) {
     Settings.Global.putInt(
-        RuntimeEnvironment.application.getContentResolver(), Settings.Global.WIFI_ON, isOn ? 1 : 0);
+        RuntimeEnvironment.getApplication().getContentResolver(),
+        Settings.Global.WIFI_ON,
+        isOn ? 1 : 0);
     Settings.System.putInt(
-        RuntimeEnvironment.application.getContentResolver(), Settings.System.WIFI_ON, isOn ? 1 : 0);
+        RuntimeEnvironment.getApplication().getContentResolver(),
+        Settings.System.WIFI_ON,
+        isOn ? 1 : 0);
   }
 
   /**
@@ -543,7 +547,7 @@
    */
   public static void set24HourTimeFormat(boolean use24HourTimeFormat) {
     Settings.System.putString(
-        RuntimeEnvironment.application.getContentResolver(),
+        RuntimeEnvironment.getApplication().getContentResolver(),
         Settings.System.TIME_12_24,
         use24HourTimeFormat ? "24" : "12");
   }
@@ -571,13 +575,13 @@
     // This setting moved from Secure to Global in JELLY_BEAN_MR1
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
       Settings.Global.putInt(
-          RuntimeEnvironment.application.getContentResolver(),
+          RuntimeEnvironment.getApplication().getContentResolver(),
           Settings.Global.ADB_ENABLED,
           adbEnabled ? 1 : 0);
     }
     // Support all clients by always setting the Secure version of the setting
     Settings.Secure.putInt(
-        RuntimeEnvironment.application.getContentResolver(),
+        RuntimeEnvironment.getApplication().getContentResolver(),
         Settings.Secure.ADB_ENABLED,
         adbEnabled ? 1 : 0);
   }
@@ -594,13 +598,13 @@
     // JELLY_BEAN_MR1.
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
       Settings.Global.putInt(
-          RuntimeEnvironment.application.getContentResolver(),
+          RuntimeEnvironment.getApplication().getContentResolver(),
           Settings.Global.INSTALL_NON_MARKET_APPS,
           installNonMarketApps ? 1 : 0);
     }
     // Always set the Secure version of the setting
     Settings.Secure.putInt(
-        RuntimeEnvironment.application.getContentResolver(),
+        RuntimeEnvironment.getApplication().getContentResolver(),
         Settings.Secure.INSTALL_NON_MARKET_APPS,
         installNonMarketApps ? 1 : 0);
   }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowShortcutManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowShortcutManager.java
index 3ec2a6a..33379f5 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowShortcutManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowShortcutManager.java
@@ -201,7 +201,7 @@
     }
     if (resultIntent != null) {
       try {
-        resultIntent.sendIntent(RuntimeEnvironment.application, 0, null, null, null);
+        resultIntent.sendIntent(RuntimeEnvironment.getApplication(), 0, null, null, null);
       } catch (SendIntentException e) {
         throw new IllegalStateException();
       }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowStorageManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowStorageManager.java
index 3962607..04dd8cf 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowStorageManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowStorageManager.java
@@ -2,7 +2,6 @@
 
 import static android.os.Build.VERSION_CODES.M;
 import static android.os.Build.VERSION_CODES.N;
-import static org.robolectric.RuntimeEnvironment.application;
 
 import android.os.UserManager;
 import android.os.storage.StorageManager;
@@ -11,6 +10,7 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.HiddenApi;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
@@ -100,7 +100,8 @@
   @HiddenApi
   @Implementation(minSdk = N)
   protected static boolean isUserKeyUnlocked(int userId) {
-    ShadowUserManager extract = Shadow.extract(application.getSystemService(UserManager.class));
+    ShadowUserManager extract =
+        Shadow.extract(RuntimeEnvironment.getApplication().getSystemService(UserManager.class));
     return extract.isUserUnlocked();
   }
 }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowToast.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowToast.java
index f560eb9..af095b4 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowToast.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowToast.java
@@ -43,13 +43,13 @@
 
   @Implementation
   protected void show() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     shadowApplication.getShownToasts().add(toast);
   }
 
   @Implementation
   protected void setText(int resId) {
-    this.text = RuntimeEnvironment.application.getString(resId);
+    this.text = RuntimeEnvironment.getApplication().getString(resId);
   }
 
   @Implementation
@@ -129,7 +129,7 @@
    * </pre>
    */
   public static void reset() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     shadowApplication.getShownToasts().clear();
   }
 
@@ -141,7 +141,7 @@
    *         or since {@link #reset()} has been called.
    */
   public static int shownToastCount() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     return shadowApplication.getShownToasts().size();
   }
 
@@ -154,7 +154,7 @@
    * @return whether the {@code Toast} was requested
    */
   public static boolean showedCustomToast(CharSequence message, int layoutResourceIdToCheckForMessage) {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     for (Toast toast : shadowApplication.getShownToasts()) {
       String text = ((TextView) toast.getView().findViewById(layoutResourceIdToCheckForMessage)).getText().toString();
       if (text.equals(message.toString())) {
@@ -171,7 +171,7 @@
    * @return whether the {@code Toast} was requested
    */
   public static boolean showedToast(CharSequence message) {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     for (Toast toast : shadowApplication.getShownToasts()) {
       ShadowToast shadowToast = Shadow.extract(toast);
       String text = shadowToast.text;
@@ -188,7 +188,7 @@
    * @return the text of the most recently shown {@code Toast}
    */
   public static String getTextOfLatestToast() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     List<Toast> shownToasts = shadowApplication.getShownToasts();
     if (shownToasts.isEmpty()) {
       return null;
@@ -205,7 +205,7 @@
    * @return the most recently shown {@code Toast}
    */
   public static Toast getLatestToast() {
-    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.application);
+    ShadowApplication shadowApplication = Shadow.extract(RuntimeEnvironment.getApplication());
     List<Toast> shownToasts = shadowApplication.getShownToasts();
     return (shownToasts.size() == 0) ? null : shownToasts.get(shownToasts.size() - 1);
   }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsageStatsManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsageStatsManager.java
index 63ec827..1a56290 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsageStatsManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsageStatsManager.java
@@ -335,7 +335,7 @@
 
   @Implementation(minSdk = Build.VERSION_CODES.P)
   protected UsageEvents queryEventsForSelf(long beginTime, long endTime) {
-    String packageName = RuntimeEnvironment.application.getOpPackageName();
+    String packageName = RuntimeEnvironment.getApplication().getOpPackageName();
     ImmutableList.Builder<Event> listBuilder = new ImmutableList.Builder<>();
     for (Event event : eventsByTimeStamp.subMap(beginTime, endTime).values()) {
       if (packageName.equals(event.getPackageName())) {
@@ -499,7 +499,7 @@
             .putExtra(UsageStatsManager.EXTRA_TIME_LIMIT, timeLimitInMillis)
             .putExtra(UsageStatsManager.EXTRA_TIME_USED, timeUsedInMillis);
     try {
-      observer.callbackIntent.send(RuntimeEnvironment.application, 0, intent);
+      observer.callbackIntent.send(RuntimeEnvironment.getApplication(), 0, intent);
     } catch (CanceledException e) {
       throw new RuntimeException(e);
     }
@@ -550,7 +550,7 @@
             .putExtra(UsageStatsManager.EXTRA_TIME_LIMIT, sessionStepTimeInMillis)
             .putExtra(UsageStatsManager.EXTRA_TIME_USED, timeUsedInMillis);
     try {
-      observer.sessionStepTriggeredIntent.send(RuntimeEnvironment.application, 0, intent);
+      observer.sessionStepTriggeredIntent.send(RuntimeEnvironment.getApplication(), 0, intent);
     } catch (CanceledException e) {
       throw new RuntimeException(e);
     }
@@ -565,7 +565,7 @@
     UsageSessionObserver observer = usageSessionObserversById.get(observerId);
     Intent intent = new Intent().putExtra(UsageStatsManager.EXTRA_OBSERVER_ID, observerId);
     try {
-      observer.sessionEndedIntent.send(RuntimeEnvironment.application, 0, intent);
+      observer.sessionEndedIntent.send(RuntimeEnvironment.getApplication(), 0, intent);
     } catch (CanceledException e) {
       throw new RuntimeException(e);
     }
@@ -621,7 +621,7 @@
             .putExtra(UsageStatsManager.EXTRA_TIME_LIMIT, observer.timeLimit.toMillis())
             .putExtra(UsageStatsManager.EXTRA_TIME_USED, timeUsed.toMillis());
     try {
-      observer.callbackIntent.send(RuntimeEnvironment.application, 0, intent);
+      observer.callbackIntent.send(RuntimeEnvironment.getApplication(), 0, intent);
     } catch (CanceledException e) {
       throw new RuntimeException(e);
     }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsbManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsbManager.java
index dd9a91d..77b5752 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsbManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsbManager.java
@@ -3,7 +3,6 @@
 import static android.os.Build.VERSION_CODES.M;
 import static android.os.Build.VERSION_CODES.N;
 import static android.os.Build.VERSION_CODES.N_MR1;
-import static org.robolectric.RuntimeEnvironment.application;
 import static org.robolectric.util.ReflectionHelpers.ClassParameter.from;
 import static org.robolectric.util.ReflectionHelpers.callConstructor;
 import static org.robolectric.util.ReflectionHelpers.getStaticField;
@@ -60,7 +59,7 @@
   /** Returns true if the caller has permission to access the device. */
   @Implementation
   protected boolean hasPermission(UsbDevice device) {
-    return hasPermissionForPackage(device, RuntimeEnvironment.application.getPackageName());
+    return hasPermissionForPackage(device, RuntimeEnvironment.getApplication().getPackageName());
   }
 
   /** Returns true if the given package has permission to access the device. */
@@ -72,7 +71,7 @@
   @Implementation(minSdk = N)
   @HiddenApi
   protected void grantPermission(UsbDevice device) {
-    grantPermission(device, RuntimeEnvironment.application.getPackageName());
+    grantPermission(device, RuntimeEnvironment.getApplication().getPackageName());
   }
 
   @Implementation(minSdk = N_MR1)
@@ -134,7 +133,7 @@
     if (hasPermission) {
       grantPermission(usbDevice);
     } else {
-      revokePermission(usbDevice, RuntimeEnvironment.application.getPackageName());
+      revokePermission(usbDevice, RuntimeEnvironment.getApplication().getPackageName());
     }
   }
 
@@ -142,7 +141,7 @@
   public void removeUsbDevice(UsbDevice usbDevice) {
     Preconditions.checkNotNull(usbDevice);
     usbDevices.remove(usbDevice.getDeviceName());
-    revokePermission(usbDevice, RuntimeEnvironment.application.getPackageName());
+    revokePermission(usbDevice, RuntimeEnvironment.getApplication().getPackageName());
   }
 
   @Implementation(minSdk = M)
@@ -238,7 +237,8 @@
                 (int) powerRole,
                 (int) dataRole,
                 status.getSupportedRoleCombinations()));
-    application.sendBroadcast(new Intent(UsbManager.ACTION_USB_PORT_CHANGED));
+    RuntimeEnvironment.getApplication()
+        .sendBroadcast(new Intent(UsbManager.ACTION_USB_PORT_CHANGED));
   }
 
   /** Opens a file descriptor from a temporary file. */
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWallpaperManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWallpaperManager.java
index 0408269..2724a6d 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWallpaperManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWallpaperManager.java
@@ -162,7 +162,7 @@
 
     Intent wallpaperServiceIntent = new Intent().setComponent(wallpaperService);
     List<ResolveInfo> resolveInfoList =
-        RuntimeEnvironment.application
+        RuntimeEnvironment.getApplication()
             .getPackageManager()
             .queryIntentServices(wallpaperServiceIntent, PackageManager.GET_META_DATA);
     if (resolveInfoList.size() != 1) {
@@ -170,7 +170,7 @@
           "Can't locate the given wallpaper service: " + wallpaperService);
     }
 
-    wallpaperInfo = new WallpaperInfo(RuntimeEnvironment.application, resolveInfoList.get(0));
+    wallpaperInfo = new WallpaperInfo(RuntimeEnvironment.getApplication(), resolveInfoList.get(0));
     lockScreenImage = null;
     homeScreenImage = null;
     return true;
@@ -197,7 +197,7 @@
   private static void enforceWallpaperComponentPermission() {
     // Robolectric doesn't stimulate IPC calls. When this code is executed, it will still be running
     // in the caller process.
-    if (RuntimeEnvironment.application.checkSelfPermission(permission.SET_WALLPAPER_COMPONENT)
+    if (RuntimeEnvironment.getApplication().checkSelfPermission(permission.SET_WALLPAPER_COMPONENT)
         != PackageManager.PERMISSION_GRANTED) {
       throw new SecurityException(
           "Permission " + permission.SET_WALLPAPER_COMPONENT + " isn't granted.");
@@ -210,7 +210,7 @@
    */
   private static ParcelFileDescriptor createParcelFileDescriptorFromBitmap(
       Bitmap image, String fileName) {
-    File tmpFile = new File(RuntimeEnvironment.application.getCacheDir(), fileName);
+    File tmpFile = new File(RuntimeEnvironment.getApplication().getCacheDir(), fileName);
     try (FileOutputStream fileOutputStream = new FileOutputStream(tmpFile)) {
       image.compress(CompressFormat.PNG, /* quality= */ 0, fileOutputStream);
       return ParcelFileDescriptor.open(tmpFile, ParcelFileDescriptor.MODE_READ_ONLY);
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWifiManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWifiManager.java
index b11bbe5..84dd111 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWifiManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWifiManager.java
@@ -266,7 +266,7 @@
             true /* isConnected */);
     ShadowConnectivityManager connectivityManager =
         Shadow.extract(
-                    RuntimeEnvironment.application.getSystemService(Context.CONNECTIVITY_SERVICE));
+            RuntimeEnvironment.getApplication().getSystemService(Context.CONNECTIVITY_SERVICE));
     connectivityManager.setActiveNetworkInfo(networkInfo);
 
     if (listener != null) {
diff --git a/shadows/httpclient/src/test/java/org/robolectric/shadows/httpclient/AndroidHttpClientTest.java b/shadows/httpclient/src/test/java/org/robolectric/shadows/httpclient/AndroidHttpClientTest.java
index e86ece4..e5ef907 100644
--- a/shadows/httpclient/src/test/java/org/robolectric/shadows/httpclient/AndroidHttpClientTest.java
+++ b/shadows/httpclient/src/test/java/org/robolectric/shadows/httpclient/AndroidHttpClientTest.java
@@ -26,7 +26,8 @@
 
   @Test
   public void testNewInstanceWithContext() throws Exception {
-    AndroidHttpClient client = AndroidHttpClient.newInstance("foo", RuntimeEnvironment.application);
+    AndroidHttpClient client =
+        AndroidHttpClient.newInstance("foo", RuntimeEnvironment.getApplication());
     assertThat(client).isNotNull();
   }
 
diff --git a/shadows/playservices/src/main/java/org/robolectric/shadows/gms/ShadowGooglePlayServicesUtil.java b/shadows/playservices/src/main/java/org/robolectric/shadows/gms/ShadowGooglePlayServicesUtil.java
index 46ffcad..e2f9dcd 100644
--- a/shadows/playservices/src/main/java/org/robolectric/shadows/gms/ShadowGooglePlayServicesUtil.java
+++ b/shadows/playservices/src/main/java/org/robolectric/shadows/gms/ShadowGooglePlayServicesUtil.java
@@ -121,7 +121,7 @@
       if (errorCode == ConnectionResult.SUCCESS) {
         return null;
       }
-      return new Dialog(RuntimeEnvironment.application);
+      return new Dialog(RuntimeEnvironment.getApplication());
     }
 
     public PendingIntent getErrorPendingIntent(int errorCode, Context context,
@@ -138,11 +138,11 @@
     }
 
     public Context getRemoteContext(Context context) {
-      return RuntimeEnvironment.application;
+      return RuntimeEnvironment.getApplication();
     }
 
     public Resources getRemoteResource(Context context) {
-      return RuntimeEnvironment.application.getResources();
+      return RuntimeEnvironment.getApplication().getResources();
     }
 
     public int isGooglePlayServicesAvailable(Context context) {
@@ -165,4 +165,4 @@
 
     public void showErrorNotification(int errorCode, Context context) {}
   }
-}
\ No newline at end of file
+}
diff --git a/shadows/playservices/src/test/java/org/robolectric/shadows/gms/ShadowGoogleAuthUtilTest.java b/shadows/playservices/src/test/java/org/robolectric/shadows/gms/ShadowGoogleAuthUtilTest.java
index 62a15af..de442ff 100644
--- a/shadows/playservices/src/test/java/org/robolectric/shadows/gms/ShadowGoogleAuthUtilTest.java
+++ b/shadows/playservices/src/test/java/org/robolectric/shadows/gms/ShadowGoogleAuthUtilTest.java
@@ -62,59 +62,77 @@
   @Test
   public void canRedirectStaticMethodToImplementation() throws Exception {
     ShadowGoogleAuthUtil.provideImpl(mockGoogleAuthUtil);
-    GoogleAuthUtil.clearToken(RuntimeEnvironment.application, "token");
-    verify(mockGoogleAuthUtil, times(1)).clearToken(RuntimeEnvironment.application, "token");
+    GoogleAuthUtil.clearToken(RuntimeEnvironment.getApplication(), "token");
+    verify(mockGoogleAuthUtil, times(1)).clearToken(RuntimeEnvironment.getApplication(), "token");
   }
 
   @Test
   public void getAccountChangeEvents_defaultReturnEmptyList() throws Exception {
-    List<AccountChangeEvent> list = GoogleAuthUtil.getAccountChangeEvents(
-        RuntimeEnvironment.application, 0, "name");
+    List<AccountChangeEvent> list =
+        GoogleAuthUtil.getAccountChangeEvents(RuntimeEnvironment.getApplication(), 0, "name");
     assertNotNull(list);
     assertEquals(0, list.size());
   }
 
   @Test
   public void getAccountId_defaultNotNull() throws Exception {
-    assertNotNull(GoogleAuthUtil.getAccountId(RuntimeEnvironment.application, "name"));
+    assertNotNull(GoogleAuthUtil.getAccountId(RuntimeEnvironment.getApplication(), "name"));
   }
 
   @Test
   public void getToken_defaultNotNull() throws Exception {
-    assertNotNull(GoogleAuthUtil.getToken(RuntimeEnvironment.application, "name", "scope"));
-    assertNotNull(GoogleAuthUtil.getToken(RuntimeEnvironment.application, "name", "scope",
-        null));
-    assertNotNull(GoogleAuthUtil.getToken(RuntimeEnvironment.application, new Account("name",
-        "robo"), "scope"));
-    assertNotNull(GoogleAuthUtil.getToken(RuntimeEnvironment.application, new Account("name",
-        "robo"), "scope", null));
-    assertNotNull(GoogleAuthUtil.getTokenWithNotification(RuntimeEnvironment.application,
-        "name", "scope", null));
-    assertNotNull(GoogleAuthUtil.getTokenWithNotification(RuntimeEnvironment.application,
-        "name", "scope", null, new Intent()));
-    assertNotNull(GoogleAuthUtil.getTokenWithNotification(RuntimeEnvironment.application,
-        "name", "scope", null, "authority", null));
-    assertNotNull(GoogleAuthUtil.getTokenWithNotification(RuntimeEnvironment.application,
-        new Account("name", "robo"), "scope", null));
-    assertNotNull(GoogleAuthUtil.getTokenWithNotification(RuntimeEnvironment.application,
-        new Account("name", "robo"), "scope", null, new Intent()));
-    assertNotNull(GoogleAuthUtil.getTokenWithNotification(RuntimeEnvironment.application,
-        new Account("name", "robo"), "scope", null, "authority", null));
+    assertNotNull(GoogleAuthUtil.getToken(RuntimeEnvironment.getApplication(), "name", "scope"));
+    assertNotNull(
+        GoogleAuthUtil.getToken(RuntimeEnvironment.getApplication(), "name", "scope", null));
+    assertNotNull(
+        GoogleAuthUtil.getToken(
+            RuntimeEnvironment.getApplication(), new Account("name", "robo"), "scope"));
+    assertNotNull(
+        GoogleAuthUtil.getToken(
+            RuntimeEnvironment.getApplication(), new Account("name", "robo"), "scope", null));
+    assertNotNull(
+        GoogleAuthUtil.getTokenWithNotification(
+            RuntimeEnvironment.getApplication(), "name", "scope", null));
+    assertNotNull(
+        GoogleAuthUtil.getTokenWithNotification(
+            RuntimeEnvironment.getApplication(), "name", "scope", null, new Intent()));
+    assertNotNull(
+        GoogleAuthUtil.getTokenWithNotification(
+            RuntimeEnvironment.getApplication(), "name", "scope", null, "authority", null));
+    assertNotNull(
+        GoogleAuthUtil.getTokenWithNotification(
+            RuntimeEnvironment.getApplication(), new Account("name", "robo"), "scope", null));
+    assertNotNull(
+        GoogleAuthUtil.getTokenWithNotification(
+            RuntimeEnvironment.getApplication(),
+            new Account("name", "robo"),
+            "scope",
+            null,
+            new Intent()));
+    assertNotNull(
+        GoogleAuthUtil.getTokenWithNotification(
+            RuntimeEnvironment.getApplication(),
+            new Account("name", "robo"),
+            "scope",
+            null,
+            "authority",
+            null));
   }
 
   @Test
   public void getTokenWithNotification_nullCallBackThrowIllegalArgumentException()
       throws Exception {
     thrown.expect(IllegalArgumentException.class);
-    GoogleAuthUtil.getTokenWithNotification(RuntimeEnvironment.application, "name", "scope",
-        null, null);
+    GoogleAuthUtil.getTokenWithNotification(
+        RuntimeEnvironment.getApplication(), "name", "scope", null, null);
   }
 
   @Test
   public void getTokenWithNotification_nullAuthorityThrowIllegalArgumentException()
       throws Exception {
     thrown.expect(IllegalArgumentException.class);
-    assertNotNull(GoogleAuthUtil.getTokenWithNotification(RuntimeEnvironment.application,
-        "name", "scope", null, null, null));
+    assertNotNull(
+        GoogleAuthUtil.getTokenWithNotification(
+            RuntimeEnvironment.getApplication(), "name", "scope", null, null, null));
   }
 }
diff --git a/shadows/playservices/src/test/java/org/robolectric/shadows/gms/ShadowGooglePlayServicesUtilTest.java b/shadows/playservices/src/test/java/org/robolectric/shadows/gms/ShadowGooglePlayServicesUtilTest.java
index a6e8c82..cd75b96 100644
--- a/shadows/playservices/src/test/java/org/robolectric/shadows/gms/ShadowGooglePlayServicesUtilTest.java
+++ b/shadows/playservices/src/test/java/org/robolectric/shadows/gms/ShadowGooglePlayServicesUtilTest.java
@@ -62,8 +62,9 @@
     ShadowGooglePlayServicesUtil.provideImpl(mockGooglePlayServicesUtil);
     when(mockGooglePlayServicesUtil.isGooglePlayServicesAvailable(
         any(Context.class))).thenReturn(ConnectionResult.INTERNAL_ERROR);
-    assertEquals(ConnectionResult.INTERNAL_ERROR,
-        GooglePlayServicesUtil.isGooglePlayServicesAvailable(RuntimeEnvironment.application));
+    assertEquals(
+        ConnectionResult.INTERNAL_ERROR,
+        GooglePlayServicesUtil.isGooglePlayServicesAvailable(RuntimeEnvironment.getApplication()));
   }
 
   @Test
@@ -75,12 +76,12 @@
 
   @Test
   public void getRemoteContext_defaultNotNull() {
-    assertNotNull(GooglePlayServicesUtil.getRemoteContext(RuntimeEnvironment.application));
+    assertNotNull(GooglePlayServicesUtil.getRemoteContext(RuntimeEnvironment.getApplication()));
   }
 
   @Test
   public void getRemoteResource_defaultNotNull() {
-    assertNotNull(GooglePlayServicesUtil.getRemoteResource(RuntimeEnvironment.application));
+    assertNotNull(GooglePlayServicesUtil.getRemoteResource(RuntimeEnvironment.getApplication()));
   }
 
   @Test
@@ -97,21 +98,25 @@
 
   @Test
   public void getErrorPendingIntent() {
-    assertNotNull(GooglePlayServicesUtil.getErrorPendingIntent(
-        ConnectionResult.SERVICE_MISSING, RuntimeEnvironment.application, 0));
-    assertNull(GooglePlayServicesUtil.getErrorPendingIntent(
-        ConnectionResult.SUCCESS, RuntimeEnvironment.application, 0));
+    assertNotNull(
+        GooglePlayServicesUtil.getErrorPendingIntent(
+            ConnectionResult.SERVICE_MISSING, RuntimeEnvironment.getApplication(), 0));
+    assertNull(
+        GooglePlayServicesUtil.getErrorPendingIntent(
+            ConnectionResult.SUCCESS, RuntimeEnvironment.getApplication(), 0));
   }
 
   @Test
   public void getOpenSourceSoftwareLicenseInfo_defaultNotNull() {
-    assertNotNull(GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(
-        RuntimeEnvironment.application));
+    assertNotNull(
+        GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(
+            RuntimeEnvironment.getApplication()));
   }
 
   @Test
   public void isGooglePlayServicesAvailable_defaultServiceMissing() {
-    assertEquals(ConnectionResult.SERVICE_MISSING,
-        GooglePlayServicesUtil.isGooglePlayServicesAvailable(RuntimeEnvironment.application));
+    assertEquals(
+        ConnectionResult.SERVICE_MISSING,
+        GooglePlayServicesUtil.isGooglePlayServicesAvailable(RuntimeEnvironment.getApplication()));
   }
 }
diff --git a/shadows/playservices/src/test/java/org/robolectric/shadows/gms/common/ShadowGoogleApiAvailabilityTest.java b/shadows/playservices/src/test/java/org/robolectric/shadows/gms/common/ShadowGoogleApiAvailabilityTest.java
index d99ed27..7e12ec7 100644
--- a/shadows/playservices/src/test/java/org/robolectric/shadows/gms/common/ShadowGoogleApiAvailabilityTest.java
+++ b/shadows/playservices/src/test/java/org/robolectric/shadows/gms/common/ShadowGoogleApiAvailabilityTest.java
@@ -29,7 +29,7 @@
 
     @Before
     public void setUp() {
-        roboContext = RuntimeEnvironment.application;
+    roboContext = RuntimeEnvironment.getApplication();
     }
 
     @After
diff --git a/shadows/supportv4/src/main/java/org/robolectric/shadows/support/v4/ShadowLocalBroadcastManager.java b/shadows/supportv4/src/main/java/org/robolectric/shadows/support/v4/ShadowLocalBroadcastManager.java
index e735eca..9f95b65 100644
--- a/shadows/supportv4/src/main/java/org/robolectric/shadows/support/v4/ShadowLocalBroadcastManager.java
+++ b/shadows/supportv4/src/main/java/org/robolectric/shadows/support/v4/ShadowLocalBroadcastManager.java
@@ -73,7 +73,7 @@
                   new Runnable() {
                     @Override
                     public void run() {
-                      receiver.onReceive(RuntimeEnvironment.application, broadcastIntent);
+                      receiver.onReceive(RuntimeEnvironment.getApplication(), broadcastIntent);
                     }
                   });
         }
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/CursorLoaderTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/CursorLoaderTest.java
index 1d3ad10..f040c2d 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/CursorLoaderTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/CursorLoaderTest.java
@@ -18,12 +18,14 @@
     String selection = "_id = ?";
     String[] selectionArgs = new String[] { "5" };
     String sortOrder = "_id";
-    CursorLoader cursorLoader = new CursorLoader(RuntimeEnvironment.application,
-        uri,
-        projection,
-        selection,
-        selectionArgs,
-        sortOrder);
+    CursorLoader cursorLoader =
+        new CursorLoader(
+            RuntimeEnvironment.getApplication(),
+            uri,
+            projection,
+            selection,
+            selectionArgs,
+            sortOrder);
 
     assertThat(cursorLoader.getUri()).isEqualTo(uri);
     assertThat(cursorLoader.getProjection()).isEqualTo(projection);
@@ -39,7 +41,7 @@
     String selection = "_id = ?";
     String[] selectionArgs = new String[] { "5" };
     String sortOrder = "_id";
-    CursorLoader cursorLoader = new CursorLoader(RuntimeEnvironment.application);
+    CursorLoader cursorLoader = new CursorLoader(RuntimeEnvironment.getApplication());
     cursorLoader.setUri(uri);
     cursorLoader.setProjection(projection);
     cursorLoader.setSelection(selection);
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/NotificationCompatBuilderTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/NotificationCompatBuilderTest.java
index c26d028..8d29ff7 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/NotificationCompatBuilderTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/NotificationCompatBuilderTest.java
@@ -17,7 +17,7 @@
     NotificationCompat.Action action =
         new NotificationCompat.Action.Builder(R.drawable.ic_corp_icon, "a title", null).build();
     Notification notification =
-        new NotificationCompat.Builder(RuntimeEnvironment.application)
+        new NotificationCompat.Builder(RuntimeEnvironment.getApplication())
             .addAction(action)
             .build();
     assertThat(notification.actions).asList().hasSize(1);
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLegacyAsyncTaskLoaderTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLegacyAsyncTaskLoaderTest.java
index 7302b49..3a6f795 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLegacyAsyncTaskLoaderTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLegacyAsyncTaskLoaderTest.java
@@ -68,7 +68,7 @@
     private Integer data;
 
     public TestLoader(Integer data) {
-      super(RuntimeEnvironment.application);
+      super(RuntimeEnvironment.getApplication());
       this.data = data;
     }
 
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLoaderTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLoaderTest.java
index 126f770..7fdf779 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLoaderTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLoaderTest.java
@@ -17,12 +17,13 @@
 
   @Before
   public void create() {
-    loader = new Loader<String>(RuntimeEnvironment.application) {
-      @Override
-      protected void onForceLoad() {
-        onForceLoadCalled = true;
-      }
-    };
+    loader =
+        new Loader<String>(RuntimeEnvironment.getApplication()) {
+          @Override
+          protected void onForceLoad() {
+            onForceLoadCalled = true;
+          }
+        };
     onForceLoadCalled = false;
   }
 
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLocalBroadcastManagerTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLocalBroadcastManagerTest.java
index c15f65b..d9deba9 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLocalBroadcastManagerTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowLocalBroadcastManagerTest.java
@@ -28,14 +28,16 @@
 
   @Test
   public void shouldGetInstance() throws Exception {
-    LocalBroadcastManager instance = LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+    LocalBroadcastManager instance =
+        LocalBroadcastManager.getInstance(RuntimeEnvironment.getApplication());
     assertNotNull(instance);
-    assertSame(instance, LocalBroadcastManager.getInstance(RuntimeEnvironment.application));
+    assertSame(instance, LocalBroadcastManager.getInstance(RuntimeEnvironment.getApplication()));
   }
 
   @Test
   public void shouldSendBroadcasts() throws Exception {
-    LocalBroadcastManager instance = LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+    LocalBroadcastManager instance =
+        LocalBroadcastManager.getInstance(RuntimeEnvironment.getApplication());
     final boolean[] called = new boolean[1];
     final BroadcastReceiver receiver = new BroadcastReceiver() {
       @Override
@@ -55,7 +57,8 @@
   
   @Test
   public void shouldSendBroadcastsWithDataScheme() throws Exception {
-    LocalBroadcastManager instance = LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+    LocalBroadcastManager instance =
+        LocalBroadcastManager.getInstance(RuntimeEnvironment.getApplication());
     final boolean[] called = new boolean[1];
     final BroadcastReceiver receiver = new BroadcastReceiver() {
       @Override
@@ -77,7 +80,8 @@
 
   @Test
   public void shouldUnregisterReceiver() throws Exception {
-    LocalBroadcastManager instance = LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+    LocalBroadcastManager instance =
+        LocalBroadcastManager.getInstance(RuntimeEnvironment.getApplication());
     final boolean[] called = new boolean[1];
     final BroadcastReceiver receiver = new BroadcastReceiver() {
       @Override
@@ -94,7 +98,8 @@
 
   @Test
   public void testGetBroadcastIntents() throws Exception {
-    LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+    LocalBroadcastManager broadcastManager =
+        LocalBroadcastManager.getInstance(RuntimeEnvironment.getApplication());
     broadcastManager.registerReceiver(new BroadcastReceiver() {
       @Override public void onReceive(Context context, Intent intent) {
         transcript.add("got intent " + intent.getAction());
@@ -113,7 +118,8 @@
 
   @Test
   public void testGetRegisteredBroadcastReceivers() throws Exception {
-    LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+    LocalBroadcastManager broadcastManager =
+        LocalBroadcastManager.getInstance(RuntimeEnvironment.getApplication());
     ShadowLocalBroadcastManager shadowLocalBroadcastManager = shadowBroadcast(broadcastManager);
     assertEquals(0, shadowLocalBroadcastManager.getRegisteredBroadcastReceivers().size());
 
@@ -136,7 +142,8 @@
 
   @Test
   public void testGetSentBroadcastIntents() throws Exception {
-    LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+    LocalBroadcastManager broadcastManager =
+        LocalBroadcastManager.getInstance(RuntimeEnvironment.getApplication());
     ShadowLocalBroadcastManager shadowLocalBroadcastManager = shadowBroadcast(broadcastManager);
     assertEquals(0, shadowLocalBroadcastManager.getSentBroadcastIntents().size());
 
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowMediaBrowserCompatTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowMediaBrowserCompatTest.java
index 57d7f12..7a9a9a6 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowMediaBrowserCompatTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowMediaBrowserCompatTest.java
@@ -25,7 +25,7 @@
 @RunWith(AndroidJUnit4.class)
 public class ShadowMediaBrowserCompatTest {
 
-  private Context context = RuntimeEnvironment.application;
+  private Context context = RuntimeEnvironment.getApplication();
   private MediaBrowserCompat mediaBrowser;
   private ShadowMediaBrowserCompat shadow;
 
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowPausedAsyncTaskLoaderTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowPausedAsyncTaskLoaderTest.java
index 8e3c362..888cad9 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowPausedAsyncTaskLoaderTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowPausedAsyncTaskLoaderTest.java
@@ -73,7 +73,7 @@
     private Integer data;
 
     public TestLoader(Integer data) {
-      super(RuntimeEnvironment.application);
+      super(RuntimeEnvironment.getApplication());
       this.data = data;
     }
 
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowSwipeRefreshLayoutTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowSwipeRefreshLayoutTest.java
index f666528..8cd324e 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowSwipeRefreshLayoutTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowSwipeRefreshLayoutTest.java
@@ -18,7 +18,7 @@
   public void getOnRefreshListener_shouldReturnTheListener() {
     final OnRefreshListener listener = mock(OnRefreshListener.class);
 
-    final SwipeRefreshLayout layout = new SwipeRefreshLayout(RuntimeEnvironment.application);
+    final SwipeRefreshLayout layout = new SwipeRefreshLayout(RuntimeEnvironment.getApplication());
     layout.setOnRefreshListener(listener);
 
     assertThat(shadowOf(layout).getOnRefreshListener()).isSameInstanceAs(listener);
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowViewPagerTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowViewPagerTest.java
index c56bf63..2dfaeb5 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowViewPagerTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowViewPagerTest.java
@@ -23,7 +23,7 @@
 
   @Before
   public void setUp() throws Exception {
-    pager = new ViewPager(RuntimeEnvironment.application);
+    pager = new ViewPager(RuntimeEnvironment.getApplication());
     adapter = new TestPagerAdapter();
   }