Где хранятся UID для каждого приложения?

При установке приложения Android присваивает ему уникальный UID. Какие файлы используются для отслеживания используемых UID и кому они принадлежат? Я хочу принудительно изменить UID приложения, чтобы они были одинаковыми на разных устройствах.

Я уже проверил с /data/system/packages.xml. Но хотя это содержит разрешения приложения по имени пакета, там не было никакого UID.

Если это зависит от версии Android, для каждой версии выше или равной 4.4.4 и источнику документации, чтобы выяснить это самостоятельно для будущих версий.

Ответы (1)

Вы уже пропустили правильный ответ.
UID хранятся прямо в /data/system/packages.xml, хотя более простая для интерпретации версия с меньшим количеством информации доступна по адресу packages.list.
Вот пример строки того, что внутри (прокрутите вправо)

<package name=" jackpal.androidterm " codePath="/data/app/jackpal.androidterm-1" nativeLibraryPath="/data/app/jackpal.androidterm-1/lib" primaryCpuAbi="armeabi" flags="572996" ft ="1592b6fa088" it="153d4948841" ut="158ed133c1f" версия="71" userId="10001" >

Видите ли, есть userIdXML-атрибут. Это именно тот UID, который вы запрашиваете.
Кроме того, userIdможет быть заменено, sharedUserIdесли приложение делится своим UID с другим. Нравится (также листайте вправо)

<package name="com.android.providers.telephony" codePath="/system/app/TelephonyProvider" nativeLibraryPath="/system/app/TelephonyProvider/lib" primaryCpuAbi="arm64-v8a" flags="540165" ft=" 159d34468e8" it="4ba52c60" ut="159d34468e8" версия="1" sharedUserId="1001" >

Конечно, вы не хотите проходить через это ужасно долго packages.xml, так что вы можете взглянуть на packages.list, например,

jackpal.androidterm  10001 0 /data/data/jackpal.androidterm по умолчанию 3003,1028,1015

Очень прямо, не так ли? Второе поле, разделенное пробелом, — это именно UID, и оно такое же, как и в packages.xml. Не изменять packages.list. Все несовпадающие записи packages.listбудут исправлены из packages.xml.

Кроме того, можно изменить UID установленного приложения, если у него нет общего UID. Просто отредактируйте packages.xmlи перезагрузитесь, после чего новый UID вступит в силу немедленно. Старые данные для измененного приложения будут удалены. Если вы хотите сохранить данные, применяйте chownрекурсивно к каталогу данных приложения в файлах /data/data. Если старые данные приложения удаляются из-за несоответствия UID, соответствующая информация будет отображаться в /data/system/uiderrors.txt. Так:

01.01.1970 00:00: uid пакета jackpal.androidterm изменен с 0 на 10001, старые данные стерты.

Протестировано на Android с 4 по 5. Думаю, это применимо от Gingerbread до Nougat.

спасибо, я не просмотрел все данные, конечно, первая часть - это разрешения, а затем UID.
Это все еще работает на Android 10? Не могли бы вы объяснить больше, как избежать потери данных? Спасибо.
@Sruly 'chown -Rhv 10001.10001 /data/user*/0/jackpal.androidterm'
@alecxs Похоже, что UID приложения не меняется, он меняет только владельца и группу файлов. Я ищу способ изменить UID приложения, чтобы он совпадал с UID этого приложения на другом устройстве.
@Sruly chown рекурсивно - это «как избежать потери данных» (после редактирования packages.xml из этого ответа)