应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作。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等信息。
相关推荐
本文将深入解析Package Installer的工作原理及其相关知识点。 首先,了解APK,它是Android应用程序的基本安装包格式,类似于其他平台的安装文件。APK包含了应用程序的代码、资源、权限声明等所有必要元素。Android...
PackageInstaller是Android操作系统中的一个重要组件,它主要用于安装和管理APK应用包。在Android系统中,用户通过PackageInstaller...理解和掌握PackageInstaller的工作原理对于Android开发者和用户来说都至关重要。
在安卓系统中,PackageInstaller是核心组件之一,它负责处理应用程序的安装、更新以及卸载等操作。这个压缩包“安卓Android源码——PackageInstaller.zip”包含的是Android系统的PackageInstaller模块的源代码,对于...
为了深入了解PackageInstaller的工作原理,我们需要阅读源码中的关键类和方法,如`PackageInstallerService`、`SessionParams`、`Session`等。同时,与之相关的类如`PackageManagerService`、`InstallReceiver`等也...
在这个"Android应用源码之PackageInstaller.zip"中,我们可以深入研究PackageInstaller的工作原理,以及它是如何与Android系统的其他组件协同工作的。 首先,我们要理解PackageInstaller的职责。它主要处理以下任务...
本文将深入分析PackageInstaller的源码,了解其工作原理和关键流程。 首先,我们来看看PackageInstaller的架构。在Android系统中,PackageInstaller主要由以下几个部分组成: 1. **PackageInstallerService**:这...
近日想实现静默安装(不提示用户),网上搜文章大多提到一个方法 PackageManager.install,这是个非公开方法,它的用法是借鉴了内置应用 packageInstaller,跳过Activity提示用户,直接调用核心方法。用Git下载...
apk文件 PackageInstaller(电视直播视频)apk文件 PackageInstaller(电视直播视频)apk文件 PackageInstaller(电视直播视频)apk文件 PackageInstaller(电视直播视频)apk文件 PackageInstaller(电视直播视频)...
PackageInstaller.zip项目安卓应用源码下载PackageInstaller.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
了解PackageInstaller的工作原理对于开发者和高级用户来说非常重要,因为这可以帮助他们理解应用安装的细节,以及如何调整设置以优化存储管理和性能。同时,对于系统开发者和安全研究人员,理解PackageInstaller的...
/P Prompt if the driver package to be installed is not better than the current one. /P 如果驱动包已经安装以及比当前使用的版本要旧就发出提示。 /F Force install inf the driver package is not better ...
《Android PackageInstaller源码解析与应用》 在Android系统中,PackageInstaller是负责应用程序安装、升级和卸载的核心组件。它是Android系统内核的一部分,理解其工作原理对于开发者来说至关重要,尤其是在进行...
PackageInstaller是Android系统中的一个重要组件,它负责处理应用程序的安装、升级和卸载操作。这份压缩包"android PackageInstaller源码.rar"包含了该组件的源代码,对于理解Android系统的应用安装流程以及进行系统...
PackageInstaller是Android操作系统中的一个重要组件,它主要用于安装和管理APK应用包。在这个源码学习资源包中,我们可以深入理解Android系统的应用安装流程,以及系统如何处理用户权限、签名验证等核心功能。以下...
通过以上五个方面的详细解析,我们不仅能够深入了解`PackageInstaller`在权限获取与展示方面的实现原理,还能在此基础上扩展对Android框架其他部分的理解。这对于开发者而言是非常有价值的参考资料。
The Python package installer
905X3自动安装APK并自动打开
【Android应用源码之PackageInstaller】是一个针对Android平台的源码示例,主要涉及的是Android系统中的包安装器(Package Installer)组件。这个组件在Android系统中起着至关重要的作用,因为它负责处理APK应用程序...
为了进一步了解PackageInstaller小程序的功能和工作原理,开发者通常需要解压缩文件,然后使用代码编辑器打开源码,分析各个文件的结构和内容。此外,熟悉相关的小程序开发框架和平台的文档也是理解源码的关键。例如...