Android 系统线程与应用线程的概念与管理

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());
}

《Android 系统线程与应用线程的概念与管理》 SystemServer

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();
        ...
    }

《Android 系统线程与应用线程的概念与管理》 普通应用

结论:
1.系统服务是跑在SystemServer进程主线程,但处理消息的looper使用的是不一定是SystemServer主线程的looper,这是因为SystemServer主线程如果有过多的消息要处理的话,会造成系统的卡顿。
2.每个应用app的主线程是跑在应用的进程中,默认包含一个消息处理的looper,专门用于处理界面的更新等实时性要求较高的消息。

    原文作者:九九叔
    原文地址: https://www.jianshu.com/p/cb081e7672cc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