2

Androidソースをダウンロードしました。アプリのアクセス許可がバックエンドでどのように検証されるかを理解したい。

たとえば、アプリがカメラにアクセスしようとした場合、OS はマニフェスト ファイルでアクセス許可を取得しているかどうかをどのように確認しますか。

具体的には、正確なソース フォルダーを調べたいと思います。

編集:コードを少し掘り下げた後、Stephan からの説明のおかげで、framework/base/data/etc/platform.xml でアクセス許可のリストと割り当てられた uid または gid を見つけることができました。

場所、連絡先などにより、シェルへのアクセスが許可されているようです。例えば:

<assign-permission name="android.permission.READ_CONTACTS" uid="shell" />

つまり、アプリのマニフェスト ファイルに READ_CONTACTS 権限がある場合、アプリはデフォルトでその権限を持っているということですか? つまり、検証が実行される場所です。

4

1 に答える 1

2

部分的な答えについては、この本をご覧ください: Embedded Android

私はその本から正しい答えが得られたかどうかを確認できませんでしたが、あなたの質問に関連するその本の私自身の解釈は次のとおりです。誰でも、いつでも私の解釈を自由に修正してください。確かに答えを知っているふりはしません。そして、このパーミッション システムの私自身の解釈が、コードが作業を行っている適切な場所を見つけるのに役立つことを願っています。

これらの種類のアクセス許可はすべて、Linux ファイル グループ ID アクセス許可レベルで透過的に処理されると思います。Android は基本的に、別のオペレーティング システム上に置かれ、それを利用するオペレーティング システムです。

Android では、システム カメラが最初にインストールされると、Linux はシステム カメラに独自のユーザー ID を割り当て、独自のホーム ディレクトリとともに、サービス マネージャーと呼ばれるものにリストされます(完全に別のものである高レベルの Android サービスと混同しないでください)。 )、さらにグループ ID も取得します (複数のカメラのエントリ ポイントを表す単一のグループ ID: 前面カメラ、背面カメラ、および 3D 電話の場合は 2 つ目の背面カメラ)。そのグループ ID (gid) は、基本的には、カメラの許可を表す文字列定数から、インストール時にマッピングされた整数です。

Linux では、すべてのアプリがユーザーであり、すべてのアプリがディレクトリでもありますが、Linux ではすべてがファイルであり、空のディレクトリもファイルであり、デバイスもファイルであり、io もファイルである可能性があります。

そして、ここで物事が少し直感に反するようになると私は信じています。Linux では、各ユーザー アプリには、独自のプロセスを実行するための独自の空のサンドボックスが付属しています。Linux では、 Binderがパーミッション自体を使用して、問題のシステム アプリのハンドルにアクセスし、それをアプリケーションにバインドします。そのため、システム アプリのハンドルとそれに付随するすべての可能な環境変数がなければ、独自のアプリはサンドボックスの外で何かを実行する方法を知ることさえできません。プログラムを書いて、関連する import 文を省略しているようなものです。

そのため、Android では、使用している機能の権限を省略しても、システムは「これを行う権限がありません」と直接通知しません。システムはそれほど多くのことさえ知りません。システムは、見つけられない/アクセスできない何かを実行しようとしたことだけを知っています (何らかの理由で、それが知っているすべてのソースファイル内のタイプミスである可能性があります)。そのため、ほとんどの場合、許可を含めるのを忘れただけで、システムは、あたかも火星人に話しかけたかのように、顔に大きな困惑した表情を見せます.

また、Android 開発ツールの作成者が、特定のアクセス許可を含めるのを忘れている可能性があるというヒントを提供するのが上手になったのは、つい最近のことです。パーミッションを忘れることは、特に初心者の間で犯しやすい間違いです。これは、適切な IDE/ツールチェーン自動化ツールを使用して永久に消えるエラーです。

于 2013-11-03T02:42:35.240 に答える