web-dev-qa-db-ja.com

システムアプリとAndroidの特権アプリの違いは何ですか?

4.3には、システムアプリケーションという概念がありました。 /system/appに配置されたAPKにはシステム権限が付与されました。 4.4では、「特権アプリ」という新しい概念があります。特権アプリは/system/priv-appディレクトリに保存され、異なる方法で処理されるようです。 PackageManagerServiceの下のAOSPソースコードを見ると、次のような新しいメソッドが表示されます。

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より大きいパッケージマネージャーにアクティビティを追加できないことを意味するようです。これはnot私が知る限り特権アプリを排除します(ここには多くのロジックがあり、間違っているかもしれません)。

私の質問は、これが正確に何を意味するのでしょうか?アプリに特権はあるがシステムにはない場合、どのような違いがありますか? PackageManagerServiceには、システムアプリと特権アプリで異なるさまざまなものがありますが、それらはまったく同じではありません。特権アプリの背後にはある種のイデオロギーがあるはずです。そうでなければ、彼らはただ言ったでしょう:

if locationIsPrivileged: app.flags |= FLAG_SYSTEM

そしてそれで行われました。これは新しい概念です。4.4の時点でAOSP開発を行っている人にとって、これらの種類のアプリの違いを知ることは重要だと思います。

56
Andrew T.

少し掘り下げた後、priv-appのアプリがシステム権限の対象であることは明らかです。これは、以前のアプリがsystem-appにいることでシステム権限を要求する資格があったのと同じです。私がこれについて見つけることができる唯一の公式のGoogleドキュメントは、コミットメッセージの形で来ました:コミットハッシュ:ccbf84f44c9e6a5ed3c08673614826bb237afc54

一部のシステムアプリは他のシステムアプリよりも多くのシステムです

/ systemパーティションにあるすべてのアプリが「signatureOrSystem」権限を使用できなくなりました。代わりに、新しい/ system/priv-appディレクトリがあり、APKがそのディレクトリにあるアプリのみがプラットフォーム証明書を共有せずにsignatureOrSystem権限を使用できます。これにより、システムにバンドルされたアプリケーションが悪用される可能性のある表面積が減少し、権限で保護された操作へのアクセスが試行されます。

ApplicationInfo.FLAG_SYSTEMフラグは、ドキュメントに記載されていることを引き続き意味します。アプリケーションapkが/ systemパーティションにバンドルされたことを示します。これらの許可にアクセスする実際の権利を反映する新しい隠しフラグFLAG_PRIVILEGEDが導入されました。

更新:Android 8.0 priv-appは特権権限ホワイトリストの追加によりわずかに変更されました。さまざまなシステム権限。これに関する情報は、ここにあります: https://source.Android.com/devices/tech/config/perms-whitelist

71
Andrew T.