在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启动过程。
        Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由SystemServer组件启动的,SystemServer组件首先是启动ePackageManagerServic,由它来负责安装系统的应用程序,具体可以参考前面一篇文章Android应用程序安装过程源代码分析,系统中的应用程序安装好了以后,SystemServer组件接下来就要通过ActivityManagerService来启动Home应用程序Launcher了,Launcher在启动的时候便会通过PackageManagerServic把系统中已经安装好的应用程序以快捷图标的形式展示在桌面上,这样用户就可以使用这些应用程序了,整个过程如下图所示:
点击查看大图
        下面详细分析每一个步骤。
        Step 1. SystemServer.main
        这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 1。
        Step 2. SystemServer.init1
        这个函数是一个JNI方法,实现在 frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 2。
        Step 3. libsystem_server.system_initandroid11系统更新包下载
        函数system_init实现在libsystem_server库中,源代码位于frameworks/base/cmds/system_server/library/system_init.cpp文件中,具体可以参考前面一
篇文章Android应用程序安装过程源代码分析的Step 3。
        Step 4. AndroidRuntime.callStatic
        这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 4。
        Step 5. SystemServer.init2
        这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 5。
        Step 6. ServerThread.run
        这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 6。
        Step 7. ActivityManagerService.main
        这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:
view plain
1. public final class ActivityManagerService extends ActivityManagerNative 
2.         implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { 
3.     ...... 
4.  
5.     public static final Context main(int factoryTest) { 
6.         AThread thr = new AThread(); 
7.         thr.start(); 
8.  
9.         synchronized (thr) { 
10.             while (thr.mService == null) { 
11.                 try { 
12.                     thr.wait(); 
13.                 } catch (InterruptedException e) { 
14.                 } 
15.             } 
16.         } 
17.  
18.         ActivityManagerService m = thr.mService; 
19.         mSelf = m; 
20.         ActivityThread at = ActivityThread.systemMain(); 
21.         mSystemThread = at; 
22.         Context context =&SystemContext(); 
23.         m.mContext = context; 
24.         m.mFactoryTest = factoryTest; 
25.         m.mMainStack = new ActivityStack(m, context, true); 
26.  
27.         m.mBatteryStatsService.publish(context); 
28.         m.mUsageStatsService.publish(context); 
29.  
30.         synchronized (thr) { 
31.             thr.mReady = true
32.             ifyAll(); 
33.         } 
34.  
35.         m.startRunning(nullnullnullnull); 
36.  
37.         return context; 
38.     } 
39.  
40.     ...... 
41.
        这个函数首先通过AThread线程对象来内部创建了一个ActivityManagerService实例,然后将这个实例保存其成员变量mService中,接着又把这个ActivityManagerService实例保存在ActivityManagerService类的静态成员变量mSelf中,最后初始化其它成员变量,就结束了。
        Step 8. PackageManagerService.main
        这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 7。执行完这一步之后,系统中的应用程序的所有信息都保存在PackageManagerService中了,后面Home应用程序Launcher启动起来后,就会把PackageManagerService中的应用程序信息取出来,然后以快捷图标的形式展示在桌面上,后面我们将会看到这个过程。
        Step 9. ActivityManagerService.setSystemProcess
        这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:
view plain
1. public final class ActivityManagerService extends ActivityManagerNative 
2.         implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { 
3.     ...... 
4.  
5.     public static void setSystemProcess() { 
6.         try { 
7.             ActivityManagerService m = mSelf; 
8.  
9.             ServiceManager.addService("activity", m); 
10.             ServiceManager.addService("meminfo"new MemBinder(m)); 
11.             if (MONITOR_CPU_USAGE) { 
12.                 ServiceManager.addService("cpuinfo"new CpuBinder(m)); 
13.             } 
14.             ServiceManager.addService("permission"new PermissionController(m)); 
15.  
16.             ApplicationInfo info = 
17.                 PackageManager().getApplicationInfo(