@Nullable String get(final ApplicationInfo info) {
		if (info.nonLocalizedLabel != null) return filterString(info.nonLocalizedLabel.toString());

		final String pkg = info.packageName;
		final int version = Hacks.ApplicationInfo_versionCode.get(info);	// 0 if hack is incompatible
		final String version_key = pkg + KEY_VERSION_CODE_SUFFIX;
		final int cached_version = mStore.getInt(version_key, -1);
		final String cached_label = mStore.getString(pkg, null);
		if (cached_version == version) return cached_label;		// Use cached label only if version is matched.

		// Load label asynchronously
		Log.v(TAG, (cached_version == -1 ? "Load: " : "Reload: ") + info.packageName);
		@SuppressWarnings("unused") @SuppressLint("StaticFieldLeak") final AsyncTask<Void, Void, CharSequence> unused = new AsyncTask<Void, Void, CharSequence>() {

			@Override protected CharSequence doInBackground(final Void... params) {
				return info.loadLabel(mPackageManager);
			}

			@Override protected void onPostExecute(final CharSequence raw_label) {
				final String label = filterString(raw_label.toString());
				mStore.edit().putInt(version_key, version).putString(pkg, label).apply();
				if (Objects.equals(label, cached_label)) return;	// Unchanged
				mCallback.onLabelUpdate(pkg, label);
			}
		}.executeOnExecutor(AppInfo.TASK_THREAD_POOL);
		return null;
	}
Get the cached label if valid. If not cached or invalid, trigger an asynchronous update.
mobile/src/main/java/com/oasisfeng/common/app/AppLabelCache.java