Android APP启动过程中应用代码的加载
来源:互联网 发布:python prime number 编辑:程序博客网 时间:2024/06/09 22:45
Android APP启动过程中应用代码的加载
APP启动过程
- zygote->ActivityThread过程略过
- ActivityThread main函数
attach->ActivityManagerNative获得AMS代理对象IActivityManager
->AMS attachApplication AMS attachApplication
ProcessRecord app对象在startProcessLocked函数中已经创建if (app == null) { checkTime(startTime, "startProcess: creating new process record"); app = newProcessRecordLocked(info, processName, isolated, isolatedUid);
调用newProcessRecordLocked函数
- ActivityThread bindApplication函数
封装AppBindData调用handleBindApplication 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设进当前进程。
- Android APP启动过程中应用代码的加载
- Android中APP的自启动过程
- Android App的启动过程
- Android App的启动过程
- Android 中如何计算 App应用的启动时间?
- SPRING 启动加载BEAN 的代码过程
- android应用的启动过程
- android应用的启动过程
- Android 应用的启动过程
- android app启动过程
- Android app启动过程
- Android APP启动过程
- Android app启动过程
- Android的APP启动过程分析
- Android App 的启动过程简析
- 第二次启动android app的过程分析
- iOS中一个APP的启动过程
- 探究APP应用启动过程
- 并发--我的噩梦
- Linux常用指令
- 微服务与API 网关(上): 为什么需要API网关?
- 修改表的列结构
- linux 命令
- Android APP启动过程中应用代码的加载
- linux 中出现 Read-only file system
- c++ what is different between map and hash_map
- Linux常用操作命令
- POJ
- JavaScript异步编程
- paxos算法
- [转载] linux proc maps文件分析
- 这是一篇用测试MetaAPI的测试内容2