packageinstaller.apk_secsettings.apk_packageinstaller 5.1(2)

电脑杂谈  发布时间:2017-04-01 22:08:18  来源:网络整理

(注:此图引用自相关文档资料,出处连接未知)

首先我们看看在创建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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...