2017/04/04

/system/app と /system/priv-app の違い

今まで、「Android のプリインアプリは `/system/priv-app` にいれておく」と深く考えずに使っていました。
しかし、`/system/` 以下をよく見てみると `/system/app` というディレクトリもあって、apk がインストールされていますAndroid 7.0 (Google APIs) のエミュレーターで確認。

そこで、これらの違いは何なのか調べてみました。


### priv-app 以下だけがシステム権限を持てる

[What's the difference of /system/app/ and /system/priv-app in Kitkat? - Google グループ](https://groups.google.com/forum/#!topic/android-platform/Vsa4IsJcOPE)

> Only apks in /system/priv-app can use "system"-level permissions. Prior to Kitkat, all apks on the system partition could use those permissions.

「(Kitkat 以降は)`/system/priv-app` 以下にある apk だけがシステムレベルのパーミッションを使用できる。 Kitkat より前は `/system` 以下にある全ての apk がシステムレベルのパーミッションを使用できる。」ということのようです。

ただ、以下を読むと、この動作に関しての公式なドキュメントが無いとのこと。
明らかに動作から推測できるので深追いはしていませんが、本来は AOSP のコードを読むなりして裏を取るべきですね。

[Android system apps and stopped state - Stack Overflow](http://stackoverflow.com/questions/17200575/android-system-apps-and-stopped-state)


### どう使い分けるのか
`/system/priv-app` にインストールされているアプリを見ると「電話帳」「カレンダー」等、プライバシーに関わるコンテントプロバイダやサービスが主です。
対して、`/system/app` 以下は UI を提供したり「重要だけど特別な権限はいらなそう」なアプリがインストールされていますEasterEgg ってアプリもインストールされていますが、重要ではないな :-)。

つまり、以下のように使い分けているようです。

- `/system/priv-app`  
  本当にシステム権限を必要とする特権アプリ

- `/system/app`  
  システム権限は必要としないけど、アンインストールはされたくないアプリ


### システム権限とは
システム権限を持つアプリというのは、具体的に言うと `AndroidManifest.xml` に `android:sharedUserId="android.uid.system"` の記述があるアプリですさらに、ROM と同じ署名がされている必要があります。
こういったアプリは `system` ユーザー権限で動作し、Linux OS レベルで様々なアクセス権を持つことができます。

```xml
`first-line: 2; highlight: 4;
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:sharedUserId="android.uid.system"
```

0 件のコメント: