【Android源码 栏目提醒】:网学会员鉴于大家对Android源码 十分关注,论文会员在此为大家搜集整理了“Android系统默认Home应用程序(Launcher)的启动过程源代码分析 - 电子设计”一文,供大家参考学习
Android系统默认Home应用程序Launcher的启动过程源代码分析 在前面一篇文章中我们分析了
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_init 函数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文件中 java view plaincopy 1. public final class ActivityManagerService extends ActivityManagerNative 2. implements Watchdog.Monitor BatteryStatsImpl.BatteryCallback 3. ...... 4. 5. public static final Context mainint 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 at.getSystemContext 23. m.mContext context 24. m.mFactoryTest factoryTest 25. m.mMainStack new ActivityStackm context true 26. 27. m.mBatteryStatsService.publishcontext 28. m.mUsageStatsService.publishcontext 29. 30. synchronized thr 31. thr.mReady true 32. thr.notifyAll 33. 34. 35. m.startRunningnull null null null 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文件中 java view plaincopy 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.addServicequotactivityquot m 10. ServiceManager.addServicequotmeminfoquot new MemBinderm 11. if MONITOR_CPU_USAGE 12. ServiceManager.addServicequotcpuinfoquot new CpuBinderm 13. 14. ServiceManager.addServicequotpermissionquot new Per
missionControllerm 15. 16. ApplicationInfo info 17. mSelf.mContext.getPackageManager.getApplicationInfo 18. quotandroidquot STOCK_PM_FLAGS 19. mSystemThread.installSystemApplicationInfoinfo 20. 21. synchronized mSelf 22. ProcessRecord app mSelf.newProcessRecordLocked 23. mSystemThread.getApplicationThread info 24. info.processName 25. app.persistent true 26. app.pid MY_PID 27. app.maxAdj SYSTEM_ADJ 28. mSelf.mProcessNames.putapp.processName app.info.uid app 29. synchronized mSelf.mPidsSelfLocked 30. mSelf.mPidsSelfLocked.putapp.pid app 31. 32. mSelf.updateLruProcessLockedapp true true 33. 34. catch PackageManager.NameNotFoundException e 35. throw new RuntimeException 36. quotUnable to find
android system packagequot e 37. 38. 39. ...... 40. 这个函数首先是将这个ActivityManagerService实例添加到ServiceManager中去托管这样其它地方就可以通过ServiceManager.getService接口来访问这个全局唯一的ActivityManagerService实例了接着又通过调用mSystemThread.installSystemApplicationInfo函数来把应用程序框架层下面的
android包加载进来 这里的mSystemThread是一个ActivityThread类型的实例变量它是在上面的Step 7中创建的后面就是一些其它的初始化
工作了。
Step 10. ActivityManagerService.systemReady 这个函数是在上面的Step 6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用的它定义在frameworks/base/services/java/com/
android/server/am/ActivityManagerServcie.java文件中 java view plaincopy 1. public final class ActivityManagerService extends ActivityManagerNative 2. implements Watchdog.Monitor BatteryStatsImpl.BatteryCallback 3. ...... 4. 5. public void systemReadyfinal Runnable goingCallback 6. ...... 7. 8. synchronized this 9. ...... 10. 11. mMainStack.resumeTopActivityLockednull 12. 13. 14. 15. ...... 16. 这个函数的内容比较多这里省去无关的部分主要关心启动Home应用程序的逻辑这里就是通过mMainStack.resumeTopActivityLocked函数来启动Home应用程序的了这里的mMainStack是一个ActivityStack类型的实例变量。
Step 11. ActivityStack.resumeTopActivityLocked 这个函数定义在frameworks/base/services/java/com/
android/server/am/ActivityStack.java文件中 java view plaincopy 1. public class ActivityStack 2. ...... 3. 4. final boolean resumeTopActivityLockedActivityRecord prev 5. // Find the first activity that is not finishing. 6. ActivityRecord next topRunningActivityLockednull 7. 8. ...... 9. 10. if next null 11. // There are no more activities Lets just start up the 12. // Launcher... 13. if mMainStack 14. return mService.startHomeActivityLocked 15. 16. 17. 18. ...... 19. 20. 21. ...... 22. 这里调用函数topRunningActivityLocked返回的是当前系统Activity堆栈最顶端的Activity由于此时还没有Activity被启动过因此返回值为null即next变量的值为null于是就调用mService.startHomeActivityLocked语句这里的mService就是前面在Step 7中创建的ActivityManagerService实例了。
Step 12. ActivityManagerService.startHomeActivityLocked 这个函数定义在frameworks/base/services/java/com/
android/server/am/ActivityManagerServcie.java文件中 java view plaincopy 1. public final class ActivityManagerService extends ActivityManagerNative 2. implements Watchdog.Monitor BatteryStatsImpl.BatteryCallback 3. ...... 4. 5. boolean startHomeActivityLocked 6. ...... 7. 8. Intent intent new Intent 9. mTopAction 10. mTopData null Uri.parsemTopData : null 11. intent.setComponentmTopComponent 12. if mFactoryTest SystemServer.FACTORY_TEST_LOW_LEVEL 13. intent.addCategoryIntent.CATEGORY_HOME 14. 15. ActivityInfo aInfo 16. intent.resolveActivityInfomContext.getPackageManager 17. STOCK_PM_FLAGS 18. if aInfo null 19. intent.setComponentnew ComponentName 20. aInfo.applicationInfo.packageName aInfo.name 21. // Dont do this if the home app is currently being 22. // instrumented. 23. ProcessRecord app getProcessRecordLockedaInfo.processName 24. aInfo.applicationInfo.uid 25. if app null app.instrumentationClass null 26. intent.setFlagsintent.getFlags Intent.FLAG_ACTIVITY_NEW_TASK 27. mMainStack.startActivityLockednull intent null null 0 aInfo 28. null null 0 0 0 false false 29. 30. 31. 32. return true 33. 34. 35. ...... 36. 函数首先创建一个CATEGORY_HOME类型的Intent然后通过Intent.resolveActivityInfo函数向PackageManagerService
查询Category类型为HOME的Activity这里我们假设只有系统自带的Launcher应用程序
注册了HOME类型的Activity见packages/apps/Launcher2/AndroidManifest.xml文件 html view plaincopy 1. ltmanifest 2.
xmlns:androidquothttp://schemas.
android.com/apk/res/androidquot 3. packagequotcom.
android.launcherquot 4.
android:sharedUserIdquotstring/sharedUserIdquot 5. gt 6. 7. ...... 8. 9. ltapplication 10.
android:namequotcom.
android.launcher2.LauncherApplicationquot 11.
android:processquotstring/processquot 12.
android:labelquotstring/application_namequot 13.
android:iconquotdrawable/ic_launcher_homequotgt 14. 15. ltactivity 16.
android:namequotcom.
android.launcher2.Launcherquot 17.
android:launchModequotsingleTaskquot 18.
android:clearTaskOnLaunchquottruequot 19.
android:stateNotNeededquottruequot 20.
android:themequotstyle/Themequot 21.
android:screenOrientationquotnosensorquot 22.
android:windowSoftInputModequotstateUnspecifiedadjustPanquotgt 23. ltintent-filtergt 24. ltaction
android:namequotandroid.intent.action.MAINquot /gt 25. ltcategory
android:namequotandroid.intent.category.HOMEquot /gt 26. ltcategory
android:namequotandroid.intent.category.DEFAULTquot /gt 27. ltcategory
android:namequotandroid.intent.category.MONKEYquot/gt 28. lt/intent-filtergt 29. lt/activitygt 30. 31. ...... 32. lt/applicationgt 33. lt/manifestgt 因此这里就返回com.
android.launcher2.Launcher这个Activity了。
由于是第一次启动这个Activity接下来调用函数getProcessRecordLocked返回来的ProcessRecord值为null于是就调用mMainStack.startActivityLocked函数启动com.
android.launcher2.Launcher这个Activity了这里的mMainStack是一个ActivityStack类型的成员变量。
Step 13. ActivityStack.startActivityLocked 这个函数定义在frameworks/base/services/java/com/
android/server/am/ActivityStack.java文件中具体可以参考
Android应用程序启动过程源代码分析一文这里就不详述了在我们这个场景中调用这个函数的最后结果就是把com.
android.launcher2.Launcher启动起来接着调用它的onCreate函数。
Step 14. Launcher.onCreate 这个函数定义在packages/apps/Launcher2/src/com/
android/launcher2/Launcher.java文件中 java view plaincopy 1. public final class Launcher extends Activity 2. implements View.OnClickListener OnLongClickListener LauncherModel.Callbacks AllAppsView.Watcher 3. ...... 4. 5. Override 6. protected void onCreateBundle savedInstanceState 7. ...... 8. 9. if mRestoring 10. mModel.startLoaderthis true 11. 12. 13. ...... 14. 15. 16. ...... 17. 这里的mModel是一个LauncherModel类型的成员变量这里通过调用它的startLoader成员函数来执行加应用程序的操作。
Step 15. LauncherModel.startLoader 这个函数定义在packages/apps/Launcher2/src/com/
android/launcher2/LauncherModel.java文件中 java view plaincopy 1. public class LauncherModel extends BroadcastReceiver 2. ...... 3. 4. public void startLoaderContext context boolean isLaunching 5. ...... 6. 7. synchronized mLock 8. ...... 9. 10. // Dont bother to start the thread if we know its not going to do anything 11. if mCallbacks null ampamp mCallbacks.get null 12. // If there is already one running tell it to stop. 13. LoaderTask oldTask mLoaderTask 14. if oldTask null 15. if oldTask.isLaunching 16. // dont downgrade isLaunching if were already running 17. isLaunching true 18. 19. oldTask.stopLocked 20. 21. mLoaderTask new LoaderTaskcontext isLaunching 22. sWorker.postmLoaderTask 23. 24. 25. 26. 27. ...... 28. 这里不是直接加载应用程序而是把加载应用程序的操作作为一个消息来处理。
这里的sWorker是一个Handler通过它的post方式把一个消息放在消息队列中去然后系统就会调用传进去的参数mLoaderTask的run函数来处理这个消息这个mLoaderTask是LoaderTask类型的实例于是下面就会执行LoaderTask类的run函数了。
Step 16. LoaderTask.run 这个函数定义在packages/apps/Launcher2/src/com/
android/launcher2/LauncherModel.java文件中 java view plaincopy 1. public class LauncherModel extends BroadcastReceiver 2. ...... 3. 4. private class LoaderTask implements Runnable 5. ...... 6. 7. public void run 8. ...... 9. 10. keep_running: 11. ...... 12. 13. // second step 14. if loadWorkspaceFirst 15. ...... 16. loadAndBindAllApps 17. else 18. ...... 19. 20. 21. ...... 22. 23. 24. ...... 25. 26. 27. ...... 28. 29. 30. ...... 31. 这里调用loadAndBindAllApps成员函数来进一步操作。
Step 17. LoaderTask.loadAndBindAllApps 这个函数定义在packages/apps/Launcher2/src/com/
android/launcher2/LauncherModel.java文件中 java view plai.