Android每次启动的时候会自动安装位于特定目录下的APK,这个过程会在packageManagerService这个类的构造方法中进行,这里会创建多个目录用于预查找:
[java] view plaincopy
  1. public PackageManagerService(Context context, boolean factoryTest) {
  2. ...
  3. mFrameworkDir = new File(Environment.getRootDirectory(), "framework"); // system/framework
  4. mSystemAppDir = new File(Environment.getRootDirectory(), "app"); // system/app
  5. mAppInstallDir = new File(dataDir, "app"); // data/app
  6. mDrmAppPrivateInstallDir = new File(dataDir, "app-private"); // data/app-private
  7. mAppDataDir = new File(dataDir, "data"); // data/data
  8. ...
  9. }

它会在这5个地方寻找APK并通过Installer这个类来安装,通过

[java] view plaincopy
  1. synchronized (mInstallLock) {
  2. synchronized (mPackages) {
  3. ......
  4. }
  5. }

可以看出,同时只能对一个应用进行安装或者删除,且对一个应用做一个操作的时候就不能对同一个应用做另外一个操作
同时可写的目录就会添加AppObserver 用于监听目录下的变化并调用removePackageLI或者scanPackageLI方法,前者用于删除应用,后者用于安装,这里说的安装仅仅只是将解析过的manifest以一些数据结构的形式保存在packageManagerService中,也就是保存在了内存中并常驻内存,以后系统或者非系统的应用发出的任何意图都会在这里查找匹配的组件。

而真正意义上的安装是安装器 Lnstaller这个类在处理的,你可以讲一个APK文件的后缀改为.RAR 然后解压,会看到里面有里面有一个AndroidManifest.xml,classes.dex,assets

,META-INF和res,而真正的安装是把这些除了manifest之外的东西放到android系统的相应的目录中去,其中classes.dex相当于dailvk虚拟机上的可执行文件,assets是放的一些不会被变异的原始资源,res里是一些DEX要用到的资源,META-INF是描述APK的元数据

而Installer完整安装的原理又是什么呢?  com.android.server.Installer这个类其实是通过 ADB命令来安装的,相当于 adb install xx.xx.xx  :

[java] view plaincopy
  1. public int install(String name, int uid, int gid) {
  2. StringBuilder builder = new StringBuilder("install");
  3. builder.append(' ');
  4. builder.append(name);
  5. builder.append(' ');
  6. builder.append(uid);
  7. builder.append(' ');
  8. builder.append(gid);
  9. return execute(builder.toString());
  10. }

execute的实现又是

[java] view plaincopy
  1. private int execute(String cmd) {
  2. String res = transaction(cmd);
  3. try {
  4. return Integer.parseInt(res);
  5. } catch (NumberFormatException ex) {
  6. return -1;
  7. }
  8. }

transaction又是通过writeCommand(cmd)这个方法实现的

[java] view plaincopy
  1. private boolean writeCommand(String _cmd) {
  2. byte[] cmd = _cmd.getBytes();
  3. int len = cmd.length;
  4. if ((len < 1) || (len > 1024)) return false;
  5. buf[0] = (byte) (len & 0xff);
  6. buf[1] = (byte) ((len >> 8) & 0xff);
  7. try {
  8. mOut.write(buf, 0, 2);
  9. mOut.write(cmd, 0, len);
  10. } catch (IOException ex) {
  11. Slog.e(TAG,"write error");
  12. disconnect();
  13. return false;
  14. }
  15. return true;
  16. }

这里的mOut 是通过LocalSocket这个类获得的runtime运行时环境的流,往流里写东西然后刷新进去 就相当于在窗口下输入 各种指令了,所以真正安装的更底层的步骤就只有看adb这个命令的C/C++的源码了~

好了基本的安装步骤和原理就是这样的啦~!

转载于:https://blog.51cto.com/zhaohaiyang/901536

Android APK应用安装原理(2)-查找APK并自动安装相关推荐

  1. android版本过高导致下载软件后无法自动安装

    安卓6.0以上可能会出现后台下载软件后无法自动安装. 原因是:6.0以上的系统获取到手机路径不对,所以系统找不到下载后的软件 解决方法:1.在配置文件AndroidManifest.xml中的节点下加 ...

  2. centos6.4 yum装php,CentOS6.x/6.5/6.4/6.3/6.2/7.x 64位安装php5.2(使用YUM自动安装)

    搜索热词 默认情况下,CentOS6 64 bit 已经早已不支持PHP5.2.x ,但是某些PHP程序还需要zend optimizer支持,怎么办呢?目前大部分的yum repos 都已经不支持直 ...

  3. python cv2模块安装_Python运行脚本前,自动安装需要的模块包

    在服务器上部署Python程序时,往往需要先安装很多需要的模块包.如果一个一个安装就会出现忘记的情况.或者新增加某个新的模块时,也可能会忘记安装. 这里先讲一下怎么通过Python程序自动安装. 以下 ...

  4. 服务器系统盘安装在sdb,从U盘自动安装centos5.3到服务器

    从U盘自动安装centos5.3到服务器作者:田逸(sery@163.com)from: http://blog.formyz.org前几天,买服务器,供货商赠送1个8G的U盘,于是我就想拿这个U盘来 ...

  5. mysql 5.6.28安装图解_mysql 5.6.28 自动安装shell脚本

    mysql5.6.28自动安装shell脚本,为了包装源码包的可靠性,请自行下载mysql-5.6.28.tar.gz,接着我就不说废话,附上自动安装脚本.#!/bin/bash #author ab ...

  6. windows installer没有正确安装_电脑还可以这样禁止软件自动安装,后悔知道得太晚...

    安装软件的时候,总会无缘无故的出现几个不知名的软件,自行删除又害怕它在电脑系统里面留下病毒,相信很多人都遇到过这种情况,其实这是可以解决的.想要电脑上不被自动安装软件,只要进行简单的设置即可,下面来演 ...

  7. linux 安装 加入内核参数,Linux 实现自动安装服务组件以及优化内核参数

    安装好Linux裸机后(安装请参考: http://www.linuxidc.com/Linux/2014-12/111062.htm),还需要在其上安装一些基础组件,一般是手动一个个安装,比较繁复也 ...

  8. 搭建自动安装的linux,RedHat7搭建无人值守自动安装Linux操作系统(PXE+Kickstart)

    Kickstart服务器 IP: 192.168.136.253   掩码:255.255.255.0   网关:192.168.136.2   DNS:192.168.136.2 安装部署yum源服 ...

  9. 自动抢红包,自动安装原理之AccessibilityService

    前段时间看别人博客的时候偶然间看到了Android微信自动回复功能,最后的效果也很不错,博主在文中提到了AccessibilityService,以前压根没接触过这东西,表示一脸懵逼.也是这个原因我去 ...

最新文章

  1. java 调用office_JAVA调用PageOffice在线打开、编辑Word文档
  2. 服务幂等以及常用实现方式
  3. 1012 The Best Rank (25 分)【难度: 中 / 知识点: 排序 前缀和】
  4. oracle11G在linux环境下的卸载操作
  5. 阿里云MVP第14期全球发布:云时代2.0,遇见科技追梦者!
  6. css textarea行数_限制textarea中的行数并使用jQuery显示行数
  7. 分布式下的session问题
  8. k8s修改node的ROLES标签
  9. shell调用hive客户端导致nohup后台进程stopped
  10. 36. Never redifine an inherited non-virtual function
  11. Typora免费版下载【Mac、Windows】
  12. mysql中文版 win7_MySQL数据库下载64位下载-MySQL数据库64位【支持win7/win10】8.0.18 官方中文最新版-东坡下载...
  13. excel VBA 编程,数据处理,并画图,详细代码,加解释
  14. 【OpenCV入门教程之五】 分离颜色通道多通道图像混合
  15. 文章总结:ASPLOS 2013 Architecture I
  16. matlab公式上为什么会有问号,MathType公式显示问号怎么解决
  17. win10 ISO镜像下载
  18. 深度Linux 安装英伟达闭源驱动,deepin20 安装英伟达闭源驱动的步骤详解
  19. 运维演进正确之道_API演进的正确方法
  20. 梅克尔工作室-赵一帆-鸿蒙笔记4

热门文章

  1. Android View篇之自定义验证码输入框
  2. access、trunk、hybrid
  3. 忘记了理想等于人生失去了意义。
  4. JAVA就业指导(转)
  5. Android零基础入门第30节:两分钟掌握FrameLayout帧布局
  6. 云计算已成创新基础设施,三大暗流左右未来“云市场”
  7. 《DNS与BIND(第5版)》——7.6 保持一切平稳运行
  8. java面试基础问题积累----多线程,并发
  9. GoDaddy万用https ssl证书如何通过DNS审核
  10. PhpCms V9调用指定栏目子栏目文章的方法