要約:(systemReady後)PackageManagerServiceは、対応するアクセス許可を走査するさまざまなXML /システムの/ etc /許可が後で使用するために格納されて作られ
この記事を読んで、約15分かかります。
ソースコード解析から、メインの記事の内容や、長くて退屈なものの、しかし、あなたは、Androidシステムのソースコードを知りたい場合、何のショートカットを道を行くんする必要があります。
破片学習に関しては、私はより多くの停止に傾斜し、深刻な内容の1時間の学習期間を費やしています。
マイクロチャンネル公衆番号を開始する記事:大きな猫の再生プログラム
Androidのシステム・レベルのソースコード分析に焦点を当て、Androidプラットフォームの設計、私には歓迎の注意は、ありがとうございました!
1で許可がPKMSをスキャンするかどうかを確認するには、このセクションのワークフローPackageManagerServiceを見ました。
シリーズ:
initプロセスを開始する[3]のAndroid 10.0システム
SystemServerのプロセスを開始する[5] Androidの10.0システム
[6] Androidシステムサービスの10.0 ActivityMnagerService
[7]ランチャー(デスクトップ)のAndroid10.0ブートプロセスを開始します
[8] Android10.0アプリケーションプロセスならびに接合子フォークプロセスの作成
[9] Androidの10.0 PackageManagerService()で動作し、プロセスを開始 - [Androidは仕方を学びます]
5つのスキャン権
SystemConfig readPermissionsFromXmlスルーPKMS systemReady(時間)は、()は、XMLファイルを読み込むために、メインワーク特徴platform.xml様々なハードウェアおよびシステムサポートモジュールのスキャン/システムの/ etc /権限:
図の横に参照します。
ここでは上記の分析に向けられています
5.1 [SystemConfig.java] readPermissions()
説明:ファイル内のスキャン/システムの/ etc /許可、コール
readPermissionsFromXml()は、配列変数のSsytemConfig対応する部材に解析され
void readPermissions(File libraryDir, int permissionFlag) {
...
// Iterate over the files in the directory and scan .xml files
File platformFile = null;
for (File f : libraryDir.listFiles()) {
if (!f.isFile()) {
continue;
}
// 最后读取platform.xml
if (f.getPath().endsWith("etc/permissions/platform.xml")) {
platformFile = f;
continue;
}
...
readPermissionsFromXml(f, permissionFlag);
}
// Read platform permissions last so it will take precedence
if (platformFile != null) {
readPermissionsFromXml(platformFile, permissionFlag);
}
}
mGlobalGids、mPermissions、mSystemPermissionsおよびその他の呼び出しのための変数の他のメンバーへのパースXMLタグ・ノード
private void readPermissionsFromXml(File permFile, int permissionFlag) {
FileReader permReader = null;
permReader = new FileReader(permFile);
...
XmlPullParser parser = Xml.newPullParser();
parser.setInput(permReader);
while (true) {
...
String name = parser.getName();
switch (name) {
//解析 group 标签,前面介绍的 XML 文件中没有单独使用该标签的地方
case "group": {
String gidStr = parser.getAttributeValue(null, "gid");
if (gidStr != null) {
int gid = android.os.Process.getGidForName(gidStr);
//转换 XML 中的 gid字符串为整型,并保存到 mGlobalGids 中
mGlobalGids = appendInt(mGlobalGids, gid);
} else {
Slog.w(TAG, "<" + name + "> without gid in " + permFile + " at "
+ parser.getPositionDescription());
}
...
}break;
case "permission": { //解析 permission 标签
if (allowPermissions) {
String perm = parser.getAttributeValue(null, "name");
if (perm == null) {
Slog.w(TAG, "<" + name + "> without name in " + permFile + " at "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
break;
}
perm = perm.intern();
readPermission(parser, perm); //调用 readPermission 处理,存入mPermissions
} else {
logNotAllowedInPartition(name, permFile, parser);
XmlUtils.skipCurrentTag(parser);
}
} break;
}
}
}
5.2 XMLファイル
/システムは、/ etc /パーミッションは、たとえば、私たちが見て、xmlファイルの多くが存在します
android.software.webview.xmlファイルには、次の通り:
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<feature name="android.software.webview" />
</permissions>
唯一の「android.software.webview」1つの特徴だけを持っている、XML定義のほとんどは、同様の方法があります。
さんは/system/etc/permissions/platform.xmlの内容の簡単な見てみましょう
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<permission name="android.permission.BLUETOOTH_ADMIN" >
<group gid="net_bt_admin" />
</permission>
<permission name="android.permission.INTERNET" >
<group gid="inet" />
</permission>
<permission name="android.permission.READ_LOGS" >
<group gid="log" />
</permission>
...
<assign-permission name="android.permission.MODIFY_AUDIO_SETTINGS" uid="media" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="media" />
<assign-permission name="android.permission.WAKE_LOCK" uid="media" />
...
<split-permission name="android.permission.ACCESS_FINE_LOCATION">
<new-permission name="android.permission.ACCESS_COARSE_LOCATION" />
</split-permission>
<split-permission name="android.permission.WRITE_EXTERNAL_STORAGE">
<new-permission name="android.permission.READ_EXTERNAL_STORAGE" />
</split-permission>
<split-permission name="android.permission.READ_CONTACTS"
targetSdk="16">
<new-permission name="android.permission.READ_CALL_LOG" />
</split-permission>
...
<library name="android.test.base"
file="/system/framework/android.test.base.jar" />
<library name="android.test.mock"
file="/system/framework/android.test.mock.jar"
dependency="android.test.base" />
<library name="android.test.runner"
file="/system/framework/android.test.runner.jar"
dependency="android.test.base:android.test.mock" />
<!-- In BOOT_JARS historically, and now added to legacy applications. -->
<library name="android.hidl.base-V1.0-java"
file="/system/framework/android.hidl.base-V1.0-java.jar" />
<library name="android.hidl.manager-V1.0-java"
file="/system/framework/android.hidl.manager-V1.0-java.jar"
dependency="android.hidl.base-V1.0-java" />
...
</permissions>
ラベルの種類に表示されplatform.xmlより多様で、その意味は次のとおりです。
-
<グループ>:名取得GID
-
<許可>タグ:説明<グループ>ユーザーグループのプロパティは、タグ、権利グループは、それはまた、APKこの権限はこれに発行されたときに、1つまたは複数のオブジェクトを有していてもよく表さgidをに与えられた権限の属性名それはいくつかのグループに属しています
-
<割り当て許可>タグ:属性名は、UIDによって表される属性にユーザーに与えられた権限に説明
-
<スプリット許可>タグ:新しい権限を拡大するための権限
-
<ライブラリ>タグ:動的なフレームワーク、ダイナミックライブラリ以外の、すべてのシステムが自動的にロード
-
<特集>タグ:いくつかの機能をハードウェアでサポート
-
<OEMが許可>タグ:一部の権限のOEMメーカー独自の定義
-
<privapp-permission>标签:来自system、vendor、product、system_ext的privapp权限分别存储,这是防止供应商分区中的xml授权于系统分区中的私有应用权限
最后将上面xml解析出来的数据做如下存储:
-
<group>标签gid属性的值会存放在mGlobalGids数组中;
-
<permission>标签,解析得到的值会存放在mPermissions集合中;
-
<assign-permission>标签解析得到的值会存放在mSystemPermissions中;
-
<split-permission>存储在mSplitPermissions
-
<library>标签解析得到的值会存放在mSharedLibraries中;
-
<feature>存储在mAvaliableFeatures
-
<oem-permission>存储在mOemPermissions
-
<privapp-permission>会根据不同的存储路径,分别存储在mVendorPrivAppPermissions、mProductPrivAppPermissions、mSystemExtPrivAppPermissions、mPrivAppPermissions
-
下一节将会讲解PKMS 的APK扫描、安装等内容,欢迎关注我
微信公众号:大猫玩程序