Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx
《Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx》由会员分享,可在线阅读,更多相关《Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
final
class
ActivityManagerService
extends
ActivityManagerNative
2.
implements
Watchdog.Monitor,
BatteryStatsImpl.BatteryCallback
{
3.
......
4.
5.
public
static
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.
m
thr.mService;
19.
mSelf
m;
20.
ActivityThread
at
ActivityThread.systemMain();
21.
mSystemThread
at;
22.
context
at.getSystemContext();
23.
m.mContext
context;
24.
m.mFactoryTest
factoryTest;
25.
m.mMainStack
ActivityStack(m,
context,
true);
26.
27.
m.mBatteryStatsService.publish(context);
28.
m.mUsageStatsService.publish(context);
29.
30.
31.
thr.mReady
true;
32.
thr.notifyAll();
33.
34.
35.
m.startRunning(null,
null,
null);
36.
37.
return
38.
39.
40.
41.}
这个函数首先通过AThread线程对象来内部创建了一个ActivityManagerService实例,然后将这个实例保存其成员变量mService中,接着又把这个ActivityManagerService实例保存在ActivityManagerService类的静态成员变量mSelf中,最后初始化其它成员变量,就结束了。
Step8.
PackageManagerService.main
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step7。
执行完这一步之后,系统中的应用程序的所有信息都保存在PackageManagerService中了,后面Home应用程序Launcher启动起来后,就会把PackageManagerService中的应用程序信息取出来,然后以快捷图标的形式展示在桌面上,后面我们将会看到这个过程。
Step9.
ActivityManagerService.setSystemProcess
void
setSystemProcess()
mSelf;
ServiceManager.addService("
activity"
m);
meminfo"
MemBinder(m));
if
(MONITOR_CPU_USAGE)
cpuinfo"
CpuBinder(m));
permission"
PermissionController(m));
ApplicationInfo
info
mSelf.mContext.getPackageManager().getApplicationInfo(
"
android"
STOCK_PM_FLAGS);
mSystemThread.installSystemApplicationInfo(info);
(mSelf)
ProcessRecord
app
mSelf.newProcessRecordLocked(
mSystemThread.getApplicationThread(),
info,
info.processName);
app.persistent
app.pid
MY_PID;
app.maxAdj
SYSTEM_ADJ;
mSelf.mProcessNames.put(app.processName,
app.info.uid,
app);
(mSelf.mPidsSelfLocked)
mSelf.mPidsSelfLocked.put(app.pid,
mSelf.updateLruProcessLocked(app,
true,
(PackageManager.NameNotFoundException
throw
RuntimeException(
Unable
to
find
android
system
package"
e);
40.}
这个函数首先是将这个ActivityManagerService实例添加到ServiceManager中去托管,这样其它地方就可以通过ServiceManager.getService接口来访问这个全局唯一的ActivityManagerService实例了,接着又通过调用mSystemThread.installSystemApplicationInfo函数来把应用程序框架层下面的android包加载进来,这里的mSystemThread是一个ActivityThread类型的实例变量,它是在上面的Step7中创建的,后面就是一些其它的初始化工作了。
Step10.
ActivityManagerService.systemReady
这个函数是在上面的Step6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用的,它定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:
systemReady(final
Runnable
goingCallback)
(this)
mMainStack.resumeTopActivityLocked(null);
16.}
这个函数的内容比较多,这里省去无关的部分,主要关心启动Home应用程序的逻辑,这里就是通过mMainStack.resumeTopActivityLocked函数来启动Home应用程序的了,这里的mMainStack是一个ActivityStack类型的实例变量。
Step11.ActivityStack.resumeTopActivityLocked
这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:
ActivityStack
boolean
resumeTopActivityLocked(ActivityRecord
prev)
//
Find
the
first
activity
that
is
not
finishing.
ActivityRecord
next
topRunningActivityLocked(null);
(next
There
are
no
more
activities!
Let'
s
just
start
up
Launcher...
(mMainStack)
mService.startHomeActivityLocked();
22.}
这里调用函数topRunningActivityLocked返回的是当前系统Activity堆栈最顶端的Activity,由于此时还没有Activity被启动过,因此,返回值为null,即next变量的值为null,于是就调用mService.startHomeActivityLocked语句,这里的mService就是前面在Step7中创建的ActivityManagerService实例了。
Step12.
ActivityManagerService.startHomeActivityLocked
startHomeActivityLocked()
Intent
intent
Intent(
mTopAction,
mTopData
!
null
?
Uri.parse(mTopData)
:
intent.setComponent(mTopComponent);
(mFactoryTest
SystemServer.FACTORY_TEST_LOW_LEVEL)
intent.addCategory(Intent.CATEGORY_HOME);
ActivityInfo
aInfo
intent.resolveActivityInfo(mContext.getPackageManager(),
(aInfo
intent.setComponent(new
ComponentName(
aInfo.applicationInfo.packageName,
aInfo.name));
Don'
t
do
this
home
currently
being
instrumented.
getProcessRecordLocked(aInfo.processName,
aInfo.applicationInfo.uid);
(app
||
app.instrumentationClass
intent.setFlags(intent.getFlags()
|
Intent.FLAG_ACTIVITY_NEW_TASK);
mMainStack.startActivityLocked(null,
intent,
0,
aInfo,
false,
false);
36.}
函数首先创建一个CATEGORY_HOME类型的Intent,然后通过Intent.resolveActivityInfo函数向PackageManagerService查询Category类型为HOME的Activity,这里我们假设只有系统自带的Launcher应用程序注册了HOME类型的Activity(见packages/apps/Launcher2/AndroidManifest.xml文件):
1.<
manifest
xmlns:
android="
package="
com.android.launcher"
android:
sharedUserId=