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

так в 4.3 появилась концепция системных приложений. APKs, которые были помещены в /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.

3 ответов


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

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

разрешения"signatureOrSystem" больше не являются доступно для всех приложений проживание в разделе / system. Зато есть новый /system / priv-каталог приложений и только приложения, APKs которых находятся в этом каталоге каталогу разрешено использовать разрешения signatureOrSystem без совместное использование сертификата платформы. Это уменьшит поверхностную область для возможные эксплойты системных приложений, чтобы попытаться получить доступ к охраняемым разрешениям.

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

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


мое obesrvation было, priv-app имеет разрешение root. предположим, если вы установите корневое приложение в system / app, ему все равно потребуется supersu для предоставления root. Но если вы устанавливаете одно и то же корневое приложение в system/priv-app, вам вообще не нужен supersu. Я наблюдал это, экспериментируя с ПЗУ, очищая все приложения chineese n, устанавливая adaway, titanium и т. д.


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