首页 文章 精选 留言 我的

精选列表

搜索[大屏设计器],共10000篇文章
优秀的个人博客,低调大师

《Android的设计与实现:卷I》——第3章 3.4init.rc文件解析过程

3.4 init.rc文件解析过程 init.rc文件按照一定的格式组织,要分析init.rc文件的解析过程,首先要熟悉它的格式。init.rc的文件格式由Android初始化语言(Android Init Language)定义,所以这里首先分析Android初始化语言。 3.4.1 Android初始化语言 Android初始化语言定义了六个基本概念、两个基本关键字和多个指令关键字。 六个基本概念分别是Section、Action、Service、Trigger、Command、Option。 两个基本关键字是on和service。 指令关键字则定义在Trigger、Command和Option中。 其帮助文档位于/system/core/init/readme.txt,其关键字定义位于/system/core/init/keyword.h。关键字on用来声明一个Action。 关键字service用来声明一个Service。 每一个Action或者Service都隐含是一个Section,init.rc就是由不同的Section组成的。 Command是最小的功能单位,代表一个Linux命令或者一个方法调用。 Trigger代表一个自定义的触发条件,用来触发Action的执行,也可以认为它是Action的名称。 一个Action便是由关键字on声明、由Trigger触发的一组Command序列。 Option是Service的修饰符,由它来指定何时、如何启动Service程序。 每一个Service都是init进程的子进程,由关键字service、服务名、服务对应的命令的路径、命令的参数和Option组成,代表一些要在初始化阶段启动的程序。 下面将分别介绍上述几个基本概念的组成格式。 1.ActionAction的格式如下: Android初始化语言中定义Action的Trigger如表3-1所示。 除了表3-1中列举的Trigger外,还有在代码中显式使用的Trigger,它们并没有列入Android初始化语言定义的Trigger中。比如可以在init.rc中搜索到early-init、init、charger、nonencrypted、post-fs-data、post-fs、fs等Trigger,这些Trigger其实是当作Action名字使用。 2.Command Android初始化语言中定义的Command如表3-2所示。 3.ServiceService的格式如下: 4.OptionAndroid初始化语言中定义的Option如表3-3所示。 Section是一个虚拟的概念,它在init.rc中并不显式存在。每一个Action或Service隐含是一个Section,每一个Section代表一个完整的功能,init.rc便是由不同的Section组成的。

优秀的个人博客,低调大师

《Android的设计与实现:卷I》——第3章 3.3init进程的执行过程

