应用安装涉及到如下几个目录:
system/app 系统自带的应用程序,无法删除
data/app 用户程序安装的目录,有删除权限。安装时把apk文件复制到此目录
data/data 存放应用程序的数据
Data/dalvik-cache 将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)
安装过程:
复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。
- PackageManagerService.java的内部类AppDirObserver实现了监听app目录的功能:当把某个APK拖到app目录下时,可以直接调用scanPackageLI完成安装。
2.手机数据区目录“data/system/packages.xml”文件中,包含了手机上所有已安装应用的基本信息,如安装路径,申请的permission等信息。
将apk文件复制到data/app目录
解析apk信息
dexopt操作
更新权限信息
完成安装,发送Intent.ACTION_PACKAGE_ADDED广播
Instrumentation只在Activity和ActivityThread中有实例。一个APP启动时会创建一个ActivityThread, 会在ActivityThread的handleBindApplication()创建一个空的Instrumentation对象并保存在ActivityThread的成员变量mInstrumentation, 后续每一个Activity在启动时经过Activity的attach()方法,都会把ActivityThread的mInstrumentation赋给Activity的成员mInstrumentation, 也就是同一个应用进程内,所有Activity共用ActivityThread中的同一个Instrumentation。每一个APP的Application对像也是在handleBindApplication()中经由Instrumentation的newApplication()方法创建,且只有一个。
1. 每一个应用进程中只有唯一的ActivityThread, (ActivityThread中,成员【private static ActivityThread sCurrentActivityThread】, 方法【public static ActivityThread currentActivityThread()】)
2. 每一个应用进程中只有唯一的Application, (ActivityThread中,成员【Application mInitialApplication】, 方法【public Application getApplication()】)
3. 每一个应用进程中只有唯一的Instrumentation, (ActivityThread中,成员【Instrumentation mInstrumentation】, 方法【public Instrumentation getInstrumentation()】)
4. 四大组件第一次启动时都会通过LoadedApk中的getClassLoader()方法,创建当前apk的PathClassLoader对象,后续每次要启组新的组件都会通过该ClassLoader来得到组件实际的Class。