Android启动流程
2019独角兽企业重金招聘Python工程师标准>>>
当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init.c)代码如下:
int main(int argc, char **argv)
{// 创建文件夹 挂载mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");mkdir("/dev/pts", 0755);// 打卡日志log_init();INFO("reading config file\n");// 加载init.rc配置文件init_parse_config_file("/init.rc");}
加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
从c++代码调到java代码:
int main(int argc, const char* const argv[])
{...// Android运行时环境AppRuntime runtime;...// Next arg is startup classname or "--zygote"if (i < argc) {arg = argv[i++];if (0 == strcmp("--zygote", arg)) {bool startSystemServer = (i < argc) ? strcmp(argv[i], "--start-system-server") == 0 : false;setArgv0(argv0, "zygote");set_process_name("zygote");// 启动java代码runtime.start("com.android.internal.os.ZygoteInit",...}
ZygoteInit.java 代码:
public static void main(String argv[]) { try { VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);
// 加载Android依赖的类preloadClasses();//cacheRegisterMaps();preloadResources();...if (argv[1].equals("true")) {// 启动系统服务startSystemServer();} else if (!argv[1].equals("false")) {...
}private static boolean startSystemServer()...args = new String[] {"--setuid=1000","--setgid=1000","--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003,3006","--capabilities=130104352,130104352","--rlimit=8,","--runtime-init","--nice-name=system_server","com.android.server.SystemServer",.../* Request to fork the system server process */// 母进程开始分叉服务 启动SystemServerpid = Zygote.forkSystemServer(parsedArgs.uid, parsedArgs.gid,parsedArgs.gids, debugFlags, rlimits,parsedArgs.permittedCapabilities,parsedArgs.effectiveCapabilities);..
}
SystemServer.java 代码
public static void main(String[] args) {... // 加载jni库System.loadLibrary("android_servers");// 调用native方法init1(args);
}
native public static void init1(String[] args);
SystemServer 对应的c++代码 comandroidserver_SystemServer.cpp 代码如下:
// 类似java的抽象方法
extern "C" int system_init();static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{ // 转调system_init();
}/** JNI registration.*/
static JNINativeMethod gMethods[] = {/* name, signature, funcPtr */ // 函数指针 把init1方法映射到android_server_SystemServer_init1{ "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
};
systeminit 的实现方法在Systeminit.cpp 代码如下:
extern "C" status_t system_init()
{...// 启动硬件的服务if (strcmp(propBuf, "1") == 0) {// Start the SurfaceFlingerSurfaceFlinger::instantiate();}AndroidRuntime* runtime = AndroidRuntime::getRuntime();LOGI("System server: starting Android services.\n");// 启动完硬件服务后,又回到Systemserver的init2方法runtime->callStatic("com/android/server/SystemServer", "init2");...
}
SystemServer 的init2方法代码:
public static final void init2() {Slog.i(TAG, "Entered the Android system server!");Thread thr = new ServerThread();thr.setName("android.server.ServerThread");thr.start();}
ServerThread的run方法:
public void run() { ... // 开启Android各种服务并且添加到ServiceManager去管理 Slog.i(TAG, "Device Policy"); devicePolicy = new DevicePolicyManagerService(context); ServiceManager.addService(Context.DEVICEPOLICYSERVICE, ottle =
...// We now tell the activity manager it is okay to run third party// code. It will call back into us once it has gotten to the state// where third party code can really run (but before it has actually// started launching the initial applications), for us to complete our// initialization.// 各种服务开启后调用ActivityManagerService.systemReady((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(new Runnable() {public void run() {Slog.i(TAG, "Making services ready");
ActivityMangerService的systemReady的方法:
public void systemReady(final Runnable goingCallback) {...// 打开第一个ActivitymMainStack.resumeTopActivityLocked(null);}}
ActivityStack的resumeTopActivityLocked方法
final boolean resumeTopActivityLocked(ActivityRecord prev) {// Find the first activity that is not finishing.// 没有已经打开的Activity next为 nullActivityRecord next = topRunningActivityLocked(null);// Remember how we'll process this pause/resume situation, and ensure// that the state is reset however we wind up proceeding.final boolean userLeaving = mUserLeaving;mUserLeaving = false;if (next == null) {// There are no more activities! Let's just start up the// Launcher...if (mMainStack) {// 启动lucher应用的锁屏界面return mService.startHomeActivityLocked();}}
Android系统启动完成,打开了Luncher应用的Home界面。
转载于:https://my.oschina.net/u/2550627/blog/610855
Android启动流程相关推荐
- android serialport new 软件退出_基于Android9.0,了解Android启动流程
先记住四个进程和三种方式. **四个进程** 1.Launcher进程 2.system_server进程 3.App进程 4.Zygote进程 **三种方式** 1.Binder方式 2.Socke ...
- andriod studio 启动service失败_惊呆了!女儿拿着小天才电话手表,问我Android启动流程!...
阅读本文大概需要15分钟 作者:巨人大哥出处:https://blog.csdn.net/CHAMPION8888/article/details/108490500 首先,new一个女儿, var ...
- 4412运行java_Tiny4412 Android 启动流程
Android系统的启动主要包括三个阶段: ①BootLoader启动 ②Linux Kernel启动 ③Android系统启动 前面我们大致分析了前面两个步骤,即u-boot和内核的启动流程(内核启 ...
- android 启动流程
Android系统启动流程 -- bootloader 摘要:本文讲解Android系统在启动过程中的关键动作,摈弃特定平台之间的差异,讨论共性的部分,至于启动更加详细的过程,需要结合代码分析, ...
- 惊呆了!女儿拿着小天才电话手表,问我Android启动流程!
首先,new一个女儿, var mDdaughter = new 女儿("6岁","漂亮可爱","健康乖巧","最喜欢玩小天才电话 ...
- android uboot启动过程,Android启动流程简析(一)
最近一时兴起,想对Android的启动流程进行一次分析,经过一番整理,从以下几个方面进行总结,代码部分只讨论思路,不论细节. Android架构介绍 Android启动概述 BootLoader介绍 ...
- Android启动流程:上电到启动第一个APP的详细流程,
1. 安卓启动大致如下图所示: 2. BootLoader (如果想了解跟详细关于bootloader请看:安卓bootloader) 从系统的角度上来讲,Android系统的启动过程可以分为 ...
- Android启动过程五个步骤,Android启动流程、app启动原理
从头分析整理学习底层知识. Android 众多基于Linux内核的系统类似, 启动系统时, bootloader启动内核和init进程. init进程分裂出更多名为"daemons(守护进 ...
- Android:启动流程
Android启动流程 第一步:启动电源以及系统启动 当电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行.加载引导程序到RAM,然后 执行 第二步:引导程序 引导程序是在Android ...
最新文章
- R语言data.table导入数据实战:把data.frame数据转化为data.table数据
- redis搭建与安装2
- FTP资源下检测URL地址下文件大小
- NIO和Reactor
- Tomcat中组件的生命周期管理(三)
- OpenShift DIY:使用Gradle构建Spring Boot / Undertow应用程序
- kubernetes(K8s):管理云平台中多个主机上的容器化的应用
- 陆奇下下选,YC上上签
- Acrobat Pro DC 教程,如何删除PDF中的隐私信息?
- Matlab使用mosek
- 霍夫曼树和霍夫曼编码原理
- sklearn.metrics confusion_matrix注意事项
- IBM李永辉:从人工智能到大数据的终点
- sqlmap介绍和用法
- NLP的强大工具——AllenNLP
- 中科院上海王二涛组招聘助理研究员1名-植物微生物组学
- 机器人可以比人类优秀,那未来会替代人类吗?
- 你的爱车真的洗干净了吗?留神这些被洗车店忽略的死角!
- 基于android2.3.5系统:开天辟地Android启动机制[二]
- dnsmasq.conf配置
热门文章
- 读书笔记1 : program paradigm
- 良好的JavaScript编码风格(语法规则)
- python基础之变量以及if语句
- C#设计模式(3)——工厂方法模式
- 第二次冲刺阶段每日任务10
- iText in Action 2nd5.4节(Adding page events to PdfWriter)读书笔记
- Java中通过ActionEvent判断是哪个按钮
- Luogu-P3205-HNOI2010-合唱队
- 003---属性查找和绑定方法
- 536. Construct Binary Tree from String 从括号字符串中构建二叉树