2.安装时作用

2.1 准备知识

在介绍LOCAL_PRIVILEGED_MODULE在安装时的作用之前,先介绍几个关键的准备知识:
(1)packages.xml
这个文件位于ROM设备的 data/system,读取需要root权限。记录系统中所有安装的应用信息,包含基本信息、签名和权限等。
举几个关键字段为例:
name 包名
codePath 应用安装的路径,非系统应用一般在/data/app/xxx,或者SD卡上;系统应用一般在/system/app/xxx或/system/priv-app/xxx
nativeLibraryPath 应用中本地库安装路径,一般在codePath/lib
version 版本号
userId/sharedUserId 应用的userId
(2)PMS的扫描(scan)与安装(install)
PMS,即PackageManagerService,是安卓框架层核心系统服务之一,常驻内存,实现与app安装、卸载相关功能。PMS对应的主要源代码为 frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java。下面部分内容引自刘超《深入解析Android5.0系统》中对于PMS的总结。
扫描:PMS启动的时候,会扫描所有的apk文件和jar包,把它们的信息读取出来,保存在内存中。扫描过程中如果遇到没有优化的文件,会执行转换,将app文件从dex格式转成odex。扫描的逻辑在PMS构造方法中调用,下面是构造方法中的一部分相关逻辑:

    public PackageManagerService(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {......// Collect vendor overlay packages.// (Do this before scanning any apps.)// For security and version matching reason, only consider// overlay packages if they reside in VENDOR_OVERLAY_DIR.File vendorOverlayDir = new File(VENDOR_OVERLAY_DIR);scanDirLI(vendorOverlayDir, PackageParser.PARSE_IS_SYSTEM| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags | SCAN_TRUSTED_OVERLAY, 0);// Find base frameworks (resource packages without code).scanDirLI(frameworkDir, PackageParser.PARSE_IS_SYSTEM| PackageParser.PARSE_IS_SYSTEM_DIR| PackageParser.PARSE_IS_PRIVILEGED,scanFlags | SCAN_NO_DEX, 0);// Collected privileged system packages.final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app");scanDirLI(privilegedAppDir, PackageParser.PARSE_IS_SYSTEM| PackageParser.PARSE_IS_SYSTEM_DIR| PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0);// Collect ordinary system packages.final File systemAppDir = new File(Environment.getRootDirectory(), "app");scanDirLI(systemAppDir, PackageParser.PARSE_IS_SYSTEM| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);// Collect all vendor packages.File vendorAppDir = new File("/vendor/app");try {vendorAppDir = vendorAppDir.getCanonicalFile();} catch (IOException e) {// failed to look up canonical path, continue with original one}scanDirLI(vendorAppDir, PackageParser.PARSE_IS_SYSTEM| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);// Collect all OEM packages.final File oemAppDir = new File(Environment.getOemDirectory(), "app");scanDirLI(oemAppDir, PackageParser.PARSE_IS_SYSTEM| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);......}

安装:主要分为两个阶段,第一阶段是复制文件,把需要安装的apk复制到 /data/app;第二阶段是装载应用,把应用转成odex,为应用创建数据目录,把应用的信息装载进PMS的数据结构中。
非系统应用和系统应用的区别在于,系统应用并不存在安装的阶段,系统应用是随ROM出厂烧写到手机设备上,位于 system/app和system/priv-app。
(3)PMS对外提供的信息查询接口
由(2)可知,通过扫描和安装,PMS已经将应用的信息装载到了内存。我们知道,Android的公开API中有各种各样的XXXManager,第三方应用可以使用它们很方便地获取各种信息和能力。这些Manager大都在后台对应着某个系统应用。PMS的前台就是大名鼎鼎的PackageManager。所以你通过调用PackageManager查询某个应用的相关信息,实际上使用的就是PMS(2)中得到的缓存。举一个例子,下面代码通过PackageManager公开接口获取微信的一些信息:

    private void test2() {PackageManager packageManager = getApplicationContext().getPackageManager();try {PackageInfo packageInfo = packageManager.getPackageInfo("com.tencent.mm",PackageManager.GET_ACTIVITIES);Log.i("TEST_PMR", "packageName : " + packageInfo.packageName);Log.i("TEST_PMR", "versionName : " + packageInfo.versionName);Log.i("TEST_PMR", "versionCode : " + packageInfo.versionCode);Log.i("TEST_PMR", "sharedUserId : " + packageInfo.sharedUserId);Log.i("TEST_PMR", "dataDir : " + packageInfo.applicationInfo.dataDir);Log.i("TEST_PMR", "nativeLibraryDir : " + packageInfo.applicationInfo.nativeLibraryDir);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}}

输出:

07-17 20:20:50.599 14661 14661 I TEST_PMR: packageName : com.tencent.mm
07-17 20:20:50.600 14661 14661 I TEST_PMR: versionName : 6.5.10
07-17 20:20:50.600 14661 14661 I TEST_PMR: versionCode : 1080
07-17 20:20:50.600 14661 14661 I TEST_PMR: sharedUserId : null
07-17 20:20:50.600 14661 14661 I TEST_PMR: dataDir : /data/user/0/com.tencent.mm
07-17 20:20:50.600 14661 14661 I TEST_PMR: nativeLibraryDir : /data/app/com.tencent.mm-1/lib/arm

LOCAL_PRIVILEGED_MODULE 详解(1)
LOCAL_PRIVILEGED_MODULE 详解(2)
LOCAL_PRIVILEGED_MODULE 详解(3)
LOCAL_PRIVILEGED_MODULE 详解(4)
LOCAL_PRIVILEGED_MODULE 详解(5)

LOCAL_PRIVILEGED_MODULE 详解(2)相关推荐

  1. LOCAL_PRIVILEGED_MODULE 详解(1)

    LOCAL_PRIVILEGED_MODULE 是Android ROM编译时的一个变量,其与编译.安装.权限管理等几个方面都有关系.本文整理一下与LOCAL_PRIVILEGED_MODULE有关的 ...

  2. LOCAL_PRIVILEGED_MODULE 详解(4)

    2.3 packages.xml中的privateFlags字段 前文提到,packages.xml 这个文件位于ROM设备的 data/system,读取需要root权限.记录系统中所有安装的应用信 ...

  3. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  4. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  5. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  6. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  7. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  8. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  9. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

最新文章

  1. python np.arange,np.linspace和np.logspace之间的区别
  2. 【LeetCode】LC1672. 最富有客户的资产总量
  3. mysql的索引和执行计划
  4. 获取Http请求参数
  5. android alphaanimation xml,android AlphaAnimation动画代码实现与XML实现
  6. mysql 数据增量备份_mysqlmysqldump数据备份和增量备份
  7. xp系统粘贴是灰色的_XP系统无法复制粘贴要怎么解决?
  8. PFC颗粒6.0软件模拟---工程案例
  9. 77GHz雷达信号处理流程框图及应用方案
  10. 报表分析工具有哪些?常见开源报表工具和商用报表工具介绍
  11. Android 获取日历日程事件
  12. 值得看看的艺术影片 (转)
  13. 关于EasyRecovery工具数据恢复的原理
  14. C#代码审计实战+前置知识
  15. python实例属性
  16. JAVA网易云热评接口_网易云音乐热评爬虫(一): 反编译加密参数
  17. codevs 3061 质子撞击炮②
  18. 尚学堂java实战第四章课后习题
  19. python 黑屏检测
  20. RUP之动态结构:迭代开发

热门文章

  1. 【FFmpeg 系列】 SDL 音视频渲染(七)
  2. Knativa 基于流量的灰度发布和自动弹性实践
  3. 社交电商模式优化之报单产品
  4. console使用方法介绍
  5. 【数据结构课程设计】关键路径问题
  6. 【深度学习】实验2答案:构建自己的多层感知机
  7. php发布文章时 未定义索引,关于php:提交表单时未定义索引错误
  8. 软件经济学三:降低软件规模或者复杂度
  9. 乌镇AI论坛最全盘点:中国互联网半壁江山坐在了一起,他们怎么看AI
  10. 蓝牙电子秤方案_IC/PCBA