基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManagerService系统服务的添加
2013-06-24 21:19
519 查看
从启动说起
Android系统加载时,首先启动init进程,该进程会启动Zygote进程。Zygote进程执行/system/bin/app_process程序。app_process程序在执行中,通过AppRuntime::start()函数来创建虚拟机实例,并注册JNI方法。
看一下AppRuntime::start()函数的说明:
这就是说,这个函数做两件事情:首先虚拟机,其次执行className参数提供的Java类的main()方法。
这里传入className是"com.android.internal.os.ZygoteInit",那么看一下它的main()方法:
看一下startSystemServer()方法的实现:
在这里,Zygote进程fork出SystemServer进程,随后再handleSystemServerProcess()方法中对它做初始处理,包括关闭克隆Zygote进程所带来的socket。
接下来,调用RuntimeInit.zygoteInit()方法完成其它的初始化工作。其中,将会调用SystemServer.main()方法进入SystemServer本身的初始化。main()方法经过一系列的步骤之后,调用本地方法init1()来启动SurfaceFlinger和SensorService这样的关键服务。之后init1()从本地回调Java层的SystemServer.init2()方法来启动Java层的各项服务:
SystemThread是一个线程子类,在这个线程的执行中,将建立一个消息循环,接着启动系统的各个服务,并注册到ServiceManager中。
终于可以进入主题了。在这里,就包括AccountManagerService的创建与注册:
接下来学习AccountManagerService相关的接口与实现。
Android系统加载时,首先启动init进程,该进程会启动Zygote进程。Zygote进程执行/system/bin/app_process程序。app_process程序在执行中,通过AppRuntime::start()函数来创建虚拟机实例,并注册JNI方法。
int main(int argc, const char* const argv[]) { ... if (zygote) { runtime.start("com.android.internal.os.ZygoteInit", startSystemServer ? "start-system-server" : ""); } ... }
看一下AppRuntime::start()函数的说明:
/* * Start the Android runtime. This involves starting the virtual machine * and calling the "static void main(String[] args)" method in the class * named by "className". * * Passes the main function two arguments, the class name and the specified * options string. */ void AndroidRuntime::start(const char* className, const char* options) { ... }
这就是说,这个函数做两件事情:首先虚拟机,其次执行className参数提供的Java类的main()方法。
这里传入className是"com.android.internal.os.ZygoteInit",那么看一下它的main()方法:
public static void main(String argv[]) { ... try { if (argv[1].equals("start-system-server")) { startSystemServer(); ... }
看一下startSystemServer()方法的实现:
private static boolean startSystemServer() throws MethodAndArgsCaller, RuntimeException { … int pid; try { … /* Request to fork the system server process */ pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); } catch (IllegalArgumentException ex) { throw new RuntimeException(ex); } /* For child process */ if (pid == 0) { handleSystemServerProcess(parsedArgs); } return true; }
在这里,Zygote进程fork出SystemServer进程,随后再handleSystemServerProcess()方法中对它做初始处理,包括关闭克隆Zygote进程所带来的socket。
接下来,调用RuntimeInit.zygoteInit()方法完成其它的初始化工作。其中,将会调用SystemServer.main()方法进入SystemServer本身的初始化。main()方法经过一系列的步骤之后,调用本地方法init1()来启动SurfaceFlinger和SensorService这样的关键服务。之后init1()从本地回调Java层的SystemServer.init2()方法来启动Java层的各项服务:
public static final void init2() { Slog.i(TAG, "Entered the Android system server!"); Thread thr = new ServerThread(); thr.setName("android.server.ServerThread"); thr.start(); }
SystemThread是一个线程子类,在这个线程的执行中,将建立一个消息循环,接着启动系统的各个服务,并注册到ServiceManager中。
终于可以进入主题了。在这里,就包括AccountManagerService的创建与注册:
class ServerThread extends Thread { private static final String TAG = "SystemServer"; … @Override public void run() { ... Looper.prepare(); ... AccountManagerService accountManager = null; ... // Critical services... try { ... // The AccountManager must come before the ContentService try { Slog.i(TAG, "Account Manager"); accountManager = new AccountManagerService(context); ServiceManager.addService(Context.ACCOUNT_SERVICE, accountManager); } catch (Throwable e) { Slog.e(TAG, "Failure starting Account Manager", e); } ... } ... }
接下来学习AccountManagerService相关的接口与实现。
相关文章推荐
- 基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManagerService系统服务的添加
- 基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManager的初始化
- 基于Andoird 4.2.2的Account Manager源代码分析学习:创建选定类型的系统帐号
- 基于Andoird 4.2.2的Account Manager源代码分析学习:创建选定类型的系统帐号
- 基于N源码的AccountManagerService简单认识和账户添加流程分析
- 基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManager的简要工作流程
- 添加nginx为系统服务(service nginx start/stop/restart)
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- Android系统在新进程中启动自定义服务过程(startService)的原理分析 (下)
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- 基于MT7688模块的开发笔记7——给Ubuntu系统添加samba服务
- 基于visual c++之windows核心编程代码分析(45)利用Windows系统服务启动程序
- [Android 系统源代码研究] ActivityManagerService情景分析
- Android 系统服务管家servicemanager启动过程详解
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- 人人网数据服务平台:基于日志分析的数据系统架构-严岩
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- 基于stm32f103zet6的FAT16文件系统学习3(初步分析ff9a)
- 添加nginx为系统服务(service nginx start/stop/restart)