android是个多线程的系统,线程有系统的,应用的,他们具体有那些呢?下面梳理一下android系统一些重要的线程,包括SystemServer,系统服务和普通应用三者的线程。
本文按照系统的启动流程分析:
1.SystemServer
源码路径:/frameworks/base/services/java/com/android/server/SystemServer.java
进入main函数,相当于平时java函数的main入口
public static void main(String[] args) {
new SystemServer().run();
}
进入run()函数,准备好主线程的消息loop,所以SystemServer的主线程就可以进行消息处理了
private void run() {
// Prepare the main looper thread (this thread).
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);//设置线程优先级
android.os.Process.setCanSelfBackground(false);
Looper.prepareMainLooper(); //准备主线程的looper
// Loop forever.
Looper.loop(); //开始消息循环
throw new RuntimeException("Main thread loop unexpectedly exited");
}
2.系统服务
系统服务的启动是在SystemServer中的,那么系统服务是跑在SystemServer进程的主线程还是子线程呢?
答案是跑在SystemServer的主线程。下面以账号服务AccountManagerService为例子说明。
(1)传入系统的context构建了系统服务AccountManagerService
private void startOtherServices() {
...
final Context context = mSystemContext;
accountManager = new AccountManagerService(context);
....
}
(2)AccountManagerService的构造函数,使用FgThread的looper来构建服务的消息处理handler。所以这个系统服务其实是跑在SystemServer的主线程,而处理消息则在子线程FgThread
public AccountManagerService(Context context, PackageManager packageManager,
IAccountAuthenticatorCache authenticatorCache) {
mContext = context;
mMessageHandler = new MessageHandler(FgThread.get().getLooper());
}
3.普通应用
应用就是手机的app,应用ui界面更新就是在主线程,所以应用的主线程也称为UI线程,主线程的创建是在ActivityThread中,在main函数中准备好主线程消息处理的looper
源码路径:/ frameworks/ base/ core/ java/ android/ app/ ActivityThread.java
public static void main(String[] args) {
...
Looper.prepareMainLooper();
Looper.loop();
...
}
结论:
1.系统服务是跑在SystemServer进程主线程,但处理消息的looper使用的是不一定是SystemServer主线程的looper,这是因为SystemServer主线程如果有过多的消息要处理的话,会造成系统的卡顿。
2.每个应用app的主线程是跑在应用的进程中,默认包含一个消息处理的looper,专门用于处理界面的更新等实时性要求较高的消息。