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

[java] view plain copy
  1. publicPackageManagerService(Contextcontext,booleanfactoryTest){
  2. ...
  3. mFrameworkDir=newFile(Environment.getRootDirectory(),"framework");//system/framework
  4. mSystemAppDir=newFile(Environment.getRootDirectory(),"app");//system/app
  5. mAppInstallDir=newFile(dataDir,"app");//data/app
  6. mDrmAppPrivateInstallDir=newFile(dataDir,"app-private");//data/app-private
  7. mAppDataDir=newFile(dataDir,"data");//data/data
  8. ...
  9. }


它会在这5个地方寻找APK并通过Installer这个类来安装,通过
[java] view plain copy
  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 plain copy
  1. publicintinstall(Stringname,intuid,intgid){
  2. StringBuilderbuilder=newStringBuilder("install");
  3. builder.append('');
  4. builder.append(name);
  5. builder.append('');
  6. builder.append(uid);
  7. builder.append('');
  8. builder.append(gid);
  9. returnexecute(builder.toString());
  10. }

execute的实现又是
[java] view plain copy
  1. privateintexecute(Stringcmd){
  2. Stringres=transaction(cmd);
  3. try{
  4. returnInteger.parseInt(res);
  5. }catch(NumberFormatExceptionex){
  6. return-1;
  7. }
  8. }

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

[java] view plain copy
  1. privatebooleanwriteCommand(String_cmd){
  2. byte[]cmd=_cmd.getBytes();
  3. intlen=cmd.length;
  4. if((len<1)||(len>1024))returnfalse;
  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(IOExceptionex){
  11. Slog.e(TAG,"writeerror");
  12. disconnect();
  13. returnfalse;
  14. }
  15. returntrue;
  16. }

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

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

更多相关文章

  1. Android安全机制解析与应用实践
  2. android源代码编译
  3. AndroidManifest.xml 不同变量的作用(持续更新)
  4. android API1.6--2.1变更摘要
  5. android 项目中规范使用SharedPreferences
  6. Android权限注解
  7. React Native 中文版(含最新Android章节)
  8. Android安装环境搭建
  9. [转]android animation的应用实例

随机推荐

  1. 【Android(安卓)Developers Training】 7
  2. android中SQLite的操作
  3. Android(HTC G7) 安装 Hadoop 伪分布
  4. 如何修改android 默认的actionbar(Theme)
  5. Android(安卓)SpringAnimation弹性动画解
  6. Android(安卓)ListView中添加不同的多种
  7. android静态广播添加权限
  8. Android中launchMode模式详解
  9. Parcelable序列化
  10. 适配不同的Android屏幕