
(注:此图引用自相关文档资料,出处连接未知)
首先我们看看在创建PackageManagerService的时候,其构造器完成了哪些事情,为了介绍主要的实现思路,就屏蔽掉了很多细节实现,以下就是代码实现:
(1)创建Handler、获取相关系统目录路径
Looper l = Looper.prepare(); mHandlerThread.start(); mHandler = new PackageHandler(mHandlerThread.getLooper()); // -------------------------- 以下获取系统的目录 File dataDir = Environment.getDataDirectory(); mAppDataDir = new File(dataDir, "data"); mAppInstallDir = new File(dataDir, "app"); mAppLibInstallDir = new File(dataDir, "app-lib"); mAsecInternalPath = new File(dataDir, "app-asec").getPath(); mUserAppDataDir = new File(dataDir, "user"); mDrmAppPrivateInstallDir = new File(dataDir, "app-private");注意一下第二行和第三行,mHandlerThread是一个HandlerThread‘对象,用于帮我们快速创建Handler对象,我们都知道在创建Handler对象之前,在当前线程必须已经调用了Looper.prapare()方法,HandlerThread就帮我们简化了这些步骤,使得我们可以在任何时候地点创建Handler对象。
实例化Handler对象后就会获取一系列的相关系统目录路径:system/data、system/app等等,接下来我们主要看看AndroidMainfest.xml文件是如何被解析的。
(2)从system/etc/permission读取权限
void readPermissions() {
// Read permissions from .../etc/permission directory.
File libraryDir = new File(Environment.getRootDirectory(),
"etc/permissions");
// 首先判断是否存在,或者是否是目录
if (!libraryDir.exists() || !libraryDir.isDirectory()) {
Slog.w(TAG, "No directory " + libraryDir + ", skipping");
return;
}
// 是否可读
if (!libraryDir.canRead()) {
Slog.w(TAG, "Directory " + libraryDir + " cannot be read");
return;
}
// Iterate over the files in the directory and scan .xml files
for (File f : libraryDir.listFiles()) {
// 最后读取平台上的所有权限
if (f.getPath().endsWith("etc/permissions/platform.xml")) {
continue;
}
// 是否是xml文件
if (!f.getPath().endsWith(".xml")) {
Slog.i(TAG, "Non-xml file " + f + " in " + libraryDir
+ " directory, ignoring");
continue;
}
// xml文件是否可读
if (!f.canRead()) {
Slog.w(TAG, "Permissions library file " + f + " cannot be read");
continue;
}
readPermissionsFromXml(f);
}
// Read permissions from .../etc/permissions/platform.xml last so it
// will take precedence
// 最后读取平台的权限文件,这样他就有优先权了
final File permFile = new File(Environment.getRootDirectory(),
"etc/permissions/platform.xml");
readPermissionsFromXml(permFile);
}
上述步骤就读取了Android系统平台上应用的所有权限了(platform.xml),包括我们在做app开发时常用的、定位、SD卡读写、电话状态等等权限。至于readPermissionsFromXml()方法读取XML的具体实现这里就不贴出来了,其实就是一个XML的Pull解析,这种解析在Android系统中很常见。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-38912-2.html
这下麻烦了
是跟一直在打仗的美国人学的
好棒啊