Android APP启动过程中应用代码的加载

APP启动过程

  1. zygote->ActivityThread过程略过
  2. ActivityThread main函数
    attach->ActivityManagerNative获得AMS代理对象IActivityManager
    ->AMS attachApplication
  3. AMS attachApplication
    ProcessRecord app对象在startProcessLocked函数中已经创建

    if (app == null) {      checkTime(startTime, "startProcess: creating new process record");      app = newProcessRecordLocked(info, processName, isolated, isolatedUid);  

    调用newProcessRecordLocked函数

  4. ActivityThread bindApplication函数
    封装AppBindData调用handleBindApplication
  5. handleBindApplication
    APPBindData中最重要的两个参数:appInfo(AppAplication对象,该对象在PMS启动的时候scan时候创建),compatInfo(CompatibilityInfo对象,描述APP启动时候一些环境信息,缩放、分辨率等类似信息)。

    data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);  

    第一次尝试获得LoadedAPK信息,

    private LoadedApk getPackageInfo(...) {    ...    packageInfo =                    new LoadedApk(this, aInfo, compatInfo, baseLoader, ...);  

    此时传进来的baseLoader为空,此时并未设置APP的class loader.
    instrumentationName 为通过am instrument启动时候的参数,该方法用于启动一个Instrumentation测试,例子:

    adb shell am instrument -w com.le.tcauto.uitest.test/android.support.test.runner.AndroidJUnitRunner  

    因此执行以下代码,创建Instrumentation类(工具类,用处很大):

    mInstrumentation = new Instrumentation();    

    创建Context,并创建该APP的Class Loader:

    Application app = data.info.makeApplication(data.restrictedBackupMode, null);    mInitialApplication = app;  

    makeApplication函数:

    java.lang.ClassLoader cl = getClassLoader();        if (!mPackageName.equals("android")) {            initializeJavaContextClassLoader();     }

    getClassLoader函数:

    mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip, lib,                mBaseClassLoader);

    其中zip和lib的位置,是由LoaderAPK的mAppDir和mLibDir设置,这两个变量是LoadedAPK构造函数中ApplicationInfo对象获得的,ApplicationInfo中该成员变量则是在PMS启动时候获得的。ApplicationLoaders中根据zip和lib构造出一个PathClassLoader对象。
    initializeJavaContextClassLoader:

        ClassLoader contextClassLoader =        (sharable)        ? new WarningContextClassLoader()        : mClassLoader;Thread.currentThread().setContextClassLoader(contextClassLoader);  

    将该class loader设进当前进程。

更多相关文章

  1. C语言函数的递归(上)
  2. android实现文件下载功能
  3. Android: 显示系统模块加载以及调用流程
  4. Android(安卓)播放视频的方法+播放测试地址 http
  5. 学习Android过程中的一些博客或工具收集
  6. Android(安卓)短信模块分析(四) MMS之短信的发送与接收
  7. Android系统的开机画面显示过程分析(11)
  8. Android时间倒计时
  9. Android(安卓)Audio代码分析13 - AudioTrack::getPosition函数

随机推荐

  1. Android.mk文件语法规范及使用模板
  2. 自定义 ProgressBar 进度条 自定义样式
  3. Android单元测试,模拟http的get和post请求
  4. Android(安卓)xutil3.0完全解析
  5. Android轩辕剑之ActionBar之三
  6. Android平台输入法的生命周期
  7. Android(安卓)JNI 篇 - JNI回调的三种方
  8. Android(安卓)获得Url、Uri字符串后面拼
  9. 在Eclipse上搭建Android(安卓)2.3环境
  10. Android(安卓)6.0 新特性之 RunTime Perm