main函数是Java程序的入口函数,在Java程序中main函数显而易见。Android基于java语言开发,可是在开发过程中不曾遇见main,main函数肯定是有的,但到底在哪儿,本章带你寻找Android的main函数。
查找
以android-31为例进行查找。
总而言之,main位于ActivityThread中。
main
public static void main(String[] args) {
// 系统跟踪
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
// 安装可选择的系统拦截
AndroidOs.install();
// 关闭记录资源泄露的工具
CloseGuard.setEnabled(false);
// 当前用户环境初始化(包括记录用户id,媒体文件,缓存文件,数据文件等文件的创建)
Environment.initForCurrentUser();
// CA认证
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
// 进程主模块初始化(包括电话框架,状态框架,媒体框架的初始化)
initializeMainlineModules();
// 设置进程名称
Process.setArgV0("<pre-initialized>");
// 准备主线程
Looper.prepareMainLooper();
// 解析参数
long startSeq = 0;
if (args != null) {
for (int i = args.length - 1; i >= 0; --i) {
if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
startSeq = Long.parseLong(
args[i].substring(PROC_START_SEQ_IDENT.length()));
}
}
}
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
// 创建主线程
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// 结束线程跟踪
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
// 开启主线程
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
简单来讲,main函数中主要进行主线程的创建和启用,资源环境的初始化。