StaticApplicationContextServiceFetcher passes the application
context to the services it creates, but sometimes the application
context can be null. Cases we've seen so far are:
- Apps that (incorrectly) call getSystemService in
attachBaseContext. In this case the passed-in context is what
will become the application context soon afterwards.
- ActivityThread$ApplicationThread.setHttpProxy. In this case the
passed-in context is the system context.
In both of these cases the passed-in context is never freed, so
passing it in to the service will not result in a leak.
Bug:
27532714
Bug:
27502146
Bug:
27337770
Change-Id: I5971c67b0e699d1a77850be8a338a448a96ec7d7
public final T getService(ContextImpl ctx) {
synchronized (StaticApplicationContextServiceFetcher.this) {
if (mCachedInstance == null) {
- mCachedInstance = createService(ctx.getApplicationContext());
+ Context appContext = ctx.getApplicationContext();
+ // If the application context is null, we're either in the system process or
+ // it's the application context very early in app initialization. In both these
+ // cases, the passed-in ContextImpl will not be freed, so it's safe to pass it
+ // to the service. http://b/27532714 .
+ mCachedInstance = createService(appContext != null ? appContext : ctx);
}
return mCachedInstance;
}