@SuppressLint("StaticFieldLeak")	// The outer class has no direct reference to Context
	@UiThread private void loadIcon(final @Nullable IconFilter filter, final IconConsumer consumer, final boolean need_badge) {
		if (mCachedIcon == null) try {
			new AsyncTask<Void, Void, Drawable>() {

				@Override protected Drawable doInBackground(final Void... params) {
					return need_badge ? loadIcon(context().getPackageManager()) : loadUnbadgedIconCompat(context().getPackageManager());
				}

				@Override protected void onPostExecute(final Drawable drawable) {
					if (drawable == null) return;        // Might be null if app is currently being removed.
					final Drawable icon = (filter != null ? filter.process(drawable) : drawable);
					mCachedIcon = icon;
					consumer.accept(icon);
				}
			}.executeOnExecutor(TASK_THREAD_POOL);
		} catch (final RejectedExecutionException e) {
			Analytics.$().report(e);        // For statistics purpose
		} else consumer.accept(mCachedIcon);
	}
Is launchable (and neither disabled nor hidden)
mobile/src/main/java/com/oasisfeng/common/app/AppInfo.java