android应用程序的启动【Android】
2014-03-22 20:41
190 查看
一、解析清单文件并加载
应用程序的启动需要从PackageManagerService说起,由于应用程序是由PackageManager管理的,可以简单认为PackageManagerService为应用程序的启动做了一些准备工作,才能将应用程序开启起来。
1、PackageManagerService读取所有应用程序的Mainfest信息,并且建立信息库存储在系统级共享内存中
1)解析:
PackageManagerService在启动后,会进行解析的工作,它会重点监控一些文件:system/framework、system/app、data/app、data/app_private; 一旦将数据存入到这些文件中,就会去解析
2)权限分配:
PackageManagerService会建立底层userids和groupids同上层permissions之间的映射,就会给一些底层用户分配权限,进行权限的映射,UID和GroupID,都会分配相应的权限
3)保存数据:
PackageManagerService还有重要的一个操作就是将解析的每个apk的信息保存到packages.xml和packages.list文件里,
在packages.list记录了如下数据:pkgName,userId,debugFlag,dataPath(包的数据路径),【下次再开机的时候,不会再扫描每个apk了,只需要读packages.xml和packages.list文件即可】,除了这两个主要的工作外,还会进行一些其他的操作,如检测文件等
2、Launcher就将PackageManagerService已经解析并处理好的数据都加载到内存中,从内存中就能获取到相应的数据,并展示到手机上【之所以可以展示在手机桌面上,就是因为在清单文件中配置了如下的内容:】
<action android:name="android.intent.action.MAIN" />:应用程序的入口
<category android:name="android.intent.category.LAUNCHER" />:配置了这个属性就可以显示在列表中
点击图标,应用就被开启起来了.
二、Activity的启动与生命周期的监控
应用程序被开启后,是需要开启并创建Activity,加载相应的view,从而展示出应用程序
1、Activity是通过startActivity开启起来的,startActivity是由由Context调用的,其具体的实现类是ContextImpl
在ContextImpl中的startActivity方法中,会调用ActivityThread的相关方法【mMainThread.getInstrumentation().execStartActivity()】;可以追溯到Instrumentation这个类,其中的execStartActivity()的方法中实现了startActivity的调用:ActivityManagerNative.getDefault().startActivity,由此可以看出是底层进行处理。
2、ActivityMonitor监控Activity
当Activity实例创建的时候,就会给Activity配置一个监视器ActivityMonitor,监控Activity的生命周期:
在Instrumentation的execStartActivity()的方法中,上来先判断ActivityMonitor是否为null:在第一次开启Activity的时候,ActivityMonitor还是null的,就会调用ActivityManagerNative.getDefault().startActivity(…..),是在操作native底层的信息,从而执行startActivity,再去开启一个Activity。简单来说,就是通过调用JNI,调用startActivity方法,开启Activity;创建好了之后,随即也创建好了Activity的监视器ActivityMonitor
3、在ActivityMonitor中就有Activity各种生命周期的监控
①、在newActivity方法中:
可以通过拿到Activity的字节码,创建一个Activity,并将这个Activity返回 , 还会调用attach方法,传入ActivityThread的线程
②、在各种生命周期的方法中,调用activity的各自的生命周期的方法
总结 :
1、通过PackageManagerService将所有用到的资源加载进内存中
2、在Launcher中,将view等控件加载到ViewGroup中,点击每个item会有相应的操作
3、在公开的文档中是找不到具体调用startActivity的类的,而是由系统完成调用的,实现了Activity的启动 , 实际就是通过Context的实现类ContextImpl进行调用的,一步步转到底层(ActivityManagerNative)实现调用
4、另一个重要的类就是ActivityMonitor,监控Activity生命周期的;在其newActivity方法中创建了Activity,并调用了attach方法;也就是说当一个Activity被创建的时候,就会绑定一个ActivityMonitor,用来监控Activity的生命周期
应用程序的启动需要从PackageManagerService说起,由于应用程序是由PackageManager管理的,可以简单认为PackageManagerService为应用程序的启动做了一些准备工作,才能将应用程序开启起来。
1、PackageManagerService读取所有应用程序的Mainfest信息,并且建立信息库存储在系统级共享内存中
1)解析:
PackageManagerService在启动后,会进行解析的工作,它会重点监控一些文件:system/framework、system/app、data/app、data/app_private; 一旦将数据存入到这些文件中,就会去解析
2)权限分配:
PackageManagerService会建立底层userids和groupids同上层permissions之间的映射,就会给一些底层用户分配权限,进行权限的映射,UID和GroupID,都会分配相应的权限
3)保存数据:
PackageManagerService还有重要的一个操作就是将解析的每个apk的信息保存到packages.xml和packages.list文件里,
在packages.list记录了如下数据:pkgName,userId,debugFlag,dataPath(包的数据路径),【下次再开机的时候,不会再扫描每个apk了,只需要读packages.xml和packages.list文件即可】,除了这两个主要的工作外,还会进行一些其他的操作,如检测文件等
2、Launcher就将PackageManagerService已经解析并处理好的数据都加载到内存中,从内存中就能获取到相应的数据,并展示到手机上【之所以可以展示在手机桌面上,就是因为在清单文件中配置了如下的内容:】
<action android:name="android.intent.action.MAIN" />:应用程序的入口
<category android:name="android.intent.category.LAUNCHER" />:配置了这个属性就可以显示在列表中
点击图标,应用就被开启起来了.
二、Activity的启动与生命周期的监控
应用程序被开启后,是需要开启并创建Activity,加载相应的view,从而展示出应用程序
1、Activity是通过startActivity开启起来的,startActivity是由由Context调用的,其具体的实现类是ContextImpl
在ContextImpl中的startActivity方法中,会调用ActivityThread的相关方法【mMainThread.getInstrumentation().execStartActivity()】;可以追溯到Instrumentation这个类,其中的execStartActivity()的方法中实现了startActivity的调用:ActivityManagerNative.getDefault().startActivity,由此可以看出是底层进行处理。
2、ActivityMonitor监控Activity
当Activity实例创建的时候,就会给Activity配置一个监视器ActivityMonitor,监控Activity的生命周期:
在Instrumentation的execStartActivity()的方法中,上来先判断ActivityMonitor是否为null:在第一次开启Activity的时候,ActivityMonitor还是null的,就会调用ActivityManagerNative.getDefault().startActivity(…..),是在操作native底层的信息,从而执行startActivity,再去开启一个Activity。简单来说,就是通过调用JNI,调用startActivity方法,开启Activity;创建好了之后,随即也创建好了Activity的监视器ActivityMonitor
3、在ActivityMonitor中就有Activity各种生命周期的监控
①、在newActivity方法中:
可以通过拿到Activity的字节码,创建一个Activity,并将这个Activity返回 , 还会调用attach方法,传入ActivityThread的线程
②、在各种生命周期的方法中,调用activity的各自的生命周期的方法
总结 :
1、通过PackageManagerService将所有用到的资源加载进内存中
2、在Launcher中,将view等控件加载到ViewGroup中,点击每个item会有相应的操作
3、在公开的文档中是找不到具体调用startActivity的类的,而是由系统完成调用的,实现了Activity的启动 , 实际就是通过Context的实现类ContextImpl进行调用的,一步步转到底层(ActivityManagerNative)实现调用
4、另一个重要的类就是ActivityMonitor,监控Activity生命周期的;在其newActivity方法中创建了Activity,并调用了attach方法;也就是说当一个Activity被创建的时候,就会绑定一个ActivityMonitor,用来监控Activity的生命周期
相关文章推荐
- 使用Android adb命令来启动Android应用程序
- Android应用程序的Activity启动过程简要介绍
- Android之A面试题④应用程序内部启动Activity过程(startActivity)的源代码分析
- android开发(16) 遍历所有的已经安装的应用程序,启动其他的应用程序
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序进程启动过程的源代码分析
- Android adb shell启动应用程序的方法
- android push:Android短消息推送启动应用程序(SMS PUSH)(BroadCastReceiver)
- Android应用程序进程启动过程的源代码分析
- Android 启动应用程序方式
- Android应用程序在新的进程中启动新的Activity的方法和过程分析
- 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
- Android应用程序启动时发生AndroidRuntime : ClassNotFoundException for Activity class的解决方法
- Android应用程序在某些机型上启动有几率一直黑屏
- Android Developers:允许其它应用程序启动你的Activity
- android应用程序启动详情之Dalvik虚拟机
- monkeytalk 启动、关闭 android应用程序 解决方法
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android adb shell启动应用程序的方法