- 浏览: 638177 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
luo_ganlin:
别的不多说,点个赞!
关于Android隐式启动Activity -
IWSo:
谢楼主!研究了好久,原来是这样!
android中如何让LinearLayout实现点击时背景图片切换 -
fantao005x:
粘帖的不错
android中如何让listview的内容全部显示出来 -
learner576539763:
Android_gqs 写道请问博主,Viewstub 可实现 ...
android中ViewStub使用 -
goontosoon:
抄的什么啊,狗屁不通
对ContentProvider中getType(Uri uri)
Android从Linux系统启动有4个步骤;
(1) init进程启动
(2) Native服务启动
(3) System Server,Android服务启动
(4) Home启动
总体启动框架图如:
第一步:initial进程(system/core/init)
init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程.
Init.rc
Init.marvell.rc
Init进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:
servicemanamger
zygote
。。。
最后Init并不退出,而是担当起property service的功能。
1.1脚本文件
init@System/Core/Init
Init.c: parse_config_file(Init.rc)
@parse_config_file(Init.marvel.rc)
解析脚本文件:Init.rc和Init.xxxx.rc(硬件平台相关)
Init.rc是Android自己规定的初始化脚本(Android Init Language, System/Core/Init/readme.txt)
该脚本包含四个类型的声明:
Actions
Commands
Services
Options.
1.2 服务启动机制
我们来看看Init是这样解析.rc文件开启服务的。
(1)打开.rc文件,解析文件内容@ system/core/init/init.c
将service信息放置到service_list中。@ system/core/init parser.c
(2)restart_service()@ system/core/init/init.c
service_start
execve(…).建立service进程。
第二步 Zygote
Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtive service.在.rc脚本文件中zygote的描述:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
所以Zygote从main(…)@frameworks/base/cmds/app_main.cpp开始。
(1) main(…)@frameworks/base/cmds/app_main.cpp
建立Java Runtime
runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);
(2) runtime.start@AndroidRuntime.cpp
建立虚拟机
运行:com.android.internal.os.ZygoteInit:main函数。
(3)main()@com.android.internal.os.ZygoteInit//正真的Zygote。
registerZygoteSocket();//登记Listen端口
startSystemServer();
进入Zygote服务框架。
经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求,Fork应用程序。
第三步 System Server
startSystemServer@com.android.internal.os.ZygoteInit在Zygote上fork了一个进程: com.android.server.SystemServer.于是SystemServer@(SystemServer.java)就建立了。Android的所有服务循环框架都是建立SystemServer@(SystemServer.java)上。在SystemServer.java中看不到循环结构,只是可以看到建立了init2的实现函数,建立了一大堆服务,并AddService到service Manager。
main() @ com/android/server/SystemServer
{
init1();
}
Init1()是在Native空间实现的(com_andoird_server_systemServer.cpp)。我们一看这个函数就知道了,init1->system_init() @System_init.cpp
在system_init()我们看到了循环闭合管理框架。
{
Call "com/android/server/SystemServer", "init2"
…..
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
init2()@SystemServer.java中建立了Android中所有要用到的服务。
这个init2()建立了一个线程,来New Service和AddService来建立服务
第四步 Home启动
在ServerThread@SystemServer.java后半段,我们可以看到系统在启动完所有的Android服务后,做了这样一些动作:
(1) 使用xxx.systemReady()通知各个服务,系统已经就绪。
(2) 特别对于ActivityManagerService.systemReady(回调)
Widget.wallpaper,imm(输入法)等ready通知。
Home就是在ActivityManagerService.systemReady()通知的过程中建立的。下面是ActivityManagerService.systemReady()的伪代码:
systemReady()@ActivityManagerService.java
resumeTopActivityLocked()
startHomeActivityLocked();//如果是第一个则启动HomeActivity。
startActivityLocked(。。。)CATEGORY_HOME
Android核心分析 之九-------Zygote Service
在本章我们会接触到这两个单词:
Zygote [生物] 受精卵, 接合子, 接合体
Spawn:产卵
通过这两个单词,我们就可以大体知道Zygote是干什么的了,就是叫老母鸡下蛋。通过“Zygote”产出不同的子“Zygote”。从大的架构上讲,Zygote是一个简单的典型C/S结构。其他进程作为一个客服端向Zygote发出”孵化”请求,Zygote接收到命令就“孵化”出一个Activity进程来。
Zygote系统代码组成及其调用结构:
Zygote.java
提供访问Dalvik “zygote”的接口。主要是包装Linux系统的Fork,以建立一个新的VM实例进程。
ZygoteConnection.java
Zygote的套接口连接管理及其参数解析。其他Actvitiy建立进程请求是通过套接口发送命令参数给Zygote。
ZygoteInit.java
Zygote的main函数入口。
Zygote系统代码层次调用
main()
startSystemServer()…
runSelectLoopMode()
Accept socket connection
Conntecion.RunOnce()
Read argument
folkAndSpecialize
folkAndSpecialize使用Native函数Dalvik_dalvik_system_Zygote_forkAndSpecialize
//native 的获取
dalvik/vm/native
//dalvik_system_Zygote.c
const DalvikNativeMethod dvm_dalvik_system_Zygote[] = {
{ "fork", "()I",
Dalvik_dalvik_system_Zygote_fork },
{ "forkAndSpecialize", "(II[II[[I)I",
Dalvik_dalvik_system_Zygote_forkAndSpecialize },
{ "forkSystemServer", "(II[II[[I)I",
Dalvik_dalvik_system_Zygote_forkSystemServer },
{ NULL, NULL, NULL },
};
在这里我们就有了Zygote服务的全貌理解,也在Code中印证了。【应yk_hu0621修正】{由于Android中没有具体应用程序的入口,都是通过启动Actvity来启动相关的Android应用,而这个 Android应用则对应着Linux进程,Activity便Host在这个应用程序上。}
{原文:Activity在本质上是个什么东西,就是一个Linux进程}
从分析中我们可以看到,Android使用了Linux的fork机制。在Linux中Fork是很高效的。
一个Android的应用实际上一个Linux进程,所谓进程具备下面几个要素,
a.要有一段程序供该进程运行,程序是可以被多个进程共享的。
b..进程专用的系统堆栈空间。
c.进程控制块,在linux中具体实现是task_struct
d.有独立的存储空间。
fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容,在复制过程中,子进程复制了父进程的task_struct,系统堆栈空间和页面表,而当子进程改变了父进程的变量时候,会通过copy_on_write的手段为所涉及的页面建立一个新的副本。所以只有子进程有改变变量时,子进程才新建了一个页面复制原来页面的内容,基本资源的复制是必须的,整体看上去就像是父进程的独立存储空间也复制了一遍。
再看看下面Google在讲解Dalvik虚拟机的图片,我们就大体有了Android系统中Actvitiy的实际映射状态有了基本的认识。
发表评论
-
EditText软键盘弹出问题解决
2013-02-26 23:10 1471当带有EditView的activity第一次进入时,第一 ... -
android中获取系统相关属性adb
2012-11-15 14:41 22031.查看系统相关属性可以通过: adb shell ... -
Android使用Intent传递复杂参数及复杂参数列表
2012-11-05 17:29 1640刚开始一直纠结于Intent只能put像int, ... -
解决P6200/P6800扩展卡第三方软件不可写的BUG
2012-11-05 17:01 1037从XDA看来的步骤:1. Using a root-e ... -
android 中跟actionbar相关的属性
2012-10-25 17:07 2486android:uiOptions 这个属性用于设置A ... -
source insight使用快捷键
2012-10-25 10:59 1562F5指定行号,实现行跳转,在遇到编译错误的时候,能特 ... -
android中推出应用比较有效率的方法
2012-10-11 16:57 1168添加一个全局变量作为程序退出的标记(boolean类型) ... -
declare-styleable的使用
2012-10-09 13:59 1182declare-styleable的使用 decl ... -
android程序安全的建议
2012-09-29 14:58 5321如果保证自己的 ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
2012-09-29 14:45 1082从 Java 5 开始,Java 提供了自己的线程池。线 ... -
android应用检测更新代码
2012-09-24 17:40 1857JAVA代码: UpdateManager.java ... -
adb命令详解
2012-09-19 15:04 2896Android adb的常用命令略解 Androi ... -
android中屏蔽其它系统按钮的dialog
2012-09-18 10:13 1657public class MyProgress ... -
如何给Scrollview里内容截屏并生成bitmap,注意:Scrollview里面内容较多有滚动了
2012-09-18 10:07 1650使用for循环递归累加其内部的子控件的高度: p ... -
wakelock的使用
2012-09-17 11:44 10088PowerManager.WakerLock是我分析St ... -
启动另外一个apk
2012-09-14 13:16 907这篇博文主要是获取其他apk程序的启动的主intent, ... -
android中全屏的方法
2012-09-14 13:04 9741.直接代码编写 @Override ... -
android:installLocation简析
2012-09-12 15:25 1124在Froyo(android 2.2,API Le ... -
外部apk启动启动另外一个apk
2012-09-06 17:54 1058public class TestingBroadc ... -
listview如何实现圆角
2012-09-05 17:32 1944首先呢,我们还是看几个示图:(这是360推出的一款天气预 ...
相关推荐
《Android数据库初始化技术研究》这篇文献深入探讨了在Android应用开发中如何有效地进行数据库初始化,主要涉及了Android的分层架构、数据持久化方法以及针对SQLite数据库的不同初始化方案,并进行了性能对比和分析...
这个过程涉及到`gralloc.msm7x30.so`的调用,确保了`FrameBuffer`的正确初始化和使用。 #### 结论 SurfaceFlinger作为Android显示系统的核心,通过`DisplayHardware`和`FramebufferNativeWindow`等组件的协同工作...
本篇文章将详细阐述Android系统从按下电源键到用户界面显示的整个初始化阶段,帮助初学者掌握这一复杂的系统启动机制。 ### 一、引导加载器(Bootloader) Android设备的启动首先由Bootloader控制,这是一个低级别...
同时,Android源代码的组织结构清晰地展示了系统各个组成部分之间的关系,这对于理解整个Android系统的构建和运行机制非常重要。了解这些内容不仅有助于开发者更好地调试和优化系统,也为进一步研究Android平台提供...
由于Android的开源特性,使得系统属性的研究对于开发者来说非常重要,尤其是对于那些致力于深入学习Android系统行为和进行定制化开发的开发者而言。 1. Android属性系统的作用: Android属性系统的一个重要功能是...
Linux内存初始化过程首先从内核参数的获取开始。系统启动时,内核需要知道可用的内存大小、控制台设备以及initrd(初始RAM磁盘)的位置。这些信息通常在平台的defaultConfig配置中指定。但在某些情况下,系统实际...
Bootloader是设备启动时运行的第一个程序,负责初始化硬件环境并加载操作系统内核。在Android系统移植中,根据目标硬件的特点定制Bootloader,确保系统能够正确启动,是整个移植流程的基础。 #### 3. **Linux内核...
当我们提到“Pax.zip”时,它可能是指Android系统中的一部分源代码或特定组件,因为“Pax”在Android源码中通常与系统的初始化过程和权限管理有关。 Android系统的启动流程非常复杂,涉及到多个阶段,其中Pax是初始...
2. **System Server**:Android系统服务器,负责初始化系统服务,管理应用程序生命周期,处理系统级广播等。 3. **Activity Manager**:管理应用程序的启动、暂停、恢复和销毁,实现界面的切换和回退栈管理。 4. **...
2. 获取AOSP源码仓库:通过`repo`工具初始化和同步源码。`repo`是一个Python脚本,用于管理多个Git仓库的同步。 3. 设置环境:根据设备或模拟器的需求,配置编译环境,如NDK、SDK、JDK等。 4. 同步源码:使用`repo ...
#### 一、研究与开发Android系统框架的重要意义 研究和开发Android系统的框架具有深远的意义,主要包括以下几点: 1. **深层次的跟踪和调试**:通过理解系统框架,开发者能够对系统行为有更深入的了解,从而进行更...
这份名为“安卓Android源码——系统源码获取及编译”的压缩包文件,显然旨在帮助开发者掌握如何获取和编译Android系统的源代码。接下来,我们将详细探讨这个主题。 首先,获取Android源码主要涉及Git版本控制工具的...
2. **Kernel**:加载必要的驱动,初始化硬件。 3. **Init进程**:第一个用户空间进程,启动System Server和Zygote进程。 4. **System Server**:管理系统服务,如AMS(Activity Manager Service)、WMS等。 5. **...
* Wi-Fi模块的启动和接入点查找连接的实现方法:Wi-Fi模块的启动过程包括初始化、扫描、连接和身份验证等步骤。在连接过程中,Wi-Fi模块需要查找可用接入点,并与其进行连接。 四、Wi-Fi模块在Android系统中的应用 ...
本文详细介绍了Android系统中Wi-Fi网络的研究与实现方法,包括Wi-Fi模块的组成、关键组件的功能以及Wi-Fi网络的初始化、启动、接入点扫描和IP地址配置的实现。通过对Wi-Fi驱动程序的移植与调试,成功地验证了Wi-Fi...
从引导加载器(Bootloader)到系统初始化,Android的启动过程涉及多个阶段,如内核启动、init进程、Zygote进程以及System Server启动。理解这个流程对于优化系统启动时间和性能至关重要。 通过深入研究Android 4.0...
通过分析AndroidApplication,可以了解应用程序如何初始化、如何响应系统事件以及如何与其他组件交互。 ### **21. Android应用框架之Activity** Activity是Android应用程序中最基本的组件之一,它代表了一个屏幕上...
总结而言,本文详细记录了基于Cortex-A9架构的Android系统移植过程中的关键技术和步骤,对于希望在该领域进行研究和开发的人员来说,是一个宝贵的参考资料。文章不仅深入探讨了系统架构的简析,还具体说明了如何搭建...
Android启动过程是一个复杂而有序的系统初始化阶段,涵盖了操作系统内核加载、系统服务启动、用户界面呈现等多个步骤。在这个过程中,Makefile起着至关重要的作用,它是构建Android系统的基石之一。 首先,Android...
9. **系统启动流程**:理解Zygote进程的启动、SystemServer的初始化以及Dalvik/ART虚拟机的运行机制,有助于解决启动过程中的问题。 10. **系统调试**:利用adb、logcat、ddms等工具进行系统调试,找出移植过程中的...