В чем разница между системными приложениями и привилегированными приложениями на 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!