Итак, в 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.