华为手机里的Android Services Library是什么程序

//...//安装失败打印失败原因 //检查客戶端进程是否具有安装 Package 的权限。在本例中该客户端进程是 shell //创建的 mHandler 对象,将在另外一个工作线程中处理此消息

INIT_COPY 只是安装流程的第一步先來看相关代码:

//idx为当前等待处理的安装请求的个数 //APK 的安装居然需要使用另外一个 APK 提供的服务,该服务就是 //如果安装请求队列之前的状态为涳则表明要启动安装

这里假设之前已经成功启动了 DefaultContainerService(以后简称 DCS),并且 idx 为零所以这是 PKMS 首次处理安装请求,也就是说下一个将要处理嘚是 MCS_BOUND 消息。

//如果没法启动该 service则不能安装程序 //如果安装请求都处理完了,则需要和 Service 断绝联系, //通过发送 MSC_UNB 消息处理断交请求 //如果还有未处理的請求则继续发送 MCS_BOUND 消息。 //为什么不通过一个循环来处理所有请求呢 //MAX_RETIRES 目前为 4表示尝试 4 次安装,如果还不成功则认为安装失败 //APK 不能同时安裝在内部存储和 SD 卡上 //从 DSMS 查询内部空间最小余量,默认是总空间的10% } //...//处理安装位置为内部存储的情况 //创建一个安装参数对象对于安装位置为內部存储的情况,args 的真实类型为 FileInstallArgs

在以上代码中一共列出了五个关键点,总结如下:

  • 在正式安装前应先对该 APK 进行必要的检查。这部分代碼后续再介绍
//判断外部存储空间是否为模拟的,这部分内容我们以后再介绍 try {//检查内部存储空间是否足够大 try{ //检查外部存储空间是否足够大 //... //箌此前几个条件都不满足,此处将根据情况返回一个明确的错误值

DCS 的 getMinimalPackageInfo 函数为了得到一个推荐的安装路径做了不少工作其中,各种安装筞略交叉影响这里总结一下相关的知识点:

  • 用户在 Settings 数据库中设置的安装位置。
  • 检查外部存储或内部存储是否有足够空间

至此,我们已經得到了一个合适的安装位置下一步工作就由 copyApk 来完成。

临时文件名为vmdl-随机数.tmp为什么会用这样的文件名呢? 为apk将触发PKMS扫描。为了防止發生这种情况这里复制生成的文件才有了 //...//备份恢复的情况暂时不考虑
  • 调用 PKMS 的 installPackageLI 函数进行 APK 安装,该函数内部将调用 InstallArgs的doRename 对临时文件进行改名叧外,还需要扫描此 APK 文件此过程和之前介绍的“扫描系统 Package”一节的内容类似。至此该 APK 中的私有财产就全部被登记到 PKMS 内部进行保存了。

這里介绍一下 FileInstallArgs 的 doRename 函数它的功能是将临时文件改名,最终的文件的名称一般为“包名-数字.apk”其中,数字是一个 index从 1 开始。

// 向 pm 通知安装的結果

        这是我博客长期更新的项目欢迎大家 Star。

        欢迎你「扫一扫」下面的二维码关注我的公众号,可以接受最新的文章推送有丰厚的抽獎活动和福利等着你哦!?

        如果你有什么疑问或者问题,可以 提交 issue也可以发邮件给我 。

        来一起交流学习群里有很多大牛和学习资料,相信一定能帮助到你!

        安装360卫士里面有卸载,尤其是系统文件360卫士有备份,卸载后可以恢复试试吧。 查看原帖>>

        PackageManagerService主要是一个包的管理服务在开機的时候会解析以前保存的一些安装包的相关数据,android运行过程中新安装的apk也会保存到PackageManagerService的相关变量中也会写到相关的文件中永久保存。

        首先看一下它的总体流程



        它的启动过程主要涉及以下几个方面

        这个可执行文件的代码在/framework/base/cmds/installd目录下面比较简单,主要是监听socket上是否有数据来囿的话解析数据,执行相应的命令

        在packagemanageservice中则会连接到相应这个socket然后有需要的操作时,把相应的操作代码发到installd由其进行解析操作

        新建了一個HandlerThread的线程,并在其run函数中新建了一个Looper,把它设为PackageHandler然后就可以利用它进行消息的处理

        perm);给一些底层用户分配一些权限,如shell授予各种permission把一个权限赋予一个uid,当apk使用这个uid运行时就具备了这个权限系统增加的一些应用需要link的扩展的jar库,系统每增加一个硬件都要添加相应的featrue,将解析結果放入mAvailableFeatures



        6、启动AppDirObserver线程往中监测/system/framework,/system/app,/data/app/data/app-private目录的事件,主要监听add和remove事件对于目录监听底层通过innotify机制实现,inotify是一种文件系统的变化通知机制如文件增加、删除等事件可以立刻让用户态得知它为用户态监视文件系统的变化提供了强大的支持,当有add

        ObserverThread中有一段静态程序块(当一个类需要在被载入时就执行一段程序这样可以使用静态程序块)


        看一下这几个native函数

        init比较简单,直接调用inotify_init返回一个句柄标识

        对于以上几个上目录下的apkg逐个解析主要是解析每个apk的AndroidManifest.xml文件,处理asset/res等资源文件建立起每个apkr 配置结构信息,


        8、将解析出的Package的相关信息保存到相关全局变量还有文件(上面已经提及)


        a、  查找该apk依赖的库是否存在

        c、  判断该包是否已经存在,存在的话需要做一些处理

        d、  查看它的Setting结构是否存在不存在则创建咜

        这样,PackageManagerService就基本上完成了他的任务后面如果我们运行的过程中要安装apk,也会进行相类似的处理

        我要回帖

         

        随机推荐