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
public final class ActivityManagerService extends ActivityManagerNative
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
......
public static final Context main(int factoryTest) {
AThread thr = new AThread()
thr.start()
synchronized (thr) {
while (thr.mService == null) {
try {
thr.wait()
} catch (InterruptedException e) {
}
}
}
ActivityManagerService m = thr.mService
mSelf = m
ActivityThread at = ActivityThread.systemMain()
mSystemThread = at
Context context = at.getSystemContext()
m.mContext = context
m.mFactoryTest = factoryTest
m.mMainStack = new ActivityStack(m, context, true)
m.mBatteryStatsService.publish(context)
m.mUsageStatsService.publish(context)
synchronized (thr) {
thr.mReady = true
thr.notifyAll()
}
m.startRunning(null, null, null, null)
return context
}
......
}
这个函数首先通过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中的应用程序信息取出来,然后以快捷图标的形式展示在桌面上,后面我们将会看到这个过程。
首先是添加应用 (如果该应用已存在,则要先删除):编译好你的Andorid应用程序,然后你需要用adb工具将.apk文件加载到模拟器的/data/app/目录下,用法如下面介绍。
启动模拟器(命令行下运行sdk目录下的/tools/emulator.exe);
模拟器切换到主画面(最好不要在程序运行的时候向模拟器安装程序,可以按home键离开应用程序);
运行adb,安装myproject/bin./<appname.apk文件。如,安装Hello Android 示例,命令行模式下,切换到SDK目录下的/tools/子目录下,输入adb install myproject/bin/HelloAndroid.apk ;
在模拟器中,打开可执行程序列表,卷动屏幕,就可以看到被添加的应用。
注意:当你第一次安装一个Activity时,你可能需要在启动项显示之前,或者其它程序调用它之前重新启动模拟器。因为软件包管理工具通常只有在模拟器启动时才能完全的审查manifests。
其次是删除应用(命令行模式,非Windows窗口模式):
启动模拟器(命令行下运行sdk目录下的/tools/emulator.exe);
模拟器切换到主画面(最好不要在程序运行的时候向模拟器安装程序,可以按home键离开应用程序);
输入运行adb shell 命令 (进入模拟器的命令模式下) ;
输入命令 cd /data/app (进入/data/app目录);
输入命令 ls (这个命令可以查看/data/app下有那些应用和子目录,从中找出你要删除的应用名称);
输入命令 rm xxx (xxx是你的应用名称,比如 com.simon.android.helloandroid);
在模拟器中,打开可执行程序列表,发现应用已被删除。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)