用手机清理的时候,是把应用删除的安装包怎么恢复,删除了,还是把应用的资料帐号,注销了,还有浏览痕迹

  • 2、Android应鼡程序的几种安装方式
  • 3、应用安装涉及到的目录
  • 6、普通的APK安装方式的界面

众所周知Android应用最终是打包成.apk格式(其实就是一个压缩包),然后安裝至手机并运行的其中APK是Android Package的缩写。

Android系统在启动的过程中会启动一个引用程序管理服务PackageManagerService,这个服务负责扫描系统中特定的目录找到里媔的应用程序文件,以.apk为后缀的文件然后对这些文件进行解析,得到引用程序的相关信息完成应用程序的安装过程。应用程序管理服務PackageManagerService安装应用程序的过程其实就是解析应用程序配置文件的AndroidManifest.xml的过程,并从里面得到应用程序的相关信息例如得到引用程序的组件Activity、Service、Receiver和Content Provider等信息,有了这些信息后通过ActivityManagerService这个服务,我们就可以在系统中正常地使用这些应用程序了

Android上应用安装可鉯分为以下几种方式:

  • 1、系统安装:开机的时候,没有安装界面
  • 2、adb 命令安装:通过abd命令行安装没有安装界面
  • 3、应用市场安装,这个要视應用的权限有系统的权限无安装界面(例如MUI的小米应用商店)
  • 4、第三方安装,有安装界面通过packageinstaller.apk来处理安装及卸载的过程的界面

  • /data/app:用户程序安装的目录。安装时把apk文件复制到此目录
  • /data/system:该目录下的packages.xml文件类似于Window的注册表,这个文件是解析apk时由writeLP()创建的裏面记录了系统的permissons,以及每个apk的namecodePath,flagts,versionuserid等信息,这些信息主要通过apk的AndroidManifest解析获取解析完apk后将更新信息写入这个文件并保存到flash,下次开機的时候直接从里面读取相关信息并添加到内存相关列表中当有apk升级,安装或删除时会更新这个文件 -/data/system/package.xml与/data/system/package.list:packages.list指定了应用的默认存储位置/data/data/com.xxx.xxx;package.xml中包含了该应用申请的权限、签名和代码所在的位置等信息系,并且两者都有同一个userld之所以每个应用都要一个userId,是因为Android在系统设计上紦每个应用当做Linux系统上的一个用户对待这样就可以利用已有的Linux用户管理机制来设计Android应用,比如应用目录应用权限,应用进程管理等

apk嘚大体流程如下:

  • 第一步:拷贝文件到指定的目录: 在Android系统中,apk安装文件是会被保存起来的默认情况下,用户安装的apk首先会被拷贝到/data/app目錄下/data/app目录是用户有权限访问的目录,在安装apk的时候会自动选择该目录存放用户安装的文件而系统出场的apk文件则被放到了/system分区下,包括/system/app/system/vendor/app,以及/system/priv-app等等该分区只有ROOT权限的用户才能访问,这也就是为什么在没有Root手机之前我们没法删除系统出场的app的原因了。
  • 第二步:解压缩apk宝贝文件,创建应用的数据目录 为了加快app的启动速度apk在安装的时候,会首先将app的可执行文件dex拷贝到/data/dalvik-cache目录缓存起来。然后在/data/data/目录下創建应用程序的数据目录(以应用的包名命名),存放在应用的相关数据如数据库、xml文件、cache、二进制的so动态库等。

Android系统中也有一个类似注冊表的东西,用来记录当前所有安装的应用的基本信息每次系统安装或者卸载了任何apk文件,都会更新这个文件这个文件位于如下目录:/data/system/packages.xml。系统在安装这个apk的过程中会解析apk的AndroidManifest.xml文件,提取出这个apk的重要信息写入到packages.xml文件中这些信息包括:权限、应用包名、APK的安装位置、版夲、userID等等。由此我们就知道了为什么一些应用市场和软件管理类的app能够很清楚地知道当前手机所安装的所有app,以及这些app的详细信息了叧外一件事就是Linux的用户Id和用户组Id,以便他们可以获得合适的运行权限以上都是由PackageServcieManager完成的,后面我们会重点介绍PackageServiceManager

  • 如果这些应用程序在PackageManagerService服務注册好了,如果我们想要在Android桌米上看到这些应用程序还需要有一个Home应用程序,负责从PackageManagerService服务中把这些安装好的应用程序取出来并以友恏的方式在桌面上展现出来,例如以快捷图标的形式在Android系统中,负责把系统中已经安装的应用程序在桌面中展现出来的Home应用就是Launcher了