3.3 init进程的执行过程 init进程是用户空间的第一个进程,进程号为1。Android世界中,很多重要的工作都是从它开始的。init进程相关源码位于/system/core/init目录下,从其编译文件Android.mk中可以看到这部分源代码最终被编译为可执行文件init,代码如下: 注意 pollfd是Linux中定义的结构体,用于存放需要监控事件的文件描述符,其定义如下: struct pollfd { int fd; //需要监控的文件描述符 short events; //监控fd上的事件,由调用方设置 short revents; //fd上发生过的事件,由返回方设置 }; poll的函数原型如下: int poll(struct pollfd fds[], nfds_t nfds, int timeout); nfds:用于标记fds[]中结构体元素的总数。 timeout:用于标记poll函数调用的阻塞事件,单位是毫秒。如果timeout=0,则poll不阻塞,直接返回。poll返回fds中revents不为0的fd个数;如果超时没有任何事件发生,返回0;失败时,返回-1。通过对init.c文件中main函数的分析,可以将init的执行过程分为以下四个阶段: 1)初始化文件系统和日志系统,为之后的执行阶段做准备。这部分主要是Linux标准函数的调用。 2)解析 init.rc和init..rc初始化文件。 3)触发需要执行的Action和Service。 4)init循环监听处理事件。init触发所有Action后,进入一个无限循环,执行在可执行队列中的命令,重启异常退出的Service,并循环处理来自property service(属性服务)、signal和keychord的事件。 第一阶段很容易理解,都是基本的Linux函数调用。接下来,将针对其余三个阶段详细讲解init的运行过程。

优秀的个人博客,低调大师

《Android的设计与实现:卷I》——第1章 2.2JNI框架层实例分析

2.2 JNI框架层实例分析 框架层大量使用了JNI技术来完成对系统运行库的调用。深入理解JNI对分析框架层代码十分有用。本节将以框架层的实例详细讲解JNI编程的三个步骤。 在Android应用程序开发中,一般是调用应用框架层的android.util.Log.java提供的Java接口来使用日志系统。比如我们会写如下代码输出日志:Log.d(TAG,"debug log"); 这个Java接口其实是通过JNI调用系统运行库(即本地库)并最终调用内核驱动程序Logger把Log写到内核空间中的。在Android中, Log系统十分通用,而且其JNI结构非常简洁,很适合作为JNI入门的例子。本节就以它为例贯穿始终,详细讲解JNI各部分的内容。 本节所涉及的文件包括:frameworks/base/core/jni/android_util_Log.cpp(JNI层实现代码)frameworks/base/core/java/android/util/Log.java(Java层代码)libnativehelper/include/nativehelper/jni.h(JNI规范的头文件)libnativehelper/include/nativehelper/JNIHelp.h libnativehelper/JNIHelp.cppframeworks/base/core/jni/AndroidRuntime.cpp读者可以在Source Insight或者Eclipse中打开这几个文件为下面的分析做准备。 2.2.1 Log系统Java层分析 首先看Log系统Java层部分。打开Log.java文件,可以看到这里面只定义了isLoggable和println_native两个Native方法,其代码如下:package android.util;public final class Log { …… public static int d(String tag, String msg) { //使用Native方法打印日志。LOG_ID_MAIN表示日志ID,有4种:main、radio、events、system return println_native(LOG_ID_MAIN, DEBUG, tag, msg); } …… //声明Native方法isLoggable public static native boolean isLoggable(String tag, int level); …… /** @hide / public static final int LOG_ID_MAIN = 0; /** @hide / public static final int LOG_ID_RADIO = 1; /** @hide / public static final int LOG_ID_EVENTS = 2; /** @hide / public static final int LOG_ID_SYSTEM = 3; //声明Native方法println_native /** @hide / public static native int println_native(int bufID, int priority, String tag, String msg); } Java层需要做的就这么简单。只需要声明方法为native而无需实现,就可以直接调用,不会出现任何编译错误。接下来看JNI层的实现代码。 2.2.2 Log系统的JNI层 JNI层是实现Java层方法最关键的部分。还是以Log系统为例讲解JNI层是如何实现Java层声明的Native方法的。不熟悉JNI的读者可以根据包名和类名定位JNI层文件,对于Log类,其对应的JNI文件是android_util_Log.cpp。打开android_util_Log.cpp文件,其代码如下: 从这里以看出,JNI层的实现方法只是根据一定的规则与Java层声明的方法做了一个映射,然后可以通过使用本地库函数或JNIEnv提供的JNI函数响应Java层调用。读者只需要熟悉这部分代码的大体结构和功能即可,后续章节将会详细介绍这部分内容。

优秀的个人博客,低调大师

《Android的设计与实现:卷I》——第3章 Android启动过程的底层实现

第3章 Android启动过程的底层实现 Android支持多种启动模式,主要有正常模式(normal mode)、安全模式(safe mode)、恢复模式(recovery mode)、工厂模式(factory mode)、快速启动模式(fastboot mode)等。除正常模式外,都是刷机或者测试模式,本书只讲解正常模式下Android的启动过程。如果读者对其他启动模式感兴趣,可以自行查阅相关资料。 3.1 Android正常模式启动流程 Android的正常模式启动流程大体如下:步骤1 系统加电,执行bootloader。bootloader负责初始化软件运行所需的最小硬件环境,最后加载内核到内存中。 步骤2 内核加载进内存后,将首先进入内核引导阶段,在引导阶段最后,调用start_kernel进入内核启动阶段。start_kernel最终启动用户空间的init程序。 步骤3 init程序负责解析init.rc配置文件,开启系统守护进程。两个最重要的守护进程是zygote和ServiceManager。前者是Android启动的第一个Dalvik虚拟机,它将负责启动Java世界的进程;后者是Binder通信的基础。 步骤4 zygote虚拟机启动子进程system_server,在system_server中开启了Android核心系统服务并将核心系统服务添加到ServiceManager,然后系统进入systemReady状态。 步骤5 在systemReady状态下,ActivityManagerService与zygote中的Socket通信,通过zygote启动Home应用,进入系统桌面。 步骤1中的bootloader依赖于硬件体系结构,需要读者熟悉特定硬件体系结构及其对应的汇编语言。每个厂商都有自己独特的bootloader程序,所以本书不介绍这部分内容。步骤2和步骤3主要与Linux相关,但是对理解框架层至关重要,将在本章讲解。步骤4和步骤5与Android关系更紧密,将在第4章讲解。

优秀的个人博客,低调大师

《Android的设计与实现:卷I》——第1章 1.2.2动态视角的体系结构

1.2.2 动态视角的体系结构静态的体系结构是从横向分层的角度诠释Android是什么。如果静态的体系结构不足以让读者理解Android的运行机制,我们可以看看Google工程师Sans Serif是怎么描述Android体系结构的,如图1-3所示。 注意 这里内容来源于Sans Serif的一篇博文,原文网址如下:http:// www.tbray.org/ ongoing/When/201x/ 2010/11/14/What-Android-Is。 在图1-3中,将Android划分为两个交互的空间:用户空间和内核空间。 1.用户空间 用户空间分为两个交互的子系统:Native子系统和Java子系统。两个子系统通过JNI技术连接在一起,建立在内核空间之上。 Native子系统主要由NDK开发的App、应用框架层Native部分和标准库C/C++部分组成。 Java子系统主要由SDK开发的App、系统内置App、应用程序框架层Java部分、标准库的Java接口组成。 运行时,Java应用程序调用应用框架层的接口使用标准库提供的服务。整个系统的运行环境和进程管理便由Dalvik和Linux Kernel负责。 2.内核空间 内核空间分为两部分:Linux内核和Android扩展支持,用于完成操作系统运行支持。其中Android扩展部分包括Binder、Logger、OOM等机制。 熟悉了Android的体系结构,接下来我们就要下载Android源码看个究竟。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册