Android
系统包含netd
、servicemanager
、surfaceflinger
、zygote
、media
、installd
、bootanimation
等基本服务,具体作用请看下图。
Android 系统基本服务
二、虚拟机创建和第一个Java 程序引导
为了让APK
在不同的虚拟机都可以运行,Google
采取了适配器模式,在让虚拟机运行之前先执行 dexopt
,即将dex
文件优化成odex
文件,可以让虚拟机更加优化的执行。
在ART
虚拟机中,dexopt
将dex
文件优化成二进制格式的问题,从而可以让ART
虚拟机执行。dexopt
会调用dex2oat
进行优化,dex2oat
的任务是将原来的dex
文件进行预翻译,从而可以加快app
运行的时间,但是由于某些app
比较复杂,所以优化的时间就比较长。
优化是以dex
文件中的Method
方法为单位,dex2oat
在优化时候,会根据需求优化一定量的Method
,即不是所有的Method
都回翻译成oat
模式。
虚拟机创建和第一个Java 程序引导
三、Dalvik 虚拟机基本配置
在Android
系统中,Dalvik
虚拟机 和ART
、应用程序进程,以及运行系统的关键服务SystemServer
进程都是由 Zygote
进程创建孵化的。
1.Dalvik 虚拟机基本配置
Dalvik 虚拟机基本配置
四、Zygote 启动流程
1.Zygote 启动代码
Zygote
服务时通过 init.rc
进程启动的,Zygote
的 classname
为main
.
init.rc
文件配置代码如下:
... ...
on nonencrypted
class_start main
class_start late_start
on property:sys.init_log_level=*
loglevel ${sys.init_log_level}
... ...
详细可以参考 init.rc
启动分析。
Android init 启动流程
2.Zygote main 函数
app_main.cpp
是Zygote
进程的main
函数,frameworksbasecmdsapp_processapp_main.cpp
Zygote
是由 init.rc
脚本启动,在init
脚本中,我们可以看到会导入import /init.${ro.zygote}.rc
脚本
# Copyright (C) 2012 The Android Open Source Project
#
# IMPORTANT: Do not create world writable files or directories.
# This is a common source of Android security bugs.
#
import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /init.usb.configfs.rc
... ...
import /init.${ro.zygote}.rc
... ...
在 system/core/rootdir
目录下,会根据ro.zygote
属性值不同,启动不同的脚本,主要包含以下四个zygote
脚本。
- 1.init.zygote32.rc 支持32为系统
- 2.init.zygote32_64.rc
- 3.init.zygote64.rc
- 4.init.zygote64_32.rc
init.zygte.rc脚本
Zygote 启动流程
五、Zygote 启动分析
Zygote 启动分析
六、Zygote 创建system_server主要方法
Zygote 创建system_server主要方法
七、Zygote 创建System_server 分析
Zygote 创建System_server
八、Zygote 创建应用
Zygote 创建应用
九、Zygote 创建应用流程
Zygote 创建应用流程
十、Zygote 预加载资源
Zygote 预加载资源
preloadClasses()
preloadResources()
十一、Zygote 预加载的目的
Zygote 预加载的目的
十二、优化Zygote 启动方法: 线程池
1.Zygote 启动优化
- 1:加载类和资源是可重入操作,所以在并行模式下,不存在互斥的场景
- 2:
Android
提供了Executors
和ExecutorService
多线程类,因此可以使用多线程来加载类和资源。 - 3:硬件平台最好是多核,否则加速也不明显;
线程池 优化Zygote 启动
2.Zygote 启动优化实质
使我们的进程最大限度的抢占CPU
十三、fork SystemServer
经过一系列初始化后,在ZygoteInit
类中 forkSystemServer
,为启动SystemServer
做准备。ZygoteInit.java
代码路径如下:alpsframeworksbasecorejavacomandroidinternalosZygoteInit.java
/**
* Prepare the arguments and forks for the system server process.
*
* Returns an {@code Runnable} that provides an entrypoint into system_server code in the
* child process, and {@code null} in the parent.
*/
private static Runnable forkSystemServer(String abiList, String socketName,
ZygoteServer zygoteServer) {
long capabilities = posixCapabilitiesAsBits(
OsConstants.CAP_IPC_LOCK,
OsConstants.CAP_KILL,
OsConstants.CAP_NET_ADMIN,
OsConstants.CAP_NET_BIND_SERVICE,
OsConstants.CAP_NET_BROADCAST,
OsConstants.CAP_NET_RAW,
OsConstants.CAP_SYS_MODULE,
OsConstants.CAP_SYS_NICE,
OsConstants.CAP_SYS_PTRACE,
OsConstants.CAP_SYS_TIME,
OsConstants.CAP_SYS_TTY_CONFIG,
OsConstants.CAP_WAKE_ALARM,
OsConstants.CAP_BLOCK_SUSPEND
);
/* Containers run without some capabilities, so drop any caps that are not available. */
StructCapUserHeader header = new StructCapUserHeader(
OsConstants._LINUX_CAPABILITY_VERSION_3, 0);
StructCapUserData[] data;
try {
data = Os.capget(header);
} catch (ErrnoException ex) {
throw new RuntimeException("Failed to capget()", ex);
}
capabilities &= ((long) data[0].effective) | (((long) data[1].effective) << 32);
/* Hardcoded command line to start the system server */
String args[] = {
"--setuid=1000",
"--setgid=1000",
/// M: [Wi-Fi Hotspot Manager] system_server add dhcp (1014) group to access
/// "/data/misc/dhcp/dnsmasq.leases"
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1014,1018,1021,1023," +
"1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
"--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
"com.android.server.SystemServer",
};
ZygoteConnection.Arguments parsedArgs = null;
int pid;
try {
parsedArgs = new ZygoteConnection.Arguments(args);
ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
boolean profileSystemServer = SystemProperties.getBoolean(
"dalvik.vm.profilesystemserver", false);
if (profileSystemServer) {
parsedArgs.runtimeFlags |= Zygote.PROFILE_SYSTEM_SERVER;
}
/* Request to fork the system server process */
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids,
parsedArgs.runtimeFlags,
null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
} 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;
}
参考文献:
【腾讯文档】Android Framework 知识库
https://docs.qq.com/doc/DSXBmSG9VbEROUXF5
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/14894,转载请注明出处。
评论0