ActivityThread源码分析
分类:Android, Java
阅读 (1,908)
Add comments
2月 222019
本文基于Android4.4版本源码进行分析。
一直以为ActivityThread是一个继承自Thread类的子线程,今天初看这个类发现里面的业务逻辑这么多,看了看网上的其他文章,原来这个Thread指的是Android应用的主线程啊。
问:安卓应用的入口函数是哪个? 答: 正确的答案是ActivityThraed的main函数。 |
Android应用入口,ActivityThread.main
下面咱们就看看ActivityThread.main函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public static void main(String[] args) { SamplingProfilerIntegration.start(); // CloseGuard defaults to true and can be quite spammy. We // disable it here, but selectively enable it later (via // StrictMode) on debug builds, but using DropBox, not logs. CloseGuard.setEnabled(false); Environment.initForCurrentUser(); // Set the reporter for event logging in libcore EventLogger.setReporter(new EventLoggingReporter()); Security.addProvider(new AndroidKeyStoreProvider()); Process.setArgV0("<pre-initialized>"); Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false); if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } AsyncTask.init(); if (false) { Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); } Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); } |
♦ | 首先,第一步启动SamplingProfilerIntegration,这个封装类集成了Dalvik的性能分析工具,用于监测记录应用的性能参数?待进一步查看代码 |
相关源码:./frameworks/base/core/java/com/android/internal/os/SamplingProfilerIntegration.java ./frameworks/base/services/java/com/android/server/SamplingProfilerService.java ./libcore/dalvik/src/main/java/dalvik/system/profiler/SamplingProfiler.java |
|
♦ | 紧接着CloseGuard.setEnabled(false); |
CloseGuard类实现了一种机制用于检查是否有内存泄露,默认是关闭,可以通过setEnabled(true)开启。 | |
源码路径:libcore/dalvik/src/main/java/dalvik/system/CloseGuard.java | |
♦ | Environment.initForCurrentUser();初始化Environment类,主要是一些目录的设置,比如我们通常用的获取外部存储路径函数Environment.getExternalStorageDirectory()的返回值就是在这里进行初始化的。 |
源码路径:libcore/luni/src/main/java/libcore/io/EventLogger.java | |
♦ | EventLogger.setReporter(new EventLoggingReporter()); |
没看懂怎么用的 | |
相关源码:libcore/luni/src/main/java/libcore/io/EventLogger.java | |
♦ | Security.addProvider(new AndroidKeyStoreProvider()); |
为应用添加安全检测管理器,使用AndroidKeyStoreProvider,keystore就是指打release包时的数字证书吧 | |
相关源码:frameworks/base/keystore/java/android/security/AndroidKeyStoreProvider.java |
|
♦ | Process.setArgV0(“<pre-initialized>”); |
因为应用还未启动完成,先给进程设置一个名字为<pre-initialized> | |
相关源码:frameworks/base/core/java/android/os/Process.java | |
♦ | Looper.prepareMainLooper(); |
将当前线程初始化为一个Looper,用Looper来管理线程内的各种请求。并将该Looper做为程序的主Looper。 | |
相关源码:frameworks/base/core/java/android/os/Looper.java | |
♦ | ActivityThread thread = new ActivityThread(); thread.attach(false); |
♦ | AsyncTask.init(); |
初始化AsyncTask,这是一个静态函数,由此可见AsyncTask的串行执行。 | |
♦ | if (false) { Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, “ActivityThread”)); } |
♦ | Looper.loop(); |
开始循环主线程里的MessageQueue |