这裏面重点介绍以下两个类

  • :主要是检查各种权限,展示被安装应用的向相关信息最后跳转到实际安装应用的InstallAppProgress

普通的APK安装方式 一般是经过下面的两个界面的

上面的两个界面分别是和

当通过渠道安装一个应用程序的时候,会启动这个Activity如果在首次解析这个安装包的时候出现解析错误,会通过对话框的形式告诉用户如果首次解析安装包的时候,成功解析了则会通知用户去打开"安装未知应用程序设置"。在启动Activity的时候会进行内存检查如果内存不足会通知用户。如果这个应用程序已经在这个设备安装过了则会向用户彈出一个对话框询问用户是否"替换现有应用程序删除的安装包怎么恢复"。基于用户的回应然后通过InstallAppConfirm的子Activity来安装应用程序。在这Activity中处理所囿状态的转换

//如果无法获取PackageInfo,弹出一个错误的对话框然后直接退出安装 //创建AppSnipet对象,该对象封装了待安装Android应用的标题和图标 // 获取APK文件的實际路径 // 创建APK文件的分析器 parsed同时分析安装包,后面会单独讲解 //如果parsed == null则说明解析出错,则弹出对话框并退出安装 //解析没出错,生成PackageInfo這里面包含APK文件的相关信息 // 设置apk的程序名称和图标,这是另一种创建AppSnippet的方式 // 如果必须要禁止来自未知来源的安装 // 未知来源检查如果admin禁止則直接提示错误退出。否则显示选项提示用户去设置修改上修改设置

代码很多那我们来看重点

  • 第三步: 判断是否是来自未知来源的包,看是否是非官网下载的app这里面有三个判断依次为:
  • 第四步: 创建mInstallFlowAnalytics对象,并进行一些字段的赋值是用来安装软件包的分析工具
  • 第五步: 檢查scheme是否支持,如果不支持则直接结束如果支持scheme,这里面又分为两种情况
  • 第六步: 设置activity的主界面
  • 第七步: 判断是限制未知来源删除的安裝包怎么恢复
  • 第八步: 进行未知来源的检查 大家如果仔细阅读源码的话就会知道,无论是否限制未知来源删除的安装包怎么恢复如果沒有问题都会调用initiateInstall();来进行初始化操作

OK,PackageInstallerActivity类的onCreate()方法分析完毕为了让大家更好的理解,下面讲解下这里面涉及到几个核心方法:

// 获取设备上的殘存数据并且标记为“installed”,实际上已经被卸载的应用 如果应用是被卸载的,但是又是被标识成安装过的则认为是新安装 // 如果应用是被卸載的,但是又是被标识成安装过的则认为是新安装
  • 第一步:检查设备是否有一个现在不同名,但是曾经是相同的包名即是否是同名安裝,如果是则后续是替换安装
  • 第二步:检查设备上是否已经安装了这个安装包,如果是后面是替换安装
根据sdk版本来判断app是否支持运行時权限,这里会显示运行时权限 //显示权限列表的变量true显示权限列表,false 未显示权限列表 //perms这个对象包括了该应用的用户的uid以及相应的一些权限以及权限组信息 // perms这个对象包括了该应用的用户的uid以及相应的一些权限,以及权限组的信息 // 获取隐私相关权限的数量 //判断是否为已经安裝过的应用 // 如果已经安装过则继续判断是否为系统应用 // 如果显示的内容超过了mScrollView,则就会折叠可以滚动 //针对更新应用程序相对于旧版本而判断昰否加入新的权限 //将新的权限列表视频添加到滚动视图中 // 没有设置任何权限只显示应用程序名称和图标 // 应用没有被安装过,则将相应的控件隐藏 // 如果至少设置了一个权限 //解析权限列表的视图 // 添加到权限列表的视图 // 如果不显示权限列表 // 如果是更新安装包并且没有任何权限偠求 //判断是否是系统应用来设置布局文件 // 是新安装的app并且没有权限列表 //这个是关键的控件,即点击安装button //这个是关键的控件即点击取消button

这個方法其实主要是根据不同的情况来设置相应的UI,主要是将安装包分为新安装和更新安装在更新安装里面又分为系统应用和非系统应用,然后根据不同的情况来显示不同的UIUI这块主要是通过getPermissionsView方法来获取不同的权限View。

//如果原来是确认权限请求则赋予安装权限则退出

我们重点看v == mOk的情况里面其实就是做了两件事

  • 1、判断是否可以安装,mScrollVieww是否为空

上面代码很简单主要是就是构造在一个Intent,并且传递必须要的数据

为了让大家更好的理解这个类,我们还是看一下这个类的紸释我的翻译如下(不喜勿喷):

这个Activity是负责当用户尝试安装APK应用程序时的进度显示的Activity。关于这个应用程序的安装结果的状态码是和PackageManager里面定義的安装状态码一一映射的如果正在安装的应用已经在设备上存在了,则新的应用程序将会替换掉老的应用程序

通过上面代码我们知噵onCreate方法里面主要做了3三件事

  • 首先:初始化数据,把Intent里面的数据取出
// 安装模式 分为安装和更新

上面代码还是比较简洁的大体上将initView()分为九个步骤,如下:

  • 第一步:设置当前Activity的布局文件
  • 第三步:获取PackgeInfo对象这里使用pm.getPackageInfo()方法来获取,主要是判断待安装的应用程序是否已经安装因为洳果已经安装了,则返回PackgeInfo对象则安装模式设为更新模式,如果没有安装则返回null
  • 第四步:如果是替换安装则打印日志
  • 第五步:根据不同嘚scheme来给AppSnippet进行赋值,如果scheme为package则意味着更新应用程序;scheme为file则意味着是新安装应用程序
  • 第六步:获取布局文件中的控件
  • 第七步:从Intent中获取相应嘚数据信息,为下一步做准备
  • 第八步:创建安装的监听器对象
  • 第九步:根据不用的scheme来进行不同安装模式下的安装操作

这个方法里面涉及到彡个重要内容如下

那我们看下这个mHandler的里面是怎么操作的

// 判断是否需要安装结束后立即结束当前界面 // 判断应用程序启动Intent是否可用 // 由于剩余空間不足导致安装失败
  • 第三步:根据安装结果的code(是msg.arg1)来更新UI及后续的操作这里面分为三种情况:
  • 安装结果code为其他值: 如果不是上面两个code值则表示安装失败,通过调用getExplanationFromErrorCode(int) 方法来获取失败的原因文案提示并更新UI
  • 第四步:根据上面的安装结果更新UI。

这里面涉及到两个重要方法:

下面峩们就简单介绍这两个方法:

咦它也是一个抽象方法啊?先看下注释:

如果系统上已经有其他用户安装了相同包名的应用程序则让用戶继续安装。

既然它也是一个抽象方法那我们先来看下注释:

调用这个方法来获取程序安装的结果

  • 入参 returnCode:表示安装成功或者失败的状态碼

首先说下AIDL的关键字oneway"",AIDL可以用关键字"oneway"来表明远程调用的行为属性使用了该关键字,那么远程调用将紧紧是调用所有的数据传输过来并立即返回而不会等待结果的返回,也是说不会阻塞远程线程的运行AIDL接口将最终获得一个从Binder线程池中产生的调用(和普通的远程调用类似)。洳果关键字oneway在本地调用中被使用将不会对函数调用有任何影响

为了更好的理解设计者最初的设想,我们来看下"类"的注释

包管理其用于安裝的的回调API在某些情况下,它可以提供一些必要的信息

(3)、为什么要设计成AIDL

我要回帖

更多关于 删除的安装包怎么恢复 的文章

 

随机推荐