版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher 了,本文将详细分析 Launcher应用程序的启动过程。Android 系统的 Home 应用程序 Launcher 是由 ActivityManagerService 启动的,而 ActivityManagerService 和 PackageManagerService 一样,都是在开机时由 SystemServer 组件启动的, SystemServer组件首先是
2、启动ePackageManagerServic,由它来负责安装系统的应用程序,具体可以参|考前面一篇文章 Android应用程序安装过程源代码分析,系统中的应用程序安装好了以后,SystemServer组件接下来就要通过 ActivityManagerService 来启动Home应用程序Launcher 了,Launcher在启动的时 候便会通过PackageManagerServic把系统中已经安装好的应用程序以快捷图标的形式展示在桌面上,这样用户就可以使用这些应用程序了,整个过程如下图所示:BfirUrchH 峠 iMumm点击查看大图下面详细分析每一个步骤。Step 1. System
3、Server.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_se
4、rver.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. Syste
5、mServer.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. ActivityManagerServ
6、ice.main这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:view plain1. public final class ActivityMa nagerServiceexte nds ActivityMa nagerNative2. impleme nts Watchdog.Mo nitor, BatteryStatsImpl.BatteryCallback 3. 4.4. public static final Con text main(int fac
7、toryTest) 5. AThread thr =new AThread();6. thr.start();8.7. syn chro ni zed(thr) 8. while (thr.mService =null ) 9. try 10. thr.waitO;11. catch (In terruptedExcepti on e) 12. 13. 14. 17.15. ActivityMa nagerServicem = thr.mService;16. mSelf = m;20.ActivityThread at = ActivityThread.systemMa in();21.mS
8、ystemThread = at;22.Con text con text = at.getSystemC on text。;23.m.mC ontext = con text;24.m.mFactoryTest = factoryTest;25.m.mMa in Stack =new ActivityStack(m, con text,true );26.27.m.mBatteryStatsService.publish(co ntext);28.m.mUsageStatsService.publish(c on text);29.30.syn chro ni zed(thr) 31.thr
9、.mReady =true ;32.thr.n otifyAII();33.34.35.m.startRunning(null , null , null , null );36.37.returncon text;1.这个函数首先通过 AThread线程对象来内部创建了一个 ActivityManagerService 实例,然后将这个 实例保存其成员变量 mService中,接着又把这个 ActivityManagerService 实例保存在 ActivityManagerService类的静态成员变量 mSelf中,最后初始化其它成员变量,就结束了。Step 8.
10、PackageManagerService.main这个函数定义在 frameworks/base/services/java/com/android/server/PackageManagerService.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 7。执行完这一步之后,系统中的应用程序的所有信息都保存在PackageManagerService 中了,后面Home应用程序Launcher启动起来后,就会把 PackageManagerService中的应用程序信息取出来,然后以快捷图标的形式展示在桌面上,后面我们将会看到这个过程。Step
11、9. ActivityManagerService.setSystemProcess这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:view plain1. public final class ActivityMa nagerServiceexte nds ActivityMa nagerNative2. impleme nts Watchdog.Mo nitor, BatteryStatsImpl.BatteryCallback 3. 4.4. public
12、static void setSystemProcess() 5. try 7.ActivityMa nagerService m = mSelf;8.39.40.ServiceMa nager.addService(ServiceMa nager.addService(if (MONITOR_CPU_USAGE) ServiceMa nager.addService(ServiceMa nager.addServic
13、e(activity , m);meminfo , new MemBinder(m);cpuinfo , new CpuBinder(m);permissi onnew Permissi onCon troller(m);Applicati onlnfo info =mSelf.mC on text.getPackageMa nager().getApplicati onlnfo(a ndroid, STOCK_PM_FLAGS);mSystemThread.i nstallSystemApplicati onlnfo(in fo);syn chro ni zed(mSelf) Process
14、Record app = mSelf. newProcessRecordLocked(mSystemThread.getApplicati on Thread。,info,in cessName);app.persistent =true ;app.pid = MY_PID;app.maxAdj = SYSTEM_ADJ;mSelf.mProcessNames.put(cessName, app.i nfo.uid, app);syn chro ni zed(mSelf.mPidsSelfLocked) mSelf.mPidsSelfLocked.put(app.pi
15、d, app);mSelf.updateLruProcessLocked(app,true , true );catch (PackageMa nager.NameNotFo un dExcepti on e) throw new Run timeExcepti on(Un able to find an droid system package, e);这个函数首先是将这个 ActivityManagerService实例添加到ServiceManager 中去托管,这样其它地方就可以通过ServiceManager.getService接口来访问这个全局唯一的ActivityManager
16、Service实例了,接着又通过调用 mSystemThread.installSystemApplicationInfo函数来把应用程序框架层下面的android包加载进来,这里的mSystemThread 是一个ActivityThread 类型的实例变量,它是在上面的 Step 7中创建 的,后面就是一些其它的初始化工作了。Step 10. ActivityManagerService.systemReady这个函数是在上面的 Step 6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用的,它定义在 frameworks/base/services/j
17、ava/com/android/server/am/ActivityManagerServcie.java文件中:view plain1.public final class ActivityMa nagerServiceexte nds ActivityMa nagerNative2.impleme nts Watchdog.Mo nitor, BatteryStatsImpl.BatteryCallback 3.4.5.public void systemReady( finalRunnable goingCallback) 6.7.8.synchronized( this ) 9.10.
18、11.mMain Stack.resumeTopActivityLocked(null );5.16.这个函数的内容比较多,这里省去无关的部分,主要关心启动 Home应用程序的逻辑,这里就是通 过 mMainStack.resumeTopActivityLocked 函数来启动 Home 应用程序的了,这里的mMainStack 是一个ActivityStack类型的实例变量。Step 11. ActivityStack.resumeTopActivityLocked这个函数定义在 frameworks/base/services/java/com/android/serv
19、er/am/ActivityStack.java文件中:view plain1.public class ActivityStack 2.3.4.final boolea n resumeTopActivityLocked(ActivityRecord prev) 5./ Find the first activity that is not finishing.6.ActivityRecord next = topR unnin gActivityLocked(0.if (next =null ) 11./ There are no more activities! Lets
20、just start up the12./ Laun cher.13.if (mMa in Stack) 14.retur nmService.startHomeActivityLocked();8.19.null );20.21.22. 这里调用函数topRunningActivityLocked 返回的是当前系统 Activity堆栈最顶端的Activity,由于此 时还没有Activity被启动过,因此,返回值为 null,即next变量的值为null,于是就调用 mService.startHomeActivityLocked 语句,这里的 mService 就是前
21、面在 Step 7 中创建的 ActivityManagerService实例了。Step 12. ActivityManagerService.startHomeActivityLocked这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:view plain1. public final class ActivityMa nagerServiceexte nds ActivityMa nagerNative2. impleme nts Watchdog.Mo n
22、itor, BatteryStatsImpl.BatteryCallback 3. 4.4. boolea n startHomeActivityLocked() 5. 7.6. Intent intent =new lntent(7. mTopAct ion,8. mTopData !=null ? Uri.parse(mTopData) :null );9. inten t.setComp onen t(mTopComp onen t);10. if(mFactoryTest!=SystemServer.FACTORY_TEST_LOW_LEVEL) 11. in te nt.addCat
23、egory(l nte nt.CATEGORY_HOME);12. 13. Activitylnfo alnfo =14. intent.resolveActivity In fo(mC on text.getPackageMa nager(),15. STOCK_PM_FLAGS);16. if (alnfo !=null ) 17. inten t.setComp onent(new Comp onen tName(18. aln fo.applicati onln fo.packageName, alnfo.n ame);19. / Dont do this if the home ap
24、p is curre ntly being20. /in strume nted.21. ProcessRecord app = getProcessRecordLocked(a In cessName,22. aln fo.applicati onln fo.uid);23. if (app = n ull | app.i nstrume ntati on Class =null ) 24. in te nt.setFlags(i nten t.getFlags() | ln te nt.FLAG_ACTIVITY_NEW_TASK);25. mMainStack.startAc
25、tivityLocked(null , intent,null , null , 0, alnfo,26. null , null , 0, 0, 0, false , false );27. 28. 31.return true ;29. 34.30. .31. 函数首先创建一个 CATEGORY_HOME 类型的Intent,然后通过Intent.resolveActivitylnfo 函数向 PackageManagerService 查询Category类型为HOME的Activity,这里我们假设只有系统自带的Launcher应用程序注册了 HOME 类型的 Activity (见
26、packages/apps/Launcher2/AndroidManifest.xml文件):view plain1.ma nifest.4.an droid:sharedUserld=stri ng/sharedUserld.9.applicati onxmln s:a ndroid = ndroidpackage =com.a ndroidaun cher1.an droid:process=stri ng/process12.an droid:label=stri ng/applicati on_n ame13.an droid:ic on=d
27、rawable/ic_la un cher_home14.15.23.vinten t-filter24.25.vcategoryan droid:n ame=a ndroid.i nten t.category.HOME/26.vcategoryan droid:n ame=a ndroid.i nte nt.category.DEFAULT27.vcategoryan droid:n ame=a ndroid.i nte nt.category.MONKEY/28.v/i nten t-filter29.v/activity30.31.32.v/applicati on19.an droi
28、d:stateNotNeeded=true/因此,这里就返回com.android.launcher2.Launcher 这个Activity 了。由于是第一次启动这个 Activity , 接下来调用函数 getProcessRecordLocked 返回来的ProcessRecord 值为null,于是,就调用 mMainStack.startActivityLocked函数启动 com.android.launcher2.Launcher 这个 Activity 了,这里的mMainStack 是一个ActivityStack 类型的成员变量。Step 13. ActivityStack
29、.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/La
30、uncher.java文件中:view plain1.public final class Laun cher exte nds Activity2.impleme ntsView. On ClickListe ner, OnLon gClickListe ner. La un cherModel.Callbacks, AllAppsView.Watcher 3.4.5.Otectedvoidon Create(B un dle saved In sta nceState) 7.8.9.if (!mRestoring) 10.mModel.startLoader(thi
31、s , true );7.这里的 mModel是一个LauncherModel类型的成员变量,这里通过调用它的startLoader 成员函数来执行加应用程序的操作。Step 15. LauncherModel.startLoader这个函数定义在 packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:view plain.5.public class Laun cherModelexte nds BroadcastReceiver public voi
32、d startLoader(C on text con text,boolea n isLa un chi ng) 6.7.syn chro ni zed(mLock) 8.9.10./ Dont bother to start the thread if we know its not going to do anything11.if (mCallbacks !=null & mCallbacks.getO !=null ) 12./If there is already one running, tell it to stop.13.LoaderTask oldTask = mLoade
33、rTask;14.if (oldTask !=null ) 15.if (oldTask.isLaunching() 16./ dont dow ngrade isLa unching if were already running17.isLa un chi ng =true ;18.19.oldTask.stopLocked();20.21.mLoaderTask =new LoaderTask(c on text, isLa un chi ng);22.sWorker.post(mLoaderTask);6.2728. 这里不是直接加载应用程序,而是把加载应用程序的操
34、作作为一个消息来处理。这里的sWorker是一个Handler,通过它的post方式把一个消息放在消息队列中去,然后系统就会调用传进去的参数mLoaderTask的run函数来处理这个消息,这个mLoaderTask是LoaderTask类型的实例,于是,下面就会执行LoaderTask类的run函数了。Step 16. LoaderTask.run这个函数定义在 packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:view plain1.public class Laun cherModelexte
35、nds BroadcastReceiver 2.3.4.privateclass LoaderTaskimpleme nts Runn able 5.6.7.public void run() 8.9.10.keep_r unning: 9.30.31./ sec ond stepif (loadWorkspaceFirst) loadA ndBi ndAIIApps();else 这里调用loadAndBindAIIApps 成员函数来进一步操作Step 17. LoaderTask
36、.loadAndBindAllApps这个函数定义在 packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java 中:view plain1. publicclass Laun cherModel exte nds BroadcastReceiver 2. .3.3. privateclass LoaderTask impleme ntsRunn able 4. .6.5. private void loadA ndBi ndAIIApps() 6. .9.文件10.if (!mAIIAppsLoaded) 11.l
37、oadAIIAppsByBatch();12.if (mStopped) 13.return ;14.15.mAIIAppsLoaded =true16.else 17.on lyBi ndAIIApps();18. 19. 20.21.22. 23. 24.2526. 由于还没有加载过应用程序,这里的mAIIAppsLoaded为false,于是就继续调用loadAIIAppsByBatch函数来进一步操作了。Step 18. LoaderTask.loadAIIAppsByBatch这个函数定义在 packages/apps/Launcher2/src/com/android/launch
38、er2/LauncherModel.java文件中:view plain1.public class Laun cherModelexte nds BroadcastReceiver 2.3.4.privateclass LoaderTaskimpleme nts Runn able 5.6.7.private void loadAIIAppsByBatch。8.9.10.final Intent mainlntent =new Intent(lntent.ACTION_MAIN,null )11.mai nln te nt.addCategory(l nte nt.CATEGORY_LAUN
39、CHER);12.13.finalPackageMa nager packageMa nager = mCon text.getPackageMa nager();14.ListvResolvelnfo apps =null ;15.16.int N = In teger.MAX_VALUE;17.18.intstart In dex;19.int i= 0;20.int batchSize = -1 ;21.while (i N & !mStopped) 22.if (i =0) 23.mAIIAppsList.clear();24.25.apps = packageMa nager.que
40、ry Inten tActivities(ma inIntent,0);1.N = apps.size();if (mBatchSize =0) batchSize = N;else batchSize = mBatchSize;Collecti on s.sort(apps,new Resolve In fo.Display
41、NameComparator(packageMa nager); startin dex = i;for ( int j= 0; iN & jvbatchSize; j+) / This builds the icon bitmaps.mAIIAppsList.add(new Applicati onln fo(apps.get(i), mic on Cache);i+;finalboolea n first = i added = mAllAppsList.added;mAIIAppsList.added =new ArrayListvApplicati onln fo();mHan dle
42、r.post(new Runn able() public void run() final long t = SystemClock.uptimeMillis(); if (callbacks != null ) if (first) callbacks.b in dAllApplicati on s(added);else callbacks.b in dAppsAdded(added);else );72.73. 74. 75.75. 76. 78.77. 78. 81.8283.函数首先构造一个 CATEGORY_LAUNCHER 类型的Intent :view plain1. fin
43、al Intent mainln te nt =new In te nt(l nte nt.ACTION_MAIN,null );2. mai nln te nt.addCategory(l nten t.CATEGORY_LAUNCHER);接着从 mContext 变量中获得 PackageManagerService 的接口:view plain1. final PackageMa nager packageMa nager = mCon text.getPackageMa nager();下一步就是通过这个 PackageManagerService.queryIntentActivi
44、ties 接口来取回所有 Action类型为Intent.ACTION_MAIN ,并且 Category 类型为 Intent.CATEGORY_LAUNCHER 的 Activity 了。我们先进入到PackageManagerService.querylntentActivities函数中看看是如何获得这些Activity的,然后再回到这个函数中来看其余操作。Step 19. PackageManagerService.querylntentActivities这个函数定义在 frameworks/base/services/java/com/android/server/Package
45、ManagerService.java文件中:view plain1. class PackageMa nagerServiceexte nds IPackageMa nager.Stub 2. .3.3. public ListvResolve lnfo query Inten tActivities(I ntent intent,4. String resolvedType,int flags) 5. .7.6. syn chro ni zed(mPackages) 7. String pkgName = inten t.getPackage();8. if (pkgName = null
46、 ) 9. retur n (ListvResolve In fo)mActivities.query Inten t(i ntent,10. resolvedType, flags);11. 14.12. 13. 17.14. .15. 20.2122. 回忆前面一篇文章 Android应用程序安装过程源代码分析,系统在前面的Step 8中启动PackageManagerService 时,会把系统中的应用程序都解析一遍,然后把解析得到的Activity都保存在mActivities 变量中,这里通过这个mActivities 变量的queryintent函数返回符合条件 intent的Ac
47、tivity,这里要返回的便是 Action类型为lntent.ACTION_MAIN ,并且Category类型为 lntent.CATEGORY_LAUNCHER 的 Activity 了。回到 Step 18 中的 LoaderTask.loadAIIAppsByBatch函数中,从 querylntentActivities 函数调用处返回所要求的Activity后,便调用函数tryGetCallbacks(oldCallbacks) 得到一个返CallBack接口,这个接口 是由Launcher类实现的,接着调用这个接口的.bindAllApplications函数来进一步操作。注意
48、,这里又是通过消息来处理加载应用程序的操作的。Step 20. Launcher.bindAllApplications这个函数定义在 packages/apps/Launcher2/src/com/android/launcher2/Launcher.java文件中:view plain1. public final class Laun cher exte nds Activity2. impleme nts View.O nClickListe ner, OnLon gClickListe ner, Lau ncherModel.Callbacks, AllAppsView.Watcher 3. .4.4. private AllAppsView mAIIAppsGrid;6.5. .8.6. public void bin dAllApplicati on s(ArrayList apps) 7. mAIIAppsGrid.setApps(apps);8. 12.1314. 这里的mAIIAppsGrid 是一个AllAppsView类型的变量,它的实际类型一般就是AIIApps2D 了。Step 21. AIIApps2D.setApps这个函数定义在 packages/apps/Launcher2/src/com/an
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 根治性肾输尿管全长切除术后护理查房
- 家庭教育辅导与儿童心理成长指南
- 多场景活动策划流程及实施指导书
- 优化医疗安全保障患者利益承诺书7篇范文
- 广东省潮州市湘桥区2026届初三下学期第三次监测英语试题含解析
- 天津市河东区天铁一中学2026届初三下学期第五次过关考试物理试题含解析
- 贵州遵义市正安县重点中学2026年初三(下)入学语文试题试卷(9月份)含解析
- 随州市重点中学2025-2026学年初三下期末质量调研(一模)物理试题含解析
- 系统故障处理进展回复函4篇范本
- 会员优惠活动规则说明7篇范文
- 除颤仪使用课件
- 2026年采购经理岗位面试指南与经典问题集
- 中国低空经济与管理 课件全套 第1-15章 低空与低空经济-低空经济发展思考
- 采购风险防范措施报告
- CFG桩截桩施工技术交底
- 2025年《检验检测机构资质认定》知识考试题库及答案解析
- 海上设施直升机甲板摩擦系数测试细则
- 江苏中烟工业有限责任公司考试真题2025
- 输尿管支架植入术课件
- 2025安徽芜湖皖南医学院第一附属医院(皖南医学院弋矶山医院)补充招聘工作人员5人笔试备考试题及答案解析
- 2025年客运车辆驾驶员(技师)职业技能鉴定考试题库(含答案)
评论
0/150
提交评论