赞
踩
安卓(Android)是一种基于 Linux 内核(不包含 GNU 组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国 Google 公司和 开放手机联盟 领导及开发。Android 操作系统最初由 Andy Rubin 开发,主要支持手机。2005年8月由 Google 收购注资。2007年11月,Google 与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良 Android 系统。随后 Google 以 Apache 开源许可证的授权方式,发布了 Android 的源代码。第一部 Android 智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表等。
Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊状态。因此第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。
系统应用可用作用户的应用,以及提供开发者可从其自己的应用访问的主要功能。例如,如果您的应用要发短信,您无需自己构建该功能,可以改为调用已安装的短信应用向您指定的接收者发送消息。
国内各大厂商在修改 Framewort 时也需要推出自己开发的应用软件,如小米( Mi OpenSource github 开源社区)开源的小米便签,我们的程序就是属于这一层。
您可通过以 Java 语言编写的 API 使用 Android OS 的整个功能集。这些 API 形成创建 Android 应用所需的构建块,它们可简化核心模块化系统组件和服务的重复使用,包括以下组件和服务:
吃瓜:关于Google和oracle的 Java SE之争自行百度或谷歌。
许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库。
对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行。
ART 的部分主要功能包括:
硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。
Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。
移动开发的罗曼蒂克消亡史、由VirtualAPK了解插件化原理(一)、由VirtualAPK了解插件化原理(二)、由Tinker了解热修复原理
Android 系统是基于 Linux 内核的,Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC 机制。但 Android 也实现了自己的进程间通信机制 Binder,下图从三个角度解释 Android 为何要自己实现 Binder 机制。
跨进程通信是需要内核空间做支持的。传统的 IPC 机制如管道、Socket 都是内核的一部分,因此通过内核支持来实现进程间通信自然是没问题的。但是 Binder 并不是 Linux 系统内核的一部分,它依赖于 Linux 的动态内核可加载模块(Loadable Kernel Module,LKM)的机制;模块是具有独立功能的程序,它可以被单独编译,但是不能独立运行。它在运行时被链接到内核作为内核的一部分运行。这样,Android 系统就可以通过动态添加一个内核模块运行在内核空间,用户进程之间通过这个内核模块作为桥梁来实现通信。
一次完整的 Binder IPC 通信过程通常是这样:
Binder 是基于 C/S 架构的。由一系列的组件组成,包括 Client、Server、ServiceManager、Binder 驱动。其中 Client、Server、Service Manager 运行在用户空间,Binder 驱动运行在内核空间。其中 Service Manager 和 Binder 驱动由系统提供,而 Client、Server 由应用程序来实现。Client、Server 和 ServiceManager 均是通过系统调用 open、mmap 和 ioctl 来访问设备文件 /dev/binder,从而实现与 Binder 驱动的交互来间接的实现跨进程通信。
Java端流程图
当电源键按下时引导芯片代码从预定义的地方(固化在 ROM )开始执行。加载引导程序 BootLoader 到 RAM 中,然后执行。
引导程序 BootLoader 是在 Android 操作系统开始运行前的一个小程序,它的主要作用是把系统 OS 拉起来并运行。
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找 init.rc 文件,并启动 init 进程。
init 进程会初始化属性服务,并且解析 init.rc 文件,启动 zygote 进程
init 进程是Android系统中用户控件的第一个进程,进程号是 1。
整个启动过程做了很多工作,不过总的来说分为以下三个部分:
创建 java 虚拟机并为 java 虚拟机注册 JNI 方法,创建服务器端 Socket,启动 SystemServer 进程。
在 Android 系统中,DVM 和 ART、应用程序进程以及运行系统的关键服务的 SystemServer 进程都是由 Zygote 进程来创建的,我们也将它称为孵化器。
总结一波在这里 zygote 究竟干了什么:
启动 Binder 线程池和 SystemServiceManager,并且启动各种系统服务。
SystemServer 进程主要用于创建系统服务,我们熟知的 AMS、WMS 和 PMS 都是由它来创建的。
SystemServer 主要工作为下面三个方面:
AMS 启动 Launcher,Launcher 被启动后会将已安装的应用图片显示在界面上。
Android操作系统启动过程概览、 SystemServer源码分析、Zygote进程启动过程
应用程序图形渲染过程当作一次绘画过程,那么绘画过程中 Android 的各个图形组件的作用是:
android开发者文档、Android开发者网站
官网
C++ 参考手册
c++ 、 c 参考网站
Jdk源码
Java 在线源码阅读
AOSP、在线阅读
源码
github
不多介绍
wanandroid
我经常访问的一个网站
Kotlin中文网、Flutter中文网
国内大牛们所建的网站,有能力当然建议阅读英文
如何打造高质量的应用?
一个应用至少会经过开发、编译 CI、测试、灰度和发布这几个阶段
应用性能的监控平台
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。