Что такое android: sharedUserLabel и какую дополнительную ценность он добавляет поверх android: sharedUserID? - PullRequest
11 голосов
/ 25 марта 2012

В документации (http://developer.android.com/guide/topics/manifest/manifest-element.html#uid) только утверждается, что я не могу использовать необработанные строки и уровень API, к которому она была добавлена, но не объясняется, почему я хочу ее использовать. Если я уже установил для android: sharedUserID значение"com.foo.bar" какое значение я должен указать в строке, на которую ссылается android: sharedUserLabel, и, самое главное, почему!?

Спасибо

1 Ответ

8 голосов
/ 25 марта 2012

Насколько я понимаю из AOSP, на самом деле вы можете использовать этот ярлык просто для отображения симпатичного имени для пользователя (если у вас несколько процессов в одном и том же uid). Например, вот часть кода в файле RunningState.java:

    // If we couldn't get information about the overall
    // process, try to find something about the uid.
    String[] pkgs = pm.getPackagesForUid(mUid);

    // If there is one package with this uid, that is what we want.
    if (pkgs.length == 1) {
        try {
            ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
            mDisplayLabel = ai.loadLabel(pm);
            mLabel = mDisplayLabel.toString();
            mPackageInfo = ai;
            return;
        } catch (PackageManager.NameNotFoundException e) {
        }
    }

    // If there are multiple, see if one gives us the official name
    // for this uid.
    for (String name : pkgs) {
        try {
            PackageInfo pi = pm.getPackageInfo(name, 0);
            if (pi.sharedUserLabel != 0) {
                CharSequence nm = pm.getText(name,
                        pi.sharedUserLabel, pi.applicationInfo);
                if (nm != null) {
                    mDisplayLabel = nm;
                    mLabel = nm.toString();
                    mPackageInfo = pi.applicationInfo;
                    return;
                }
            }
        } catch (PackageManager.NameNotFoundException e) {
        }
    }

По сути, он делает следующие вещи. Сначала он пытается получить информацию об общем процессе. Если он не находит, он пытается получить информацию, используя UID приложения в качестве параметра (это часть кода, который я дал здесь). Если есть только один пакет с этим UID, информация о процессе получается из этого пакета. Но если есть несколько пакетов (использующих shareUserId), он выполняет итерацию и пытается найти официальное (красивое) имя.

В подтверждение своих слов я нашел следующую строку в MediaProvider:

<!-- Label to show to user for all apps using this UID. -->
<string name="uid_label">Media</string>

Таким образом, все процессы, использующие android:sharedUserId="android.media", будут иметь имя Media.

Я не думаю, что эта функция будет часто использоваться обычными разработчиками и полезна для них.

...