Android系统默认Home应用程序(Launcher)的启动过程源代码分析_第1页
Android系统默认Home应用程序(Launcher)的启动过程源代码分析_第2页
Android系统默认Home应用程序(Launcher)的启动过程源代码分析_第3页
Android系统默认Home应用程序(Launcher)的启动过程源代码分析_第4页
Android系统默认Home应用程序(Launcher)的启动过程源代码分析_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论