5

この質問は、 Android がアクセス許可を強制する方法で以前に尋ねられましたか? . そこでの議論は良いものですが、質問はまだ完全には答えられていません.

開発環境では、AndroidManifest.xml で宣言されていないアクセス許可を必要とする操作をアプリが実行しようとすると、例外がスローされます。では、ランタイム システムはどのようにランタイム チェックを実装するのでしょうか。

コア フレームワークで行われる可能性が最も高いと思いますが、ネイティブ コードからのサポートが必要な場合と必要でない場合があります。しかし、AOSP のどのソース コード ファイルがこれに関連しているかはわかりません。

4

2 に答える 2

14

Android は、特にハードウェアの制限に関しては、多くの標準 Linux(-kernel?) メカニズムを使用します。

すべてのアプリには新しい一意の (Linux-) ユーザー ID が割り当てられ、アプリ プロセスが作成されるたびに、システムはそのユーザー ID を使用してそれを作成します。アプリを削除しない限り、ID は変更されません。つまり、下位のシステム レベルにアクセスする場合、アプリは特定のユーザーとして表示され、ユーザーと連携するすべての (Linux の) アクセス許可システムもアプリに適用されます。

マニフェストで要求すると、アプリは、そのストレージへの書き込み権限を持つWRITE_EXTERNAL_STORAGE(Linux-) グループ ( と呼ばれる) のメンバーにもなります。ファイルシステムのパーミッションは、ユーザー (=所有者) とグループsdcard_rwへの書き込みのみを許可するように強制され、他のユーザー (=その他) は読み取りのみが許可されます。Googleはアプリの SD カードへの書き込みをブロックしていますかsystemsdcard_rw

そうすることで、Android は、アプリの起動時に生成されるプロセスの正しい UID/GID を設定することを除いて、ほとんど何もする必要がなく、残りは低レベルで処理されます。特定のグループのメンバーではないアプリは、特定のハードウェアにアクセスできません。

パーミッション <> グループ マッピングのリスト: platform.xml

また、アプリの署名に基づいた (Android ソフトウェアの) 制限もいくつかあります。また、アプリが要求したアクセス許可を単に検索することによって行われる制限もあります。例: ContextImpl #checkPermission()制限されたアクションを許可するコード。

ときどき、プログラムで GPS をオンにするなどの方法を発見する人がいます。そのようなチェックがどこかに欠けているからです。

于 2012-04-29T01:40:46.030 に答える
4

2 番目の段落に関して、「例外」はランタイム エラーです。アクセス許可はビルド時には適用されず、実行時にのみ適用されます。

ハードウェア、低レベルのオペレーティング システム リソース、およびシステム ファイルにアクセスするには、通常、アプリのユーザー ID が適切なグループのメンバーである必要があります。このグループは、対応する Android パーミッションを持っていることにより、パッケージ マネージャーによって割り当てられる可能性があります。(そのおなじみの例は、ネットワークソケット、およびzaplが言及したSDカードの書き込みですが、GSMモデムと直接通信したり、生のタッチスクリーン座標を読み取ったりするなどのシステムのみのものもあります)。

異なるプロセスで実行されているサービスへのプロセス間通信用のスタブであるライブラリ関数を呼び出すことによって行われる Android 操作の大部分では、ipc 要求の受信側でより特権のあるプロセスで実行されているプラ​​ットフォーム コードがパッケージをチェックします。 manager を呼び出して、呼び出し元のアプリケーションに必要な Android 権限があるかどうかを確認します。

多くの特別なアクセス許可は、システム署名で署名されたアプリでのみ使用できます。別のアプリがマニフェストでそれらを要求しても、パッケージ マネージャーによって適用されません。

于 2012-04-29T01:58:07.333 に答える