android软件安装原理
- 格式:docx
- 大小:19.03 KB
- 文档页数:3
android apt实现原理-回复APT(Android Package Tool)是一种用于在Android操作系统上进行软件包管理的工具。
它可以让开发者和用户更方便地安装、卸载、更新和管理应用程序。
在本篇文章中,我将一步一步地解释APT的实现原理。
1. 什么是APT?APT是一种软件包管理工具,类似于Linux系统中的APT和DPKG工具。
它被设计用于Android操作系统,为开发者和用户提供了一种简单方便的方式来管理应用程序。
2. APT的基本组成APT由以下几个主要组件组成:- package manager(软件包管理器):负责管理安装、卸载、更新和维护应用程序。
- package installer(软件包安装程序):负责安装和卸载应用程序包。
- package archive(软件包存档):存储着应用程序的二进制文件、资源文件和元数据等。
通常以.apk文件的形式存在。
- package index(软件包索引):包含了所有可用的软件包的信息,包括版本、依赖关系等。
3. APT的工作流程APT的工作流程可以分为以下几个步骤:- 步骤一:获取软件包索引在安装或更新应用程序之前,APT会首先获取软件包索引。
软件包索引通常存储在服务器上,并包含了所有可用软件包的信息。
APT会定期检查服务器上的索引是否有更新,并下载最新的索引文件。
- 步骤二:选择安装包在获取了软件包索引之后,APT会根据用户的需求选择要安装的软件包。
用户可以根据软件包名称、版本号、依赖关系等进行选择。
- 步骤三:解析软件包依赖关系在选择了要安装的软件包之后,APT会解析软件包的依赖关系。
依赖关系指的是该软件包需要的其他软件包。
APT会根据依赖关系自动下载和安装所需的其他软件包。
- 步骤四:下载和安装软件包在解析了软件包的依赖关系之后,APT会通过网络下载所选软件包的二进制文件、资源文件等。
下载完成后,APT会将软件包安装到系统中的合适位置。
android模拟器原理Android模拟器是一种运行在个人计算机上的软件,可以模拟Android操作系统的功能和行为,用来测试和调试Android应用程序。
它的原理是通过虚拟化技术在个人计算机上创建一个虚拟的Android环境。
Android模拟器可以分为两种类型:基于硬件的模拟器和基于软件的模拟器。
基于硬件的模拟器使用底层硬件虚拟化技术,将计算机的硬件资源如处理器、内存和硬盘等都虚拟化成一个独立的虚拟机,从而实现对Android操作系统的模拟。
基于软件的模拟器则是通过在主机操作系统上运行Android虚拟机来实现模拟。
无论是哪种类型的模拟器,其原理都是将Android操作系统镜像文件加载到模拟器中,并使用模拟器提供的软件接口和硬件虚拟化技术,将Android操作系统的功能和行为模拟出来。
模拟器还提供了一系列开发者工具和调试功能,可以让开发者在模拟器上进行应用程序的测试、调试和优化。
Android模拟器的好处是可以在个人计算机上方便地进行Android应用程序的开发和测试,无需真实设备,节省了成本和时间。
另外,模拟器还支持模拟各种Android设备的硬件和软件配置,方便进行不同设备和系统版本的兼容性测试。
然而,Android模拟器也存在一些限制和不足之处。
由于模拟器运行在个人计算机上,所以它的性能和响应速度可能不如真实设备好。
另外,模拟器也无法完全模拟真实设备的各种硬件特性和行为,因此在某些情况下,还需要进行真机测试和调试。
总之,Android模拟器是一种方便有效的开发工具,可以在个人计算机上模拟Android操作系统的功能和行为,用于应用程序的开发、调试和测试。
它通过虚拟化技术将Android操作系统虚拟化在计算机上,提供了一系列开发者工具和调试功能,使开发和测试工作更加简便和高效。
安卓模拟器(Android Emulator)是一种在桌面操作系统上模拟Android系统环境的软件。
它的机制与原理主要基于虚拟化技术和二进制翻译技术。
首先,安卓模拟器通过虚拟化技术,在计算机上虚拟出一台安卓设备。
虚拟化程序将计算机的硬件资源划分为多个虚拟环境,每个虚拟环境都可以独立运行操作系统和应用程序,且相互之间互不干扰。
这样,安卓模拟器就可以在PC机上模拟出一个完整的Android系统环境,使得开发人员可以在计算机上编译、运行和测试安卓应用程序。
其次,安卓模拟器还依赖于二进制翻译技术。
由于安卓应用程序的二进制代码是基于ARM架构的,而计算机的处理器通常是x86或x64架构的,因此安卓模拟器需要将安卓应用程序的二进制代码翻译成计算机可以执行的代码。
这样,安卓应用程序就可以在计算机上运行了。
在安卓模拟器的实现过程中,QEMU(Quick EMUlator)是一个重要的开源虚拟化工具。
QEMU通过模拟硬件设备,使得计算机可以运行与本机硬件无关的操作系统。
安卓模拟器通过QEMU技术,构建了一个虚拟的硬件环境,使得计算机可以运行安卓系统。
此外,安卓模拟器还提供了设备模拟功能,可以模拟不同的硬件设备,如屏幕尺寸、分辨率、内存大小、CPU架构等。
这使得开发人员可以在没有实际硬件的情况下测试自己的应用程序在不同设备上的兼容性和性能表现。
最后,安卓模拟器还提供了一个图形化界面,让用户能够在模拟器上与安卓系统进行交互。
用户可以使用键盘、鼠标或触摸屏操作虚拟设备,执行各种操作,如安装应用、运行应用、修改系统设置等。
总之,安卓模拟器通过模拟硬件设备和安卓系统环境,使得开发者和用户可以在计算机上运行安卓应用程序。
它在应用开发、测试、教程制作和游戏娱乐等方面都有广泛的应用。
什么是Android操作系统,所谓的Android:是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟Open Handset Alliance)开发。
Linux系统中进程间通信的方式有:socket, named pipe,message queque, signal,share memory。
Java系统中的进程间通信方式有socket, named pipe等。
android应用程序理所当然可以应用JAVA的(IPC Inter Process Communications)机制实现进程间的通信,取而代之的是Binder通信。
Google为什么要采用这种方式呢,这取决于Binder通信方式的高效率。
Binder通信是通过linux的binder driver来实现的。
Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回。
Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC 以及执行进程本地消息,Binder通信是同步而不是异步。
Android中的Binder通信是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口。
系统中有一个进程管理所有的system service,Android虚拟机不允许用户添加非授权的System service,当然现在源码开发了,我们可以修改一些代码来实现添加底层system Service 的目的。
对用户程序来说,我们也要创建server,或者Service用于进程间通信,这里有一ActivityManagerService管理JAVA应用层所有的service创建与连接(connect)。
disconnect,所有的 Activity也是通过这个service来启动,加载的。
android 覆盖apk原理Android覆盖APK原理概述在Android应用开发中,经常需要对已经安装的应用进行更新或者修复,而覆盖APK是一种常见的更新方式。
本文将介绍Android 覆盖APK的原理以及相关技术。
一、什么是APKAPK(Android Package Kit)是Android应用的安装包,它包含了应用的所有资源文件、源代码以及清单文件等。
当我们安装一个应用时,实际上是将APK文件解压并将其中的资源文件、代码等安装到设备上。
二、为什么需要覆盖APK在软件开发过程中,经常会有新版本的发布,包括功能的增加、优化以及错误的修复。
为了让用户享受到最新的功能和修复最新的问题,需要将新版本的APK覆盖到已经安装的应用上,从而实现应用的更新。
三、覆盖APK的原理覆盖APK的原理主要涉及到两个方面,即签名验证和应用替换。
1. 签名验证在Android系统中,每个应用都有一个唯一的数字签名,用于保证应用的安全性。
当我们安装一个应用时,系统会验证APK文件的签名是否与设备上已安装应用的签名一致。
如果一致,系统会认为是同一个应用,并允许覆盖安装;如果不一致,系统会提示签名不一致,无法覆盖安装。
2. 应用替换当签名验证通过后,系统会将新版本的APK文件解压并替换掉已安装应用的资源文件、代码等。
然后重新加载应用,使得用户可以使用更新后的应用。
需要注意的是,在覆盖APK时,系统会保留应用的数据和用户设置,以确保用户不会因为更新应用而丢失重要的数据。
四、覆盖APK的实现方式在Android开发中,覆盖APK的实现方式有多种,包括通过应用商店更新、通过网络下载更新、通过本地安装包更新等。
1. 应用商店更新通过应用商店更新是最常见的方式之一。
应用商店会检测应用的版本号,并提醒用户进行更新。
用户点击更新按钮后,应用商店会下载新版本的APK文件并进行覆盖安装。
2. 网络下载更新有些应用会在启动时通过网络检测是否有新版本,如果有,则会下载新版本的APK文件,并提示用户进行覆盖安装。
Android APT,全称为Annotation Processing Tool,是一种用来处理注解的工具。
具体来说,它是javac的一个工具,在编译时扫描和处理注解。
注解处理器以Java代码作为输入,生成.java文件作为输出。
APT工作原理采用C/S模式,即客户端/服务器模式。
要使用APT,首先需要一个APT服务器保存最新的Linux软件包,这在Ubuntu中被称为“源”。
在其他书籍或互联网上,当我们看到关于Ubuntu中APT的使用时,提到安装源、更新源,就是指所需要的软件的服务。
在Java源码到class文件之间需要经过注解处理器的处理,注解处理器生成的代码也同样会经过这一过程,最终一起生成class文件。
在Android中,class文件还会被打进Dex文件中,最后生成APK文件。
adb install原理adb install原理1. 介绍ADB(Android Debug Bridge)是一种用于在运行中的Android设备上执行各种操作的命令行工具。
其中,adb install命令用于将Android应用程序(APK)安装到设备上。
本文将深入探讨adb install命令的原理。
2. adb install的基本原理adb install命令通过ADB连接到Android设备,并将APK文件传输到设备上进行安装。
其基本原理如下:1.ADB建立与设备的连接,通过USB或Wi-Fi与设备通信。
2.将设备的“安装器”软件(如PackageManager)通过ADB命令调用,并提供待安装的APK文件的路径。
3.安装器解析APK文件,验证其签名和完整性,以确保安全性。
4.安装器将APK文件中的文件和元数据拷贝到设备的特定目录中(如/data/app目录)。
5.安装器根据APK文件中的清单文件确定应用的包名和版本号等信息,并将其注册到设备的应用列表中。
3. adb install的详细解析ADB连接设备ADB通过USB或Wi-Fi与设备建立连接,其中USB连接是最常见的方式。
ADB驱动程序将设备连接到计算机上,使得ADB能够执行各种操作。
调用安装器一旦建立了连接,ADB通过调用设备上的安装器软件来执行安装操作。
安装器负责对APK文件进行解析和安装,并保证其可用性。
解析APK文件安装器首先解析APK文件,以便验证其签名和完整性。
签名验证可确保APK文件来自可信的开发者,并避免未经授权的文件修改。
完整性验证可确保APK文件未被篡改或损坏。
拷贝文件和元数据在验证APK文件后,安装器将文件和元数据拷贝到设备的特定目录中。
这些目录可能包括应用程序代码、资源文件、库文件以及清单文件等。
注册应用信息最后,安装器根据APK文件中的清单文件确定应用的包名、版本号和其他相关信息,并将其注册到设备的应用列表中。
android xposed 原理Android Xposed是一款流行的开源框架,它允许用户在不修改系统的情况下,对Android设备进行深度定制和功能增强。
本文将介绍Android Xposed的原理和工作方式,以及它为用户提供的一些强大功能。
Android Xposed的原理可以简单地概括为:通过Hook技术,截获并修改Android系统的方法调用。
具体来说,Xposed通过修改系统的dex文件,在应用程序启动时加载自己的代码,然后通过Hook技术,将自己的代码插入到目标方法的执行流程中。
这样一来,Xposed就能够在目标方法执行之前或之后,对其进行修改或增强。
为了实现上述原理,Xposed框架使用了一些核心的组件。
其中最重要的是Xposed Installer,它是一个管理Xposed模块的应用程序。
用户可以通过Xposed Installer来安装、卸载和管理各种Xposed 模块。
此外,Xposed框架还包括了Xposed Bridge和Xposed API 两个组件。
Xposed Bridge负责与Android系统进行交互,而Xposed API则为开发者提供了一套丰富的API,用于编写Xposed模块。
通过Xposed框架,用户可以实现许多功能的定制和增强。
例如,用户可以使用Xposed模块修改系统的UI界面,改变应用程序的外观和交互方式。
用户还可以使用Xposed模块实现一些特殊的功能,比如禁用应用程序的广告、修改应用程序的行为逻辑、增强应用程序的安全性等。
此外,Xposed框架还支持模块的动态加载和卸载,用户可以随时根据自己的需求来启用或禁用某个模块。
要使用Xposed框架,用户首先需要root权限。
只有获得了root权限,才能够修改系统的dex文件,并加载Xposed框架。
此外,用户还需要安装Xposed Installer应用程序,以及一些常用的Xposed 模块。
一旦准备就绪,用户就可以通过Xposed Installer来管理和控制Xposed模块的使用。
apk应用程序的原理什么是apk应用程序apk(Android Package)是Android操作系统下应用程序的安装包格式,每个apk文件都是一个完整的应用程序,包含了应用程序的全部资源和代码。
在Android设备上安装apk文件,即可将应用程序部署到设备中,并在设备上运行。
apk应用程序的原理apk应用程序是由一系列组件组成的,包括但不限于主要的Activity(界面)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容提供器)。
下面将介绍这些组件及其原理。
Activity(界面)Activity是apk应用程序的主要界面组件,负责接收用户的输入,并根据输入做出相应的响应。
每个Activity都是一个独立的界面,用户可以通过Activity间的切换来实现应用程序的不同功能。
一个apk应用程序可以包含多个Activity,并可以通过Activity之间的启动和销毁来实现不同的业务逻辑。
Service(服务)Service是在后台运行的组件,它没有用户界面,负责执行长期运行的任务或响应其他组件的请求。
Service可以在后台独立运行,即使应用程序的界面被销毁,Service仍然可以继续运行。
通过使用Service,应用程序可以在后台执行如下载文件、播放音乐等耗时的任务,同时保持应用程序的响应性。
BroadcastReceiver(广播接收器)BroadcastReceiver是负责接收和处理系统或应用程序发出的广播信息的组件。
广播可以是系统级的(如设备启动完成、电池电量变化等)或应用程序级的(如接收到短信、网络连接状态变化等)。
apk应用程序可以注册一个或多个广播接收器,以便接收特定的广播消息,并做出相应的处理。
ContentProvider(内容提供器)ContentProvider是一个应用程序之间共享数据的接口,它提供了数据的访问、修改、删除等方法。
AndroidAPK应⽤安装原理...本⽂实例讲述了Android APK应⽤安装之AndroidManifest使⽤PackageParser.parserPackage原理。
分享给⼤家供⼤家参考,具体如下:Android 安装⼀个APK的时候⾸先会解析APK,这⾥要做很多事情,其中⼀个事情就是解析Manifest.xml⽂件,并将所有APK 的Manifest封装到各种对象中并保存在内存当中解析Manifest的类是⾮常重要的,该类就是frameworks\base\core\java\android\content\pm\PackageParserPackageManagerService会调⽤PackageParser.parserPackage⽅法来解析APK清单,下⾯开始分析PackageParser的实现:PackageParser是使⽤的XMLPullParser⼯具来对XML进⾏解析的,然后分别通过android.content.pm下各种xxxInfo类来进⾏封装:public Package parsePackage(File sourceFile, String destCodePath,DisplayMetrics metrics, int flags) {//最后要跑出的解析错误信息mParseError = PackageManager.INSTALL_SUCCEEDED;//获得要解析的⽂件的路径mArchiveSourcePath = sourceFile.getPath();//如果要解析的不是⽂件类型就跳过并且返回该⽅法if (!sourceFile.isFile()) {Log.w(TAG, "Skipping dir: " + mArchiveSourcePath);//更新错误信息mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;return null;}//如果⽂件不是以.apk结尾并且flag没有确定⼀定是APK,那么也返回if (!isPackageFilename(sourceFile.getName())&& (flags&PARSE_MUST_BE_APK) != 0) {if ((flags&PARSE_IS_SYSTEM) == 0) {// We expect to have non-.apk files in the system dir,// so don't warn about them.Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);}//更新错误信息mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;return null;}if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d(TAG, "Scanning package: " + mArchiveSourcePath);XmlResourceParser parser = null;AssetManager assmgr = null;boolean assetError = true;try {assmgr = new AssetManager();//将⼀个⽂件添加到AssetManager中并返回⼀个唯⼀标识int cookie = assmgr.addAssetPath(mArchiveSourcePath);if(cookie != 0) {//通过标识去AssetManager中找到标识对应资源中的Manifest清单⽂件,并返回⼀个XML的解析器parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");//⾛到这⾥证明⼀切顺利assetError = false;} else {Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);}} catch (Exception e) {Log.w(TAG, "Unable to read AndroidManifest.xml of "+ mArchiveSourcePath, e);}if(assetError) {if (assmgr != null) assmgr.close();mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;return null;}String[] errorText = new String[1];Package pkg = null;Exception errorException = null;try {// XXXX todo: need to figure out correct configuration.Resources res = new Resources(assmgr, metrics, null);//这个是真正在解析的package的⽅法,是private methodpkg = parsePackage(res, parser, flags, errorText);} catch (Exception e) {errorException = e;mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; }if (pkg == null) {if (errorException != null) {Log.w(TAG, mArchiveSourcePath, errorException);} else {Log.w(TAG, mArchiveSourcePath + " (at "+ parser.getPositionDescription()+ "): " + errorText[0]);}parser.close();assmgr.close();if (mParseError == PackageManager.INSTALL_SUCCEEDED) {mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; }return null;}parserPackage调⽤了重载的另外⼀个parserPackageprivate Package parsePackage(Resources res, XmlResourceParser parser, int flags, String[] outError)throws XmlPullParserException, IOException {AttributeSet attrs = parser;//每次调⽤这个⽅法时候清空这些变量mParseInstrumentationArgs = null;mParseActivityArgs = null;mParseServiceArgs = null;mParseProviderArgs = null;//这⾥调⽤这个⽅法获得包名String pkgName = parsePackageName(parser, attrs, flags, outError);if (pkgName == null) {mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; return null;}int type;final Package pkg = new Package(pkgName);boolean foundApp = false;//从资源⾥获得AndroidManifest的数组TypedArray sa = res.obtainAttributes(attrs,com.android.internal.R.styleable.AndroidManifest);//继续挖掘出版本号pkg.mVersionCode = sa.getInteger(com.android.internal.R.styleable.AndroidManifest_versionCode, 0);//获取版本名pkg.mVersionName = sa.getNonConfigurationString(com.android.internal.R.styleable.AndroidManifest_versionName, 0);if (pkg.mVersionName != null) {pkg.mVersionName = pkg.mVersionName.intern();}//获得sharedUserIdString str = sa.getNonConfigurationString(com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0);if (str != null && str.length() > 0) {//验证包名是否符合规则String nameError = validateName(str, true);if (nameError != null && !"android".equals(pkgName)) {outError[0] = "<manifest> specifies bad sharedUserId name \""+ str + "\": " + nameError;mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; return null;}pkg.mSharedUserId = str.intern();pkg.mSharedUserLabel = sa.getResourceId(com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0);}sa.recycle();//安装的位置pkg.installLocation = sa.getInteger(com.android.internal.R.styleable.AndroidManifest_installLocation,PARSE_DEFAULT_INSTALL_LOCATION);// Resource boolean are -1, so 1 means we don't know the value.int supportsSmallScreens = 1;int supportsNormalScreens = 1;int supportsLargeScreens = 1;int resizeable = 1;int anyDensity = 1;int outerDepth = parser.getDepth();//关键时刻到了,真正的开始解析了while ((type=parser.next()) != parser.END_DOCUMENT&& (type != parser.END_TAG || parser.getDepth() > outerDepth)) {if (type == parser.END_TAG || type == parser.TEXT) {continue;}String tagName = parser.getName();if (tagName.equals("application")) {if (foundApp) {if (RIGID_PARSER) {outError[0] = "<manifest> has more than one <application>";mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;return null;} else {Log.w(TAG, "<manifest> has more than one <application>");XmlUtils.skipCurrentTag(parser);continue;}}foundApp = true;if (!parseApplication(pkg, res, parser, attrs, flags, outError)) {return null;}} else if (tagName.equals("permission-group")) {if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) {return null;}} else if (tagName.equals("permission")) {if (parsePermission(pkg, res, parser, attrs, outError) == null) {return null;}} else if (tagName.equals("permission-tree")) {if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) {return null;}} else if (tagName.equals("uses-permission")) {sa = res.obtainAttributes(attrs,com.android.internal.R.styleable.AndroidManifestUsesPermission);// Note: don't allow this value to be a reference to a resource// that may change.String name = sa.getNonResourceString(com.android.internal.R.styleable.AndroidManifestUsesPermission_name);sa.recycle();.........................................................................................................................................................篇幅有限这⾥分别把每种不同的element⽤不同的⼩⽅法去解析,他们的调⽤顺序是:这些⼩⽅法⾥其实还是有很多⼩技巧的,有兴趣的话可以细细品位更多关于Android相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Android程序设计有所帮助。
android 软件安装原理
将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大
小约为原始apk文件大小的四分之一)
安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字
节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。
卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。
一、系统应用安装:
PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer启
动此服务
(源文件路径:
android\frameworks\base\services\java\com\android\server\PackageManagerService.java) PackageManagerService服务启动的流程:
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(Filedir, int flags, intscanMode) 遍历安装指定目录下的文件
2.scanPackageLI(FilescanFile,
File destCodeFile, FiledestResourceFile, intparseFlags,
intscanMode) 安装package文件
3.scanPackageLI(
File scanFile, File destCodeFile, FiledestResourceFile,
PackageParser.Packagepkg, intparseFlags, intscanMode)
通过解析安装包parsePackage获取到安装包的信息结构
4.mInstaller.install(pkgName,pkg.applicationInfo.uid,
pkg.applicationInfo.uid); 实现文件复制的安装过程
(源文件路径:frameworks\base\cmds\installd\installd.install)
二、从market上下载应用:
Google Market应用需要使用gmail账户登录才可以使用,选择某一应用后,开始下载安装包,此过程中,在手机的信号区有进度条提示,下载完成后,会自动调用Packagemanager的接
口安装,调用接口如下:
publicvoidinstallPackage(final Uri packageURI, final IPackageInstallObserverobserver,finalint flags)
final Uri packageURI:文件下载完成后保存的路径
final IPackageInstallObserver observer:处理返回的安装结果
final int flags:安装的参数,从market上下载的应用,安装参数为-r (replace) installPackage接口函数的安装过程:
1.publicvoidinstallPackage(
final Uri packageURI, final IPackageInstallObserverobserver, final int flags,
final String installerPackageName)
final StringinstallerPackageName:安装完成后此名称保存在settings里,一般为null,不是关键参数
2.FiletmpPackageFile = copyTempInstallFile(packageURI, res);
把apk文件复制到临时目录下的临时文件
3.privatevoidinstallPackageLI(Uri pPackageURI,
intpFlags, booleannewInstall,StringinstallerPackageName,
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.privatePackageParser.PackagescanPackageLI(
File scanFile, File destCodeFile, FiledestResourceFile,
PackageParser.Packagepkg, intparseFlags, intscanMode)
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调用同样的接口完成应用安装。
publicvoidinstallPackage(.UripackageURI,android.content.pm.IPackageInstallObserver observer, intflags,ng.StringinstallerPackageName)
四、第三方应用安装――通过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等信息。