Was ist der Unterschied zwischen System-Apps und privilegierten Apps auf Android?

In 4.3 gab es also ein Konzept für Systemanwendungen. APKs, die in platziert wurden/system/app wurden Systemprivilegien gegeben. Ab 4.4 gibt es ein neues Konzept der "privilegierten App". Privilegierte Apps werden in gespeichert/system/priv-app Verzeichnis und scheinen anders behandelt zu werden. Wenn Sie im AOSP-Quellcode suchen, klicken Sie unterPackageManagerServicesehen Sie neue Methoden wie

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;
}

Hier ist ein Beispiel für eine Situation, in der sich diese unterscheiden.

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");
            }
...

Dies wirkt sich auf die Priorität aller Aktivitäten aus, die nicht als Systemanwendungen definiert sind. Dies scheint zu implizieren, dass Sie dem Paketmanager, dessen Priorität höher als 0 ist, keine Aktivität hinzufügen können, es sei denn, Sie sind eine System-App. Das machtnicht schließe privilegierte Apps aus, soweit ich das beurteilen kann (hier gibt es eine Menge Logik, ich kann mich irren.).

Meine Frage ist, was genau bedeutet das? Welchen Unterschied macht es, wenn meine App privilegiert ist, aber kein System? ImPackageManagerService Sie können verschiedene Dinge finden, die sich zwischen System- und privilegierten Apps unterscheiden, sie sind nicht genau gleich. Es sollte eine Art Ideologie hinter privilegierten Apps geben, sonst hätten sie nur gesagt:

if locationIsPrivileged: app.flags |= FLAG_SYSTEM

und fertig damit. Dies ist ein neues Konzept, und ich denke, es wäre wichtig, den Unterschied zwischen diesen Arten von Apps für alle zu kennen, die AOSP-Entwicklung ab 4.4 durchführen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage