一。解析清单文件并加载
app 启动 packagemanagerService 监控system/framwork 、 system/app 、 data/data 、 data/app_private 这些文件,读取mainfest 信息,并建立信息库存储在系统级别共享内存中;
packagemanageService 会建立底层 userids 和groupids 同上层permissions 之间的映射,就会给一些底层用户分配权限,
packagemanageService 解析每个apk 的信息到packages.xml 和packages.list 文件中,在package.list 中记录来了 pkgname userid debugflag datapath,下次开机直接读取 package.xml 和package.list
launcher 就将packagemanagerService 已经解析好的数据都加载到内存,从内存中去读并展示到手机 ,配置了launcher 就可点击了
二。activity 的启动
1.activity 是通过startactivity 启动的,由context 调用,其具体的实现类是 contextimpl .在contextimpl 中的startactivity() 会调用activityThread的相关方法, mMainThread.getInstrumentation().execStartActivity() --> activityManagerNative.getDefault.startActivity 放到底层处理,ActivityManagerNative是抽象类,getDefault() 方法返回的是IActivityManager,也仅仅是一个接口而已;其实这个抽象类使用了代理
class ActivityManagerProxy implements IActivityManager;
最终 调用
mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
从代码发现了mRemote是一个IBinder,调用了IBinder的transact()方法
IApplicationThread执行了启动activity,那么谁实现了该接口呢?当然是ApplicationThread,这个类是ActivityThread的内部类。
scheduleLaunchActivity 我们看到最后的sendMessage,往下走我们找到H类的处理消息方法 ,最后发现performLaunchActivity
最后的逻辑都在这里,通过我们的intent数据,结合classLoader找到了相关的类并且加载进来了。
2 activityMonitor 监控activity
当创建的时候,会给zctivity 配置一个activityMonitor ,监控activity 的生命周期:
在instumentation 的execstartactivity () 上来先判断activityMonitor ==null ,在第一次开启activity 的时候,activityMonitor =null; 就会调用 activityManagerNative.getdefault().startActivity();调用JNI 创建,同时也创建了activityMontor,在其中就有activity 的生命周期的监控