* Passes the main function two arguments, the class name and the specified
* options string.
*/
void AndroidRuntime::start(const char* className, const Vector& options, bool zygote)
{
…
JniInvocation jni_invocation;
jni_invocation.Init(NULL);
JNIEnv* env;
//注释1:启动虚拟机
if (startVm(&mJavaVM, &env, zygote, primary_zygote) != 0) {
return;
}
onVmCreated(env);
//注释2:注册安卓功能(JNI)
if (startReg(env) < 0) {
ALOGE(“Unable to register all android natives\n”);
return;
}
…
strArray = env->NewObjectArray(options.size() + 1, stringClass, NULL);
…
/*
* 启动虚拟机。 该线程成为VM的主线程,直到VM退出才会返回。
*/
char* slashClassName = toSlashClassName(className != NULL ? className : “”);
jclass startClass = env->FindClass(slashClassName);
if (startClass == NULL) {
…
} else {
…
jmethodID startMeth = env->GetStaticMethodID(startClass, “main”,
“([Ljava/lang/String;)V”);
if (startMeth == NULL) {
…
} else {
//注释3
env->CallStaticVoidMethod(startClass, startMeth, strArray);
#if 0
if (env->ExceptionCheck())
threadExitUncaughtException(env);
#endif
}
}
…
}
注释1:启动VM(虚拟机)
注释2:注册安卓功能(JNI)
注释3:便用JNI调用 Zygotelnit 的 main() 方法。这里的 Zygotelnit 是class文件,也就是说从这里开始就进入java领域喽。
JNI:连接 native(C/C++) 层 和 java 层的桥梁。
1.3 ZygoteInit.java
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
/**
* zygote 进程的启动类。
*/
public class ZygoteInit {
…
}
这是 Zygote 进程的入口点。 它创建 Zygote 服务,加载资源,并处理与准备分叉到应用程序的过程相关的其他任务。
1.3.1 main()
@UnsupportedAppUsage
public static void main(String[] argv) {
ZygoteServer zygoteServer = null;
try {
…
boolean startSystemServer = false;
//argv:用于指定 Zygote 配置的命令行参数。
…
if (!enableLazyPreload) {
//注释1:预加载资源。
preload(bootTimingsTraceLog);
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
bootTimingsTraceLog.traceEnd(); // ZygotePreload
}
…
//注释2:创建Zygote 的 LocalServerSocket 。
zygoteServer = new ZygoteServer(isPrimaryZygote);
if (startSystemServer) {
//注释3:开始fork我们的SystemServer进程。
Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
…
}
…
// 注释4:zygote 永久循环。
caller = zygoteServer.runSelectLoop(abiList);
} catch (Throwable ex) {
…
} finally {
if (zygoteServer != null) {
zygoteServer.closeServerSocket();
}
}
…
}
注释1:预加载资源。
注释2:创建Zygote 的 LocalServerSocket 。
注释3:开始fork我们的SystemServer进程。
注释4:zygote 永久循环。
这里咱们看看 forkSystemServer() ;
1.3.2 forkSystemServer()
/**
* Prepare the arguments and forks for the system server process.
* @return A {@code Runnable} that provides an entrypoint into system_server code in the child
* process; {@code null} in the parent.
*/
private static Runnable forkSystemServer(String abiList, String socketName,
ZygoteServer zygoteServer) {
…
//命令行来启动SystemServer
//ZygoteInit.main(String argv[])里面的argv 跟这个类似
String[] args = {
“–setuid=1000”,
“–setgid=1000”,
“–setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,”
+ “1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011”,
“–capabilities=” + capabilities + “,” + capabilities,
“–nice-name=system_server”,
“–runtime-args”,
“–target-sdk-version=” + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
“com.android.server.SystemServer”,
};
//处理与 zygote spawner 相关的 args 的参数解析。
ZygoteArguments parsedArgs;
int pid;
try {
ZygoteCommandBuffer commandBuffer = new ZygoteCommandBuffer(args);
try {
parsedArgs = ZygoteArguments.getInstance(commandBuffer);
} catch (EOFException e) {
throw new AssertionError(“Unexpected argument error for forking system server”, e);
}
commandBuffer.close();
…
//请求 fork 系统服务器进程
/* Request to fork the system server process */
pid = Zygote.forkSystemServer(
parsedArgs.mUid, parsedArgs.mGid,
parsedArgs.mGids,
parsedArgs.mRuntimeFlags,
null,
parsedArgs.mPermittedCapabilities,
parsedArgs.mEffectiveCapabilities);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
}
/* For child process */
if (pid == 0) {
if (hasSecondZygote(abiList)) {
waitForSecondaryZygote(socketName);
}
zygoteServer.closeServerSocket();
return handleSystemServerProcess(parsedArgs);
}
return null;
}
这里启动了一个 system server 。下面咱们就看看他。

2、SystemServer
==============
system server 也就是 SystemServer。SystemServer也是一个进程,包括ActivityTaskManagerService、ActivityManagerService、PackageManagerService、WindowManagerService等92种服务。
Android Framework里面两大非常重要的进程:
-
SystemServer进程。
-
Zygote进程。
2.1 SystemServer.java
frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {
…
}
2.1.1 main()
/**
* The main entry point from zygote.
*/
public static void main(String[] args) {
new SystemServer().run();
}
public SystemServer() {
// Check for factory test mode.
mFactoryTestMode = FactoryTest.getMode();
…
}
下面 咱们看看 run () 里面都用什么?
2.1.2 run()
private void run() {
try {
…
// 注释1:加载动态库libandroid_service.so。
System.loadLibrary(“android_servers”);
// 注释2:创建系统上下文。
createSystemContext();
// 调用每个进程的主线模块初始化。
ActivityThread.initializeMainlineModules();
// 注释3:创建 SystemServiceManager。
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// 为可并行化的 init 任务准备线程池
SystemServerInitThreadPool.start();
…
} finally {
}
// 注释4:Start services。
try {
//下面咱们看看这个三个方法启动什么服务
startBootstrapServices(t);
startCoreServices(t);
startOtherServices(t);
} catch (Throwable ex) {
…
} finally {
t.traceEnd(); // StartServices
}
…
// 注释5:Loop 永久循环。
Looper.loop();
throw new RuntimeException(“Main thread loop unexpectedly exited”);
}
注释1:加载动态库libandroid_service.so。
注释2:创建系统上下文。
注释3:创建 SystemServiceManager。
注释4:启动服务(startBootstrapServices、startCoreServices、startOtherServices)
注释5:Loop 永久循环。
2.1.3 createSystemContext()
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
初始化系统上下文对象mSystemContext,并设置默认的主题,mSystemContext实际上是一个Context(ContextImpl)对象。
调用ActivityThread.systemMain()的时候,会调用ActivityThread.attach(true),而在attach()里面,则创建了Application对象,并调用了Application.onCreate()。
2.1.4 startBootstrapServices()
/**
* 启动系统引导服务,因为这些服务之间有复杂的相互依赖关系,所以都放在了这个方法里面。
*/
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
…
final String TAG_SYSTEM_CONFIG = “ReadingSystemConfig”;
SystemServerInitThreadPool.submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG);
// PlatformCompat Service 由 ActivityManagerService, PackageManagerService 和 其他服务做使用
PlatformCompat platformCompat = new PlatformCompat(mSystemContext);
ServiceManager.addService(Context.PLATFORM_COMPAT_SERVICE, platformCompat);
ServiceManager.addService(Context.PLATFORM_COMPAT_NATIVE_SERVICE,
new PlatformCompatNative(platformCompat));
AppCompatCallbacks.install(new long[0]);
mSystemServiceManager.startService(FileIntegrityService.class);
Installer installer = mSystemServiceManager.startService(Installer.class);
mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);
startMemtrackProxyService();
// StartActivityManager
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
//初始化 ActivityManagerService
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
mWindowManagerGlobalLock = atm.getGlobalLock();
mDataLoaderManagerService = mSystemServiceManager.startService(
DataLoaderManagerService.class);
mIncrementalServiceHandle = startIncrementalService();
t.traceEnd();
//初始化PowerManagerService(电源服务),需要提前启动,因为其他服务需要它。
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
mSystemServiceManager.startService(ThermalManagerService.class);
// 电源管理已经开启,ActivityManagerService负责电源管理功能
mActivityManagerService.initPowerManagement();
mSystemServiceManager.startService(RecoverySystemService.Lifecycle.class);
…
mSystemServiceManager.startService(LightsService.class);
// Package manager isn’t started yet; need to use SysProp not hardware feature
if (SystemProperties.getBoolean(“config.enable_sidekick_graphics”, false)) {
mSystemServiceManager.startService(WEAR_SIDEKICK_SERVICE_CLASS);
}
// 初始化DisplayManagerService(显示管理器)
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
// Start the package manager.
try {
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
} finally {
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。







既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)

最后
一线互联网Android面试题含详解(初级到高级专题)
这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。
最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;
[外链图片转存中…(img-74xyuz1a-1711729558826)]
[外链图片转存中…(img-sQwcSmTA-1711729558827)]
[外链图片转存中…(img-aj0qTWPT-1711729558827)]
[外链图片转存中…(img-a2CvbQph-1711729558827)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-lwbcn3pH-1711729558828)]
最后
一线互联网Android面试题含详解(初级到高级专题)
这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率
[外链图片转存中…(img-XoK8afCx-1711729558828)]
如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。
最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;

被折叠的 条评论
为什么被折叠?



