安装的方式
常见的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
这个类,它完成安装包的解析,同时在解析完后让用户确认。
安装的大体流程
不管是什么的方式,接近硬件层的流程是一样的。
- 将APK文件拷贝到指定目录,系统应用是在
/system/app
, 第三方应用在/data/app
- 如一款第三方app的目录
- 注意第三方应用的apk名字都统一变成了base.apk,而系统应用的名字保持不变
- 如一款第三方app的目录
- 解压apk,拷贝需要的文件,同时创建UID,创建
/data/data/${package_name}
目录,设置权限 - 从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
- 第三方App:
- 解析AndroidManifest.xml文件,提取信息添加到PMS中,更新PMS中的数据结构。具体的操作是更新
/data/system/packages.list
和/data/system/packages.xml
的信息。 - 发送系统广播
Intent.ACTION_PACKAGE_ADDED
或者Intent.ACTION_PACKAGE_REPLACED