Android 启动过程简介

老司机避坑指南:UC3842自举驱动电路发热严重?这样选C39/C37电容值最稳 本文针对UC3842自举驱动电路发热严重的问题,深入剖析了驱动波形边沿速度与损耗的矛盾根源。通过实测数据与热成像分析,重点阐述了关键电容C39/C37的选型策略,提供了从经验公式到量化计算的优化方法,帮助工程师在发热与效率间找到最佳平衡点,并探讨了分立方案与专用驱动IC的适用场景。 阅读详情

        从某个方面来讲,我们可以将安卓看成是LINUX之上的一种XWINDOW。所以系统启动的过程难免要先从linux kernel开始讲起。当然linux kernel的启动不是我们这里需要讨论的问题。

       本人最近试图在framework层添加一个自己的service,之前研究了一下但还不是特别清楚。故以此理清思路。也希望能够给同样在研究这部分的朋友好的提示。由于Android系统非常的庞大。所以要清晰的明白这些东西,一定要好好的研究它的实现机制。

概述

        Android系统在启动时首先会启动Linux基础系统,然后引导加载Linux Kernel并启动初始化进程(Init)。接着启动Linux守护进程。在启动Linux守护进程的同时还需要启动Zygote进程。包括初始化一个Dalvik虚拟机实例。装载Socket请求所需的类和监听。创建虚拟机实例来管理应用程序的进程。

      在Zygote之后需要初始化runtime进程。在这个过程中主要进行服务管理器的初始化和注册。

详解

       第一步:initial进程(System\core\init)
       init进程,它是一个由内核启动的用户级进程。内核自行启动之后,就通过启动一个用户级程序init的方式完成引导进程。在第一个进程中会读取init.rc。在这个文件中会启动servicemanager,zygote……等基本的服务。
       在init.c@system/core/init。会调用parse_config_file(init.rc)解析脚本文件init.rc。(init.rc是Android init language。具体的描述在./readme.txt)此处具体如何让解析的还需要进行研究。

      Android在开机启动后,经过一系列的加载流程,将进入frameworks\base\cmds\app_process\app_main.cpp进而执行main()方法。

    188    if (zygote) {
    189         runtime.start("com.android.internal.os.ZygoteInit",
    190                 startSystemServer ? "start-system-server" : "");
    191     } else if (className) {
    192         // Remainder of args get passed to startup class main()
    193         runtime.mClassName = className;
    194         runtime.mArgC = argc - i;
    195         runtime.mArgV = argv + i;
    196         runtime.start("com.android.internal.os.RuntimeInit",
    197                 application ? "application" : "tool");
    198     } else {
    199         fprintf(stderr, "Error: no class name or --zygote supplied.\n");
    200         app_usage();
    201         LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
    202         return 10;
    203     }

        (在frameworks\base\core\jni文件夹下存在com_android_internel_os_ZygoteInit.cpp文件。在此文件中通过register_com_android_internel_os_ZygoteInit函数调用AndroidRuntime::registerNativeMethods函数。)

最终会调用到frameworks/base/core/jni/AndroidRuntime.cpp的start()方法。事实上,Android API与本地方法的注册关联就是在AndroidRuntime.cpp模块里完成的。

Android  framework层的API函数对应的本地方法映射和注册原理简析:

        Android启动之后,本地方法的注册关联是在调用AndroidRuntime::startReg过程中完成的。在AndroidRuntime的静态数组gRegJNI[]存储了各个framework子模块本地方法关联信息。数组gRegJNI[]的每一个元素存储了各个模块的注册相关的函数指针,这个函数指针的功能是把子模块中众多的本地函数关联添加进系统中。子模块中的众多本地函数也是通过子模块的静态数组被上述函数指针指向的函数作为参数来使用。注册的关联具体是通过在startReg中调用register_jni_process方法把静态数组gRegJNI[]数组存储的各个framework子模块本地方法关联信息注册到系统中。

        具体的注册JNI的步骤简介:(待续)

用户存续期价值评估CLV(二) BG/NBD Model python模拟 BG/NBD Model …继续 想象每一个客户有两个硬币,一个“Buy Coin"控制客户购买的概率;一个"Die Coin"控制客户流失、不再购买的概率。 前面假设了客户的交易次数服从泊松过程: 在一年中的每个月,客户都以抛硬币的方式来决定是否购买。我们所观察到的购买次数取决与泊松分布的参数 ????。 %matplotlib inline import numpy as np impor... 阅读详情

相关推荐

NeRF必读:Mip-NeRF总结与公式推导

由于远景近景的分辨率不同,导致经典NeRF对于多尺度场景的表达存在明显瑕疵:NeRF对于近景的重建比较模糊而对于远景的重建出现锯齿。简单粗暴的策略是supersampling,但是费时费力。相较于NeRF使用的位置编码(PE)方式,Mip-NeRF提出了积分位置编码的方式(IPE).这种编码方式可以多尺度地描述空间中的信息分布,make sense.

i_head_no_back的博客 6079

android 6.0 adb,[RK3288][Android6.0] 调试笔记 --- 通过adb安装APK时间很长问题

Platform: RockchipOS: Android 6.0Kernel: 3.10.92使用adb安装apk[kris@:~/Downloads]$ adb install souhushipin_6500.apk要耗时40s,log如下:01-21 17:39:26.210 2011 2011 D AndroidRuntime: >>>>>> ST...

weixin_42299140的博客 770

如何利用Arcgis进行地统计学分析(三):空间插值方法选择与优化

本文深入探讨了在Arcgis中进行地统计学分析时,如何根据探索性数据分析(EDA)结果科学选择与优化空间插值方法。文章对比了IDW、RBF、克里金等主流方法的适用场景与核心参数,并通过实战案例详解了从数据诊断到模型调优的完整流程,强调结合半变异函数与趋势分析进行“对症下药”,以提升插值结果的精度与可靠性。

weixin_29281915的博客 120

Android 重启

由于只是私下写的,并没有具体的log pattern或者代码,主要是思路1.重启类型:System Server Java CrashSystem Server Native CrashSWT(Watchdog)Surfacefinger died --可能他依赖的东西死掉,或者本身发生fd leak之类2.重启流程log//网上引用的log,可能具体项目有变化,思路一样,重启代码是在System...

wd229047557的博客 1118

微磁模拟实战指南:从OOMMF安装到首个3D模型运行

本文详细介绍了OOMMF微磁模拟软件的安装与使用,从环境配置到首个3D模型运行的完整教程。涵盖Windows、Linux和macOS平台的安装避坑指南,以及MIF文件编写、并行计算优化等实战技巧,帮助研究人员快速掌握这一开源工具在磁畴壁运动、磁滞回线等微磁学问题中的应用。

weixin_29294597的博客 153

cut&tag学习笔记

上图是我得到的结果,下图是教程的结果,比对结果有一些差异,我也不知道具体原因是啥。谷歌了一下,发现原因可能是因为环境变量的问题,系统不知道picard的具体位置,需要设置全局环境变量,遂查了一下picard的位置。我发现我做出来的结果测序深度一致,但是比对的结果有一点差异,不知道是我的操作问题,还是参考基因组更新了导致比对结果出现了些许不同。上图是我得到的结果,下图是教程的结果,除了IgG_rep1外比对结果一致。上图是我的结果,下图是教程的结果,结果不太一致,不知道是具体的原因是什么。

weixin_52073820的博客 2423

Android runtime机制(二)zygote进程的启动流程

在这一章里,我们将继续跟进zygote进程的启动过程。在zygote进程启动过程中,虚拟机的创建、jni functions注册及java层ZygoteInit是我们需要关注和理解的,这有助于我们开发更加高效的Android程序。

Gory的专栏 3263

WinDbg调试工具安装全攻略:从下载到配置的保姆级教程(Windows 10/11适用)

本文提供了一份详细的WinDbg调试工具安装与配置指南,适用于Windows 10/11用户。文章对比了WinDbg Preview独立版与SDK内置经典版的区别,并手把手指导从Microsoft Store或Windows SDK完成安装。核心部分重点讲解了如何配置符号文件路径与源代码路径,这是让WinDbg发挥强大调试功能的关键步骤,并针对常见安装问题提供了实用的排错方法。

hp777的博客 386

Android Studio NDK 定位出错代码位置

一、在Android开发中,我们经常遇到以下错误: AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<< 06-28 16:08:29.715 12954 12954 D AndroidRuntime: Calling main entry com.android.commands.wm.Wm 06-28 16:08:29.721 12

wq892373445的博客 1044

基于深度学习方法(7种)的高光谱与多光谱图像融合(附代码+3个数据集获取)

其他不懂的可以把代码发给AI哦,让它给你解读。

热爱分享,热爱记录 1298

zynq+LWIP 裸机双网口实现(MIO+EMIO)+程序下载

芯片型号: ZYNQ: XC7Z010clg400开发软件:Vivado2022 + Xilinx Vitis 2022网卡芯片:RTL8211FDI(需要根据网口芯片型号修改对应的硬件配置代码。

thinking in 小宇宙 3408

Android:安卓APP启动过程简介

你打开一个安卓系统 它的界面是Launcher 进程,它不断的检测用户的触摸落在哪个APP上面,如果你的触摸落在空白它不做处理,你要滑动他就给你滑动 当用户触摸这个app的时候, 他会进行下面的流程 Laucher 检测用户触摸到APP以后,整个软件,整个工程最应该被加载的文件是 AndroidManifest.xml 首先他会判断你的SDK版本,你的目标机器是否能承载的了安卓APP,有的时候承载不了,安装都安装不上,有的时候能装上不能运行 再来就是获取你要的...

m0_57089315的博客 1367

树莓派 5 AI 套件(Hailo)示例

该用户自定义类作为输入传递给回调函数,该函数在管道输出上运行。它用于主程序与回调函数之间的通信。它对 hailo_rpi_common::app_callback_class 进行了扩展,并可根据应用程序的具体情况定制附加变量和方法。

机器人控制与仿真应用 4115

简介Android启动过程

其实吧,大家都不是神,不可能一出生就知道一个事情,都是后天学习的结果。 对于Android启动过程,网上讲的太复杂了,像我们这种菜鸟看都看不明白他说半天说个啥。 所以吧,我决定自己讲讲,简单的讲讲,简单到听一遍就会了。 Android启动可以有两个不同的理解,这一定要分开,决不能像网上别人那样含糊其辞。 Android启动一种理解是Android系统的启动,第二种理解是Androi

生而为人我很抱歉 1352

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android系统启动过程简介

Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用。 用android系统HomeLauncher启动整个过程

zhanghao_Hulk的专栏 786

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android框架简介--启动过程--大体流程

Android设备的启动必须经历3个阶段,即Boot Loader,Linux Kernel和Android系统服务。严格来讲Android系统实际上是运行于Linux 内核上的一系列用户进程,并不算一个严格意义上的操作系统。一般面试问及启动流程都是从init进程开始 启动过程.png 重要的系统进程 第一个系统进程--init init进程的pid值为0.通过解析init.rc脚本来构...

yizhongliu的专栏 2276

Android系统启动过程简介(下)

二、源码分析 对Android-2.1版本中的如下源码文件进行分析: (1) init.c:路径为system/core/init/init.c (2) parser.c:路径为system/core/init/ parser.c (3) builtins.c:路径为system/core/init/ builtins.c (4) property_service.c:路径为system

Robin Hu的专栏 1536

Android框架简介--启动过程--Zygote

Zygote是做什么的 Zygote简单地说主要作用是两方面: 启动SystemServer 孵化应用进程 Android中大多数应用进程和系统进程都是通过Zygote进程来生成。Zygote为孵化的应用程序提供了几个基础资源: 常用类 :Android的Java 类库, 大部分来自于 Apache Hamony, 开源的Java API 实现,如 java.lang, java.util,...

yizhongliu的专栏 3701

Android系统启动过程简介(上)

本文转载整理自:http://www.linuxidc.com/Linux/2011-10/45067.htm 一、 简介 在Linux内核启动后,init 1(1号进程)将作为第一个用户空间,Linux虚拟内存的大小为32(在32位的x86机器上),内核将这4G字节的空间分为两部分。最高的1G字节供内核使用,称为“内核空间”。而较低的3G字节供各个进程使用,称为“用户空间”。)的进程来启

Robin Hu的专栏 1738

Android——Framework目录分析及系统启动过程以及目录简介

转自:http://blog.csdn.net/cubelee/article/details/7392552 1.目录树 /framework/base/api  /framework/base/awt /framework/base/build /framework/base/camera 关于camera的HAL接口库。最终生成native

yhq1913的博客 6659

死磕Android_App 启动过程(含 Activity 启动过程)

文章目录1. 前言1.1 简单介绍一下主要的类2. 应用的启动过程2.1 Launcher简介2.2 启动应用源码分析3. 启动Activity3.1 启动进程3.2 启动主线程3.3 创建Application3.4 创建Activity参考 1. 前言 Activity是日常开发中最常用的组件,系统给我们做了很多很多的封装,让我们平时用起来特别简单,很顺畅.但是你有没有想过,系统内部是如何启动...

潇风寒月 3181
上一篇: binder介绍——JNI的架构和实现
下一篇: Android 4.0 消息处理的流程之我见
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值