重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
上面 主要分析到APK的copy过程,这里我们开始分析APK的加载过程。直接看之前流程进行到下一步的 processPendingInstall() 方法:
创新互联建站专注于龙陵网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供龙陵营销型网站建设,龙陵网站制作、龙陵网页设计、龙陵网站官网定制、小程序定制开发服务,打造龙陵网络公司原创品牌,更为您提供龙陵网站排名全网营销落地服务。
installPackagesLI() 可以支持单包和多包加载,加载主要分为4个阶段:
执行完2-2的 scanPackageTrackLI() 之后Pms的两大核心数据结构都已经准备好了,一个是代表扫描结果的final ArrayMapString, PackageParser.Package mPackages = new ArrayMap();中的PackageParser.Package,另外一个是mSettings.mPackages的PackageSetting 数据结构,这两个结构PackageParser.Package代表扫描结果,为静态数据,扫描完成后就不会发生变化。PackageSetting用于存储安装应用的动态数据,如权限授予情况等。PackageParser.Package由于是静态数据,扫描apk就可以获取。PackageSetting生成之后会被记录到文件中,以后每次系统启动都会重新加载。
个人了解到的静默安装的方式有以下4种:
我看了一些第三方的应用市场,一般在设置下都会有前两种静默安装的方式可供选择,而后两种静默安装的方式主要是厂商自己的应用市场使用。
如果在7.0的系统上使用第三种静默安装的方式会出现以下错误:
参考:
Android7.0的静默安装失败问题研究
Android N 静默安装和卸载
主要步骤如下:
我试了以上两篇文章的介绍的方法,还是失败,提示Failure [null],不知道怎么破了,可能是厂商的定制问题吧。。。还在思考中。。。
Android App的安装可以分为有界面的安装和无界面的安装。
有界面的安装其实就是调用系统App(PackageInstaller)去安装apk,打开安装apk应用之后,点击安装按钮执行startInstall方法,然后就进入安装中界面开始安装,安装成功或者失败都会有对应的回调。内部其实也是使用PackageManager的installExistingPackage方法,通过binder机制,调用到PackageManagerService的installExistingPackage方法,最终调用到installExistingPackageAsUser方法安装,而 安装的核心原理其实就是将apk文件拷贝到系统可识别的重要的文件目录 :
无界面安装是调用adb命令,执行到一个c写的commandline脚本,调用 install_app 方法,然后再调用 pm_command ,然后执行到pm脚本,执行 run 方法,调用 runinstall ,然后调用 installPackageAsUser 通过AMS执行安装。
说到App的启动,就需要从开机开始说起,Android开机会先把所有应用安装一遍就是把apk拷贝到对应的目录(这也是Android开机慢的原因)。
整个流程如下:
其实App的启动,除了刚开机是不一样之外,正常时候基本与Activity的启动非常接近。