知识的领域是无限的,我们的学习也是无限期的。这篇文章主要讲述Android高级Android系统以及Activity启动解说相关的知识,希望能为你提供帮助。
一、Android系统启动
android框架架构图:(来自网上。我认为这张图看起来非常清晰)
文章图片
Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用。启动的步骤例如以下图所看到的:(图片来自网上,后面有地址)
文章图片
Android系统整个步骤例如以下:
文章图片
(一) Init进程的启动
init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被加载内存,開始执行,并已初始化全部的设备驱动程序和数据结构等)之后。就通过启动一个用户级程序init的方式,完毕引导进程。init始终是第一个进程。
启动过程就是代码init.c中main函数运行过程:system\\core\\init\\init.c
在函数中运行了:目录建立。挂载,rc文件解析,属性设置。启动服务,运行动作,socket监听……
(二) ServiceManager启动
在.rc脚本文件里zygote的描写叙述:
文章图片
service servicemanager /system/bin/servicemanager class core user system group system critical onrestart restart zygote onrestart restart media onrestart restart surfaceflinger onrestart restart drm
文章图片
ServiceManager用来管理系统中全部的binder service,无论是本地的c++实现的还是java语言实现的都须要
这个进程来统一管理。最基本的管理就是,注冊加入服务,获取服务。
全部的Service使用前都必须先在servicemanager中进行注冊。
do_find_service( )
do_add_service( )
svcmgr_handler( )
代码位置:frameworks\\base\\cmds\\servicemanager\\Service_manager.c
【Android高级Android系统以及Activity启动解说】(三) Zygote进程的启动
Zygote这个进程是很重要的一个进程,Zygote进程的建立是真正的Android执行空间,初始化建立的Service都是Navtive service.
(1) 在.rc脚本文件里zygote的描写叙述:
文章图片
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class main socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd參数:--zygote --start-system-server
文章图片
代码位置:frameworks/base/cmds/app_process/app_main.cpp
上面的參数在这里就会用上。决定是否要启动和启动那些进程。
文章图片
int main( ){ AppRuntime runtime; if (zygote) { runtime.start("com.android.internal.os.ZygoteInit", startSystemServer ?
"start-system-server" : ""); } }class AppRuntime : public AndroidRuntime{};
文章图片
(2) 接着到了AndroidRuntime类中:
frameworks\\base\\core\\jni\\AndroidRuntime.cpp
文章图片
void start(const char* className, const char* options){// start the virtual machine Java在虚拟机中执行的 JNIEnv* env; if (startVm(& mJavaVM, & env) != 0) { return; }//向刚刚新建的虚拟机注冊JNI本地接口 if (startReg(env) < 0) { return; }// jni 调用 java 方法,获取相应类的静态main方法 jmethodID startMeth = env-> GetStaticMethodID(startClass, "main","([Ljava/lang/String; )V"); // jni调用 java方法。调用到ZygoteInit类的main函数jclass startClass = env-> FindClass(className); env-> CallStaticVoidMethod(startClass, startMeth, strArray); }
文章图片
到了ZygoteInit.java中的静态main函数中,从C++ ——》JAVA
(3)ZygoteInit
真正Zygote进程:
frameworks\\base\\core\\java\\com\\android\\internal\\os\\ZygoteInit.java
文章图片
public static void main(String argv[]) { //Registers a server socket for zygote command connections registerZygoteSocket(); //Loads and initializes commonly used classes and //used resources that can be shared across processes preload(); // Do an initial gc to clean up after startup gc(); if (argv[1].equals("start-system-server")) { startSystemServer(); }
/** * Runs the zygote process\'s select loop. Accepts new connections as * they happen, and reads commands from connections one spawn-request\'s * worth at a time. */runSelectLoopMode(); //loop中 /** * Close and clean up zygote sockets. Called on shutdown and on the * child\'s exit path. */ closeServerSocket(); }
文章图片
Zygote就建立好了,利用Socket通讯,接收请求,Fork应用程序进程,进入Zygote进程服务框架中。
(四) SystemServer启动
(五) Home界面启动
二、Activity启动
近期学习Android相关知识,感觉只了解Activity几个生命周期函数基本上没有不论什么意义的。
于是想深入了解一下Activity究竟是怎么一回事怎么执行来的;里面的东东真是叫个庞大;
如今仅仅能简单的了解其框架性的概念和流程;
一 Activity概念Android的核心不是Application而是Activity,至少在我们开发的时候是这种。
Activity就是被用来进行与用户交互和用来与android内部特性交互的组件,
在应用程序中用到的全部activity都须要在manifest.xml文件里进行注冊。
那么Activity又是如何一种组件,怎么样进行显示交互的,一个activity实例是如何被管理和执行起来的。activity生命周期又是怎么一回事。
二 Activity框架和管理结构Activity管理的核心是AcitivityManagerService,是一个独立的进程。
ActiveThread是每个应用程序所在进程的主线程。循环的消息处理;
ActiveThread与AcitivityManagerService的通信是属于进程间通信,使用binder机制;
文章图片
三 Activity启动过程以启动一个应用程序startActivity为例看一下代码运行的大概流程:
文章图片
可将其分为6个过程:
1 使用代理模式启动到ActivityManagerService中运行;
2 创建ActivityRecord到mHistory记录中。
3 通过socket通信到Zgote相关类创建process;
4 通过ApplicatonThread与ActivityManagerService建立通信;
5 ActivityManagerService通知ActiveThread启行。动Activity的创建;
6 ActivityThread创建Activity增加到mActivities中并開始调度Activity执
请看下图:
文章图片
并非全部启动一个Activity都是这种过程:一个应用程序中全部Activity仅仅有一个ActivityThread属于一个Process;
ActivityStack并非每次都须要创建一个Stack来管理Activities;
以下看看adnroid系统中四个重要概念:
Application:由多个相关的松散的与用户进行交互Activity组成,通常被打包成apk后缀文件里;
Activities:应用程序的主要组成部分。是应用程序的核心;
ActivityStack:将应用程序中打开的Activity保存在历史栈中,依照栈的先进后出的原则;Start Activity时入栈,返回时出栈。
Task:将一系列相关的Activity组合。完毕某个应用程序完整操作。无论activity属于哪个Application的。
比如:写信息—调用—文件管理,都属于一个Task,但属于两个Application。
推荐阅读
- 安卓透明颜色设置说明
- 图Graph的类型
- Windows最新13款最佳免费CPU基准测试软件合集
- 最新5个最佳免费照片降噪工具和网站合集
- Windows10的11个最佳免费声音增强器合集
- 适用于Windows的14款最佳免费绘图软件合集
- 适用于Windows的18款最佳免费PC清洁软件合集
- 运用ROM MONITOR 排除故障与维护
- 故障检测检查表