Android每次启动的时候会自动安装位于特定目录下的APK,这个过程会在packageManagerService这个类的构造方法中进行,这里会创建多个目录用于预查找:

public PackageManagerService(Context context, boolean factoryTest) {...mFrameworkDir = new File(Environment.getRootDirectory(), "framework"); // system/frameworkmSystemAppDir = new File(Environment.getRootDirectory(), "app"); // system/appmAppInstallDir = new File(dataDir, "app"); // data/appmDrmAppPrivateInstallDir = new File(dataDir, "app-private"); // data/app-privatemAppDataDir = new File(dataDir, "data"); // data/data...}


它会在这5个地方寻找APK并通过Installer这个类来安装,通过
synchronized (mInstallLock) {   synchronized (mPackages) {     ......   }}
可以看出,同时只能对一个应用进行安装或者删除,且对一个应用做一个操作的时候就不能对同一个应用做另外一个操作
同时可写的目录就会添加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 :

public int install(String name, int uid, int gid) {        StringBuilder builder = new StringBuilder("install");        builder.append(' ');        builder.append(name);        builder.append(' ');        builder.append(uid);        builder.append(' ');        builder.append(gid);        return execute(builder.toString());    }

execute的实现又是
private int execute(String cmd) {String res = transaction(cmd);try {return Integer.parseInt(res);} catch (NumberFormatException ex) {return -1;}}

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

private boolean writeCommand(String _cmd) {byte[] cmd = _cmd.getBytes();int len = cmd.length;if ((len < 1) || (len > 1024)) return false;buf[0] = (byte) (len & 0xff);buf[1] = (byte) ((len >> 8) & 0xff);try {mOut.write(buf, 0, 2);mOut.write(cmd, 0, len);} catch (IOException ex) {            Slog.e(TAG,"write error");disconnect();return false;}return true;}

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

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

更多相关文章

  1. 【MarsChen】D03_Say_Hello_to_Android
  2. ADK的安装
  3. MAC下Android的Eclipse开发环境的搭建
  4. Android(安卓)进行单元测试难在哪-终
  5. Android应用程序获取ROOT权限的方法
  6. [置顶] Android应用程序中加载进度设计
  7. [Android入门]1. Android开发环境搭建
  8. Android(安卓)下arcgis开发学习第一天——环境配置及常见错误
  9. ubuntu 64位 无法安装android SDK解决办法

随机推荐

  1. Android中快速实现自定义字体!
  2. Android 返回键退出APP
  3. android 退出程序
  4. Mac上Android studio环境搭建
  5. Android AP模式下获取SSID/PASSWORD
  6. Android闪光灯开关
  7. Android得到SD卡文件夹大小以及删除文件
  8. android截图
  9. gcc for android
  10. android 方式实现imageview圆角