首页 > 其他分享 >PackageInstaller 原理简

PackageInstaller 原理简

时间:2023-04-30 19:07:39浏览次数:42  
标签:PackageInstaller 应用 int final File 原理 安装 目录


)应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作。APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。

Android应用安装有如下四种方式
1 . 系统应用安装――开机时完成,没有安装界面
2 . 网络下载应用安装――通过market应用完成,没有安装界面
3 . ADB工具安装――没有安装界面。
4 . 第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。
应用安装的流程及路径
应用安装涉及到如下几个目录:
system / app 系统自带的应用程序,无法删除
data / app 用户程序安装的目录,有删除权限。
安装时把apk文件复制到此目录
data / data 存放应用程序的数据
Data / dalvik - cache 将apk中的dex文件安装到dalvik - cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)

安装过程:复制APK安装包到data / app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik - cache目录,并data / data目录下创建对应的应用数据目录。
卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。
 

一、系统应用安装:
PackageManager Service处理各种应用的安装,卸载,管理等工作,开机时由systemServer启动此服务
(源文件路径:android\frameworks\base\services\java\com\android\server\ PackageManagerService.java)
 
 
PackageManager Service服务启动的流程:
1 . 首先扫描安装“system\framework”目录下的jar包
1 . scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM,
  scanMode  | SCAN_NO_DEX);
 
 
2 .第二步扫描安装“system\app”目录下的各个系统应用
scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM, scanMode);
 
3 .第三步扫描“data\app”目录,即用户安装的第三方应用
scanDirLI(mAppInstallDir,  0 , scanMode);
 
4 .第四步扫描 " data\app-private " 目录,即安装DRM保护的APK文件(目前没有遇到过此类的应用)。
scanDirLI(mDrmAppPrivateInstallDir,  0 , scanMode  | SCAN_FORWARD_LOCKED);

安装应用的过程
1 .scanDirLI(File dir,  int flags,  int scanMode) 遍历安装指定目录下的文件

2 .scanPackageLI(File scanFile,
  File destCodeFile, File destResourceFile,  int parseFlags,
   int scanMode) 安装package文件

3 .scanPackageLI(
  File scanFile, File destCodeFile, File destResourceFile,
  PackageParser.Package pkg,  int parseFlags,  int scanMode)
通过解析安装包parsePackage获取到安装包的信息结构 

4 .mInstaller.install(pkgName, pkg.applicationInfo.uid,
  pkg.applicationInfo.uid); 实现文件复制的安装过程
(源文件路径:frameworks\base\cmds\installd\installd.install)
 
二、从market上下载应用:
Google Market应用需要使用gmail账户登录才可以使用,选择某一应用后,开始下载安装包,此过程中,在手机的信号区有进度条提示,下载完成后,会自动调用Packagemanager的接口安装,调用接口如下:
public void installPackage( final Uri packageURI,  final IPackageInstallObserver observer,  final int flags)
final Uri packageURI:文件下载完成后保存的路径
final IPackageInstallObserver observer:处理返回的安装结果
final int flags:安装的参数,从market上下载的应用,安装参数为 - r (replace)
installPackage接口函数的安装过程:
1 . public void installPackage(
   final Uri packageURI,  final IPackageInstallObserver observer,  final int flags,
   final String installerPackageName)
final String installerPackageName:安装完成后此名称保存在settings里,一般为null,不是关键参数
2 .File tmpPackageFile  = copyTempInstallFile(packageURI, res);
把apk文件复制到临时目录下的临时文件
3 . private void installPackageLI(Uri pPackageURI,
   int pFlags,  boolean newInstall, String installerPackageName,
  File tmpPackageFile, PackageInstalledInfo res)
解析临时文件,获取应用包名pkgName  = PackageParser.parsePackageName(
  tmpPackageFile.getAbsolutePath(),  0 );
4 .判断如果带有参数INSTALL_REPLACE_EXISTING,则调用replacePackageLI(pkgName,
  tmpPackageFile, 
  destFilePath, destPackageFile, destResourceFile,
  pkg, forwardLocked, newInstall, installerPackageName,
  res)
5 .如果没有,则调用installNewPackageLI(pkgName,
  tmpPackageFile, 
  destFilePath, destPackageFile, destResourceFile,
  pkg, forwardLocked, newInstall, installerPackageName,
  res);
6 . private PackageParser.Package scanPackageLI(
  File scanFile, File destCodeFile, File destResourceFile,
  PackageParser.Package pkg,  int parseFlags,  int scanMode)
scanPackageLI以后的流程,与开机时的应用安装流程相同。
三、从ADB工具安装
Android Debug Bridge (adb) 是SDK自带的管理设备的工具,通过ADB命令行的方式也可以为手机或模拟器安装应用,其入口函数源文件为pm.java 
(源文件路径:android\frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java)
ADB命令行的形式为adb install  < path_to_apk > ,还可以带安装参数如: " -l " " -r " " -i " " -t "
函数runInstall()中判断参数
" -l " ――INSTALL_FORWARD_LOCK
  " -r " —— INSTALL_REPLACE_EXISTING  
" -i " ——installerPackageName
" -t " ——INSTALL_ALLOW_TEST
我们常用的参数为 - r,表示覆盖安装手机上已安装的同名应用。从market上下载的应用,也是直接传入这个参数安装的。
runInstall与market调用同样的接口完成应用安装。
public void installPackage(android.net.Uri packageURI, android.content.pm.IPackageInstallObserver observer,  int flags, java.lang.String installerPackageName)
四、第三方应用安装――通过SD卡里的APK文件安装
把APK安装包保存在SD卡中,从手机里访问SD卡中的APK安装包,点击就可以启动安装界面,系统应用Packageinstaller.apk处理这种方式下的安装及卸载界面流程,如下图:
 
PackageInstallerActivity负责解析包,判断是否是可用的Apk文件
创建临时安装文件 / data / data / com.android.packageinstaller / files / ApiDemos.apk
并启动安装确认界面startInstallConfirm,列出解析得到的该应用基本信息。如果手机上已安装有同名应用,则需要用户确认是否要替换安装。
确认安装后,启动InstallAppProgress,调用安装接口完成安装。
pm.installPackage(mPackageURI, observer, installFlags);
其它:
1 . PackageManagerService.java的内部类AppDirObserver实现了监听app目录的功能:当把某个APK拖到app目录下时,可以直接调用scanPackageLI完成安装。
2 .手机数据区目录“data / system / packages.xml”文件中,包含了手机上所有已安装应用的基本信息,如安装路径,申请的permission等信息。

标签:PackageInstaller,应用,int,final,File,原理,安装,目录
From: https://blog.51cto.com/u_548275/6237989

相关文章

  • springboot 自动装配的原理
     自动装配原理问题就是为什么我们直接导入依赖就可以使用了,甚至不用配置web.xml,tomcat等,springboot内部是如何实现的?主启动类上的注解@SpringBootApplication里有三个重要注解:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan1.@SpringBootConfiguration......
  • JSP 的本质原理解析:"编写的时候是JSP,心里想解读的是 java 源码"
    JSP的本质原理解析:"编写的时候是JSP,心里想解读的是java源码"@目录JSP的本质原理解析:"编写的时候是JSP,心里想解读的是java源码"每博一文案1.JSP概述2.第一个JSP程序3.JSP的本质就是Servlet4.JSP的基础语法4.1在JSP文件中直接编写文字4.2在JSP中编写Java程序......
  • HTTPS原理详解
    HTTPS(全称:HypertextTransferProtocoloverSecureSocketLayer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容请看SSL。它是一个URIscheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL......
  • 《编译原理》第一次实验:词法分析
    该分类为本人在本学期《编译原理》课程上的实验报告,实验对象语言为教学用PL/0语言,实验所用语言为C++。全部报告仅供参考,如有缺漏或错误,烦请指出,Thanks♪(・ω・)ノ一.设计思想根据PL/0语言的文法规范,编写PL/0语言的词法分析程序。1.单词种类及其正规式(1)基本字单词的值单......
  • 万能修改串号imei软件技术原理
    在智能手机用户中,有一些人因为特定需求需要修改手机串号,例如解锁手机、绕过应用程序检测等。而万能修改串号IMEI软件成为了其中的一种解决方案。那么,这种技术的原理是什么呢?首先,我们需要了解万能修改串号IMEI软件的基本原理。IMEI是手机的唯一标识符,由15位数字组成。当手机......
  • 改手机串号技术原理能绕过APP检测
    随着智能手机的普及,应用程序的数量和种类也在不断增加。不同的应用程序可能需要不同的硬件和软件支持,导致一些应用程序无法在所有手机上运行。于是,一些用户开始探索绕过应用程序检测的方法,以使用这些应用程序。其中一个方法是修改手机串号。那么,改手机串号技术原理是否能够......
  • 安卓一键改串号免root技术原理
    在智能手机用户中,有一部分人因为种种原因需要改变手机串号,比如解锁手机、绕过应用程序检测等。然而,传统的修改串号方法需要root权限,对普通用户来说比较困难。近年来,出现了一些安卓一键改串号免root技术,让用户可以更方便地修改手机串号。那么,这种技术的原理是什么呢?首先,我们......
  • ActiveMQ学习(二)——MQ的工作原理…
    如图所示首先来看本地通讯的情况,应用程序A和应用程序B运行于同一系统A,它们之间可以借助消息队列技术进行彼此的通讯:应用程序A向队列1发送一条信息,而当应用程序B需要时就可以得到该信息。其次是远程通讯的情况,如果信息传输的目标改为在系统B上的应用程序C,这种变化不会对应用程序A......
  • 修改手机串号技术原理犯法吗
    随着智能手机的普及和功能的不断增强,越来越多的人开始依赖手机处理日常事务和娱乐活动。然而,一些用户可能会发现自己的手机无法使用某些功能,或者受到特定运营商的限制。于是,一些用户开始探索修改手机串号的方法,以解除这些限制。但是,这个做法是否犯法呢?首先,我们需要了解修改......
  • 手机串号修改技术原理
    随着现代技术的不断发展,手机串号(IMEI号)修改技术越来越普及,这种技术让许多用户可以使用多张手机卡在同一台手机上。手机串号修改技术的原理是什么呢?在这篇文章中,我们将深入探讨手机串号修改技术的原理和相关问题。首先,什么是手机串号(IMEI号)?手机串号是手机的唯一识别码,由15位数字组......