В чем разница между системными приложениями и привилегированными приложениями на Android?

Так в 4.3 появилась концепция системных приложений. APK были размещены в /system/app были даны системные привилегии. Начиная с 4.4 появилась новая концепция "привилегированного приложения". Привилегированные приложения хранятся в /system/priv-app каталог и, кажется, относиться по-разному. Если вы посмотрите в исходном коде AOSP, под PackageManagerService, вы увидите новые методы, такие как

static boolean locationIsPrivileged(File path) {
    try {
        final String privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app")
                .getCanonicalPath();
        return path.getCanonicalPath().startsWith(privilegedAppDir);
    } catch (IOException e) {
        Slog.e(TAG, "Unable to access code path " + path);
    }
    return false;
}

Итак, вот пример ситуации, когда они различаются.

public final void addActivity(PackageParser.Activity a, String type) {
...
if (!systemApp && intent.getPriority() > 0 && "activity".equals(type)) {
                intent.setPriority(0);
                Log.w(TAG, "Package " + a.info.applicationInfo.packageName + " has activity "
                        + a.className + " with priority > 0, forcing to 0");
            }
...

Это влияет на приоритет любых действий, которые не определены как системные приложения. Кажется, это означает, что вы не можете добавить действие в менеджер пакетов, приоритет которого выше 0, если вы не системное приложение. Насколько я могу судить, это не исключает возможности использования привилегированных приложений (здесь много логики, я могу ошибаться).

У меня вопрос, что именно это означает? Если мое приложение будет привилегированным, но не системным, что это изменит? В PackageManagerService Вы можете найти различные вещи, которые отличаются между системными и привилегированными приложениями, но они не совсем одинаковы. За привилегированными приложениями должна быть какая-то идеология, иначе они просто сказали бы:

if locationIsPrivileged: app.flags |= FLAG_SYSTEM

и было сделано с этим. Это новая концепция, и я думаю, что было бы важно узнать разницу между этими типами приложений для всех, кто занимается разработкой AOSP, начиная с 4.4.

2 ответа

Решение

Поэтому после некоторого копания становится ясно, что приложения в priv-app имеют право на системные разрешения, так же, как старые приложения имели право требовать системные разрешения, находясь в system-app. Единственная официальная документация Google, которую я смог найти по этому поводу, пришла в виде сообщения о коммите: Хэш коммита: ccbf84f44c9e6a5ed3c08673614826bb237afc54

Некоторые системные приложения являются более системными, чем другие

Разрешения "signatureOrSystem" больше не доступны для всех приложений, находящихся в разделе / ​​system. Вместо этого существует новый каталог /system/priv-app, и только приложениям, чьи APK находятся в этом каталоге, разрешено использовать разрешения signatureOrSystem без предоставления сертификата платформы. Это уменьшит площадь поверхности для возможных эксплойтов связанных с системой приложений, чтобы попытаться получить доступ к защищенным операциям.

Флаг ApplicationInfo.FLAG_SYSTEM продолжает означать то, что он говорит в документации: он указывает, что apk приложения был включен в раздел / system. Был введен новый скрытый флаг FLAG_PRIVILEGED, который отражает фактическое право доступа к этим разрешениям.

Обновление: По состоянию на Android 8.0 priv-приложение немного изменилось с добавлением белого списка привилегированных разрешений. Помимо того, что вы просто находитесь в priv-app, ваше приложение также должно быть добавлено в белый список для получения различных системных разрешений. Информацию об этом можно найти здесь: https://source.android.com/devices/tech/config/perms-whitelist

Мое обесценение было, priv-app имеет разрешение root. Предположим, что если вы устанавливаете рутированное приложение в system/app, ему все равно потребуется supersu для предоставления root. Но если вы устанавливаете такое же рутированное приложение в system/priv-app, вам вообще не нужен supersu. Я наблюдал это, когда экспериментировал с ромом, чистил все китайские приложения и устанавливал adaway, titanium и т. Д.

Из всего, что я делаю в Интернете, priv-app используется только для приложений Google. Если вам все еще нужно запускать приложения с системными разрешениями, вы должны продолжать использовать /system/app. Метод, который вы публикуете в своих вопросах, фактически используется приложениями Google!

Другие вопросы по тегам