安装的方式

常见的APK安装方式有:

各种安装方式的特点

系统自带和预装

在手机首次启动时,会通过扫描/system/app//system/framework//vendor/app/等目录下面的APK文件,完成安装;如果是Android的原生系统,则没有/vendor/app/目录。

adb命令方式

adb安装有2种方式:

adb install XXX.apk adb shell pm install XXX.apk

它们实质的操作是一样的,都是调用了/bin/pm的install命令完成安装。

进一步思考:如何将自己的app做成系统app?

将APK文件推送到/system/app//system/framework//vendor/app/目录下,该App便成为系统预装App,没有root权限不能卸载该应用。但这种操作需要得到root权限,基本没啥卵用~

下载安装和第三方安装

这种方式基本就是通过PackageManager的installPackage()方法来完成工作的,而这个方法最终是调用PackageManagerService的installPackage完成。这里还会涉及到PackageInstallerActivity这个类,它完成安装包的解析,同时在解析完后让用户确认。

安装的大体流程

不管是什么的方式,接近硬件层的流程是一样的。

  1. 将APK文件拷贝到指定目录,系统应用是在/system/app, 第三方应用在/data/app
    • 如一款第三方app的目录
    • 注意第三方应用的apk名字都统一变成了base.apk,而系统应用的名字保持不变
  2. 解压apk,拷贝需要的文件,同时创建UID,创建/data/data/${package_name}目录,设置权限
  3. 从apk中提取dex文件,放到/data/dalvik-cache目录下。这里面文件的存放名字是是有固定格式的
    • 第三方App:data@app@${package_name}@[email protected]
    • 系统App:system@priv-app@${package_name}@[email protected]
    • 这里有一点需要注意,不管app是否有多个dex,在这里只有一个大的dex。但是这个dex不是真实的dex
  4. 解析AndroidManifest.xml文件,提取信息添加到PMS中,更新PMS中的数据结构。具体的操作是更新/data/system/packages.list/data/system/packages.xml的信息。
  5. 发送系统广播Intent.ACTION_PACKAGE_ADDED或者Intent.ACTION_PACKAGE_REPLACED

results matching ""

    No results matching ""