Android系统架构与性能优化-丁爱民-v2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
和JVM相似,Dalvik虚拟机也把传入类的main方法作为入口。
函数RuntimeInit.zygoteInit()的最后,调用了invokeStaticMain(startClass, startArgs),把传入的命令行参数作为类名加载,执行其main函数。这样,用户的java程 序最终运行起来。
aapt放置到 根目录
APK包
资源文件
aapt 进行处理
处理后的 资源文件
aapt放置到 在res目录
包的Meta信息
缔造可信可靠的信息世界
APK文件结构:ZIP压缩格式 • 1. META-INF\
• 2. res\
• (注:存放资源文件的目录) ;
• 3. AndroidManifest.xml
IPC: BINDER & PARCELABLES
binder:轻量级的IPC机制,仅依赖内核中的binder driver。 优点:通过mmap()共享内存,不执行序列化,不复制内存。 Parcelables指的是可通过共享内存进行IPC传递的对象,与Java对象的序列化相似但不同,序 列化是相当消耗CPU的。父子Activity间就是用binder传递数据的。
Intent Receiver
Activity
APK Package Process
Thread Looper
UI Events
Activity
Message Queue
System Events
Local Service
Call
Thread External Service
Calls
缔造可信可靠的信息世界
应用程序层 JAVA语言
日历 即时消息
通讯录 短信
拨号 ……
应用开发 应用软件厂商 利用SDK开发APP
JAVA框架层 JAVA语言
Activity Manager Pakage Manager
应用程序开发SDK WindowsManager Resource Manager
Content Provider ……
zygote收到命令后,在runOnce()函数中fork一个子进程:
(ZygoteConnection.java 212) pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, rlimits);
自杀方式(真正结束进程): android.os.Process.killProcess(
android.os.Process.myPid());
缔造可信可靠的信息世界
进程中的线程
默认的线程为主线程,主线程负责 UI 及事件处理。每个线程中都有一个 Looper,循环处理本线程的消息队列。线程之间通过消息通讯。主线程中 也可以创建辅助线程,但辅助线程不能直接操作UI,可以线程中创建 Looper ,通过消息进行。
ANDROID 系统架构与系统优化概述
成众志内部培训 2014年6月
缔造可信可靠的信息世界
目录
系统架构 运行架构 调用架构(进程、线程、任务) 安全架构 系统优化(时&电)
缔造可信可靠的信息世界
ANDROID特性
• Android其本质就是在标准的Linux系统上增 加了Java虚拟机Dalvik,并在Dalvik虚拟机 上搭建了一个JAVA的application framework, 所有的应用程序都是基于JAVA的application framework之上。
本地C程序 框架层
C/C++语言
界面管理 多媒体框架
OpenGL FreeType字体
SGL
SSL
SQLite数据库 Webkit浏览器
C语言类库
核心类库 Dalvik虚机
系统开发 操作系统厂商 修改Android源码
用户 空间
HAL层 C/C++语言
图形 音频 视频 WIFI GPS NFC 蓝牙 ……
• Android主要应用于ARM平台,但不仅限于ARM, 通过编译控制,在X86、MAC等体系结构的机 器上同样可以运行。
缔造可信可靠的信息世界
典型的手机硬件方案
缔造可信可靠的信息世界
系统架构
两空间:
内核空间 用户空间
三类开发:
移植开发 系统开发 应用开发
六层:
设备层 操作系统内核层 HAL层 本地C程序框架层 JAVA框架层 应用程序层
Library &JNI
纯JAVA,没有用JNI,只用SDK
JAVA+C,用SDK+NDK
缔造可信可靠的信息世界
本地库加载机制与NDK
• Google为C/C++开发人员提供了NDK,同样可 以开发Android应用程序
• NDK编写的程序就是本地库文件,在使用这些 库前,必须要加载这些库
• Android系统提供了相应的函数,即load和 loadLibrary,这两个函数可以将本地库加载 到当前应用,同时Android系统还提供函数 exec,能执行命令行命令
init.rc line 243: service zygote /system/bin/app_process -Xzygote /system/bin --zygote --startsystem-server
socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on
void run() throws ZygoteInit.MethodAndArgsCaller { int loopCount = ZygoteInit.GC_LOOP_COUNT; while (true) { if (loopCount <= 0) { ZygoteInit.gc(); loopCount = ZygoteInit.GC_LOOP_COUNT; } else { loopCount--; } if (runOnce()) { break; } }
缔造可信可靠的信息世界
目录
系统架构 运行架构 调用架构(进程、线程、任务) 安全架构 系统优化(时&电)
缔造可信可靠的信息世界
虚拟机的C/S创建机制
字节码程序都是用app_process运行的。app_process负责也设 置用户和组、内存、检查JNI函数、检查字节码、初始化虚拟机等
等脏活累活。
缔造可信可靠的信息世界
APK的编译生成
缔造可信可靠的信息世界
ANDROID的应用包生成过程
源程序部分
JAVA 源代码
AndroidManifest.xml
JAVA编译器
Class字节码 dx工具 处理
aapt 进行处理
Dex字节码
aapt放置到 根目录
处理后的 AndroidManifest.xml
缔造可信可靠的信息世界
ANDROID中的进程
缔造可信可靠的信息世界
进程的生命周期
Activity结束后进程仍然存在,开发者不 需要编写结束进程的代码,系统自动判断何 时该终止。
当然也可以主动结束本Activity:
正常方式(进程未必会结束) finish();
传统方式(真正结束进程): System.exit(0);
Dalvik虚机
硬件抽象层(HAL)
操作系统 内核
标准Linux
Android系统 核心驱动
Android系统 相关设备驱动
硬件设备
缔造可信可靠的信息世界
函数调用关系
缔造可信可靠的信息世界
JAVA框架基本组件及其关系
• Activity:是为用户操作而展示的可视化用户界面。 每个 activity 都被给予一个默认的窗口以进行 绘制。
• 手动运行(实质是被其他程序通过StartActivity等函数启动的)
缔造可信可靠的信息世界
JAVA程序的进程创建与执行
进程的创建是通过向Zygote服务器提交请求来实现的。
frameworks/base/core/java/android/os/Process.java 542: pid = zygoteSendArgsAndGetPid(argsForZygote);
• Service:服务是运行在后台的功能模块
• Content Provider,是 Android 平台应用程序间 数据共享的一种标准接口,它以类似于 URI (Universal Resources Identification)的方 式来表示数据
• Broadcast Receiver 是一个专注于接收广播通知 信息,并做出对应处理的组件。应用程序可以拥 有任意数量的 Broadcast Receiver 以对所有它 感兴趣的通知信息予以响应。
• (注:程序全局配置文件) ;
• 4. classes.dex
• (注:Dalvik字节码);
• 5. resources.arsc
• (注:编译后的二进制资源文件)。
缔造可信可靠的信息世界
两类APP
SDK:software development kit,软件开发工具包 NDK:Native Development Kit,原生软件开发工具包,NDK APP需关注的特点:
1、用C语言开发,速度更快 2、编写的Sevice不会被系统强制退出 3、没有应用级安全沙箱限制
SDK APP
NDK APP
Android Manifest
Dalvik Classes
Android Manifest
Dalvik Classes
Resource Bundle
Resource Bundle
缔造可信可靠的信息世界
注意:DALVIK不是JVM
相同点: 都使用Java语法
不同点: 字节码格式定义不同(dex格式 vs class格式) 运行库不同 多虚拟机并发运行优化:共用dex,大量使用mmap… 启动机制不同:预加载、预初始化 编译过程不同
Dalvik不能运行.class和.jar Dalvik不具备JavaME的API Dalvik的大部分函数库来自Apache Harmony项目
init设置了参数“--zygote”,进入服务模式。具体实现在Java 类:
com.android.internal.os.ZygoteInit
缔造可信可靠的信息世界
ZYGOTE服务器
zygote在完成了虚拟机的初始化后,启动UNIX domain socket服务, 循环接受命令,提供创建虚拟机的服务。
http://harmony.apache.org
缔造可信可靠的信息世界
DALVIK的并发执行改进:共享DEX
缔造可信可靠的信息世界
内存限制
内存使用过分,就会被杀掉。
可用内存一旦太少,就开始杀掉 没显示但还滞留的程序。
C/C++语言编写的程序 不受限制。
缔造可信可靠的信息世界
目录
系统架构 运行架构 调用架构(进程、线程、任务) 安全架构 系统优化(时&电)
APP程序
SDK
NDK
JAVA框架
JNI
C框架库文件
C程序
标准Linux ARM汇编语言
设备
应用程序
系统自带 APP
用户开发 APP
JAVA框架
SDK
NDK
Activity
Service
Broadcast Receiver
Content Provider
……
C程序框 架
JNI Android类库
JAVA运行环境 Android核心库
class AppRuntime: class AndroidRuntime:
<sdk>/frameworks/base/cmds/app_process/app_main.cpp <sdk>/frameworks/base/core/jni/AndroidRuntime.cpp
init创建的app_process进程被称为zygote(受精卵)。运行后 创建socket:/dev/socket/zygote,侦听和处理运行字节码 程序的请求
}
之后,当需要运行manifest文件中的 <activity>,<service>,<receiver>和<provider>中的类时,就 会通过socket向zygote发送启动命令。 进程的执行主要有两种情况:
• receiver收到特定的响应动作后,自动运行(例如开机自动运行的 android.intent.action.BOOT_COMPLETED动作)
操作系统 内核层 C语言
驱动模型 蓝牙、WIFI、显示、键盘、内存、相机、音频、电源、IPC binder等
等驱动程序
ห้องสมุดไป่ตู้内存管理
进程管理
安全管理
网络协议栈
设备层 汇编语言
主板 CPU 内存 外存 USB NFC 蓝牙 ……
移植开发 设备厂商 修改Android源码
内核 空间
缔造可信可靠的信息世界
开发架构
函数RuntimeInit.zygoteInit()的最后,调用了invokeStaticMain(startClass, startArgs),把传入的命令行参数作为类名加载,执行其main函数。这样,用户的java程 序最终运行起来。
aapt放置到 根目录
APK包
资源文件
aapt 进行处理
处理后的 资源文件
aapt放置到 在res目录
包的Meta信息
缔造可信可靠的信息世界
APK文件结构:ZIP压缩格式 • 1. META-INF\
• 2. res\
• (注:存放资源文件的目录) ;
• 3. AndroidManifest.xml
IPC: BINDER & PARCELABLES
binder:轻量级的IPC机制,仅依赖内核中的binder driver。 优点:通过mmap()共享内存,不执行序列化,不复制内存。 Parcelables指的是可通过共享内存进行IPC传递的对象,与Java对象的序列化相似但不同,序 列化是相当消耗CPU的。父子Activity间就是用binder传递数据的。
Intent Receiver
Activity
APK Package Process
Thread Looper
UI Events
Activity
Message Queue
System Events
Local Service
Call
Thread External Service
Calls
缔造可信可靠的信息世界
应用程序层 JAVA语言
日历 即时消息
通讯录 短信
拨号 ……
应用开发 应用软件厂商 利用SDK开发APP
JAVA框架层 JAVA语言
Activity Manager Pakage Manager
应用程序开发SDK WindowsManager Resource Manager
Content Provider ……
zygote收到命令后,在runOnce()函数中fork一个子进程:
(ZygoteConnection.java 212) pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, rlimits);
自杀方式(真正结束进程): android.os.Process.killProcess(
android.os.Process.myPid());
缔造可信可靠的信息世界
进程中的线程
默认的线程为主线程,主线程负责 UI 及事件处理。每个线程中都有一个 Looper,循环处理本线程的消息队列。线程之间通过消息通讯。主线程中 也可以创建辅助线程,但辅助线程不能直接操作UI,可以线程中创建 Looper ,通过消息进行。
ANDROID 系统架构与系统优化概述
成众志内部培训 2014年6月
缔造可信可靠的信息世界
目录
系统架构 运行架构 调用架构(进程、线程、任务) 安全架构 系统优化(时&电)
缔造可信可靠的信息世界
ANDROID特性
• Android其本质就是在标准的Linux系统上增 加了Java虚拟机Dalvik,并在Dalvik虚拟机 上搭建了一个JAVA的application framework, 所有的应用程序都是基于JAVA的application framework之上。
本地C程序 框架层
C/C++语言
界面管理 多媒体框架
OpenGL FreeType字体
SGL
SSL
SQLite数据库 Webkit浏览器
C语言类库
核心类库 Dalvik虚机
系统开发 操作系统厂商 修改Android源码
用户 空间
HAL层 C/C++语言
图形 音频 视频 WIFI GPS NFC 蓝牙 ……
• Android主要应用于ARM平台,但不仅限于ARM, 通过编译控制,在X86、MAC等体系结构的机 器上同样可以运行。
缔造可信可靠的信息世界
典型的手机硬件方案
缔造可信可靠的信息世界
系统架构
两空间:
内核空间 用户空间
三类开发:
移植开发 系统开发 应用开发
六层:
设备层 操作系统内核层 HAL层 本地C程序框架层 JAVA框架层 应用程序层
Library &JNI
纯JAVA,没有用JNI,只用SDK
JAVA+C,用SDK+NDK
缔造可信可靠的信息世界
本地库加载机制与NDK
• Google为C/C++开发人员提供了NDK,同样可 以开发Android应用程序
• NDK编写的程序就是本地库文件,在使用这些 库前,必须要加载这些库
• Android系统提供了相应的函数,即load和 loadLibrary,这两个函数可以将本地库加载 到当前应用,同时Android系统还提供函数 exec,能执行命令行命令
init.rc line 243: service zygote /system/bin/app_process -Xzygote /system/bin --zygote --startsystem-server
socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on
void run() throws ZygoteInit.MethodAndArgsCaller { int loopCount = ZygoteInit.GC_LOOP_COUNT; while (true) { if (loopCount <= 0) { ZygoteInit.gc(); loopCount = ZygoteInit.GC_LOOP_COUNT; } else { loopCount--; } if (runOnce()) { break; } }
缔造可信可靠的信息世界
目录
系统架构 运行架构 调用架构(进程、线程、任务) 安全架构 系统优化(时&电)
缔造可信可靠的信息世界
虚拟机的C/S创建机制
字节码程序都是用app_process运行的。app_process负责也设 置用户和组、内存、检查JNI函数、检查字节码、初始化虚拟机等
等脏活累活。
缔造可信可靠的信息世界
APK的编译生成
缔造可信可靠的信息世界
ANDROID的应用包生成过程
源程序部分
JAVA 源代码
AndroidManifest.xml
JAVA编译器
Class字节码 dx工具 处理
aapt 进行处理
Dex字节码
aapt放置到 根目录
处理后的 AndroidManifest.xml
缔造可信可靠的信息世界
ANDROID中的进程
缔造可信可靠的信息世界
进程的生命周期
Activity结束后进程仍然存在,开发者不 需要编写结束进程的代码,系统自动判断何 时该终止。
当然也可以主动结束本Activity:
正常方式(进程未必会结束) finish();
传统方式(真正结束进程): System.exit(0);
Dalvik虚机
硬件抽象层(HAL)
操作系统 内核
标准Linux
Android系统 核心驱动
Android系统 相关设备驱动
硬件设备
缔造可信可靠的信息世界
函数调用关系
缔造可信可靠的信息世界
JAVA框架基本组件及其关系
• Activity:是为用户操作而展示的可视化用户界面。 每个 activity 都被给予一个默认的窗口以进行 绘制。
• 手动运行(实质是被其他程序通过StartActivity等函数启动的)
缔造可信可靠的信息世界
JAVA程序的进程创建与执行
进程的创建是通过向Zygote服务器提交请求来实现的。
frameworks/base/core/java/android/os/Process.java 542: pid = zygoteSendArgsAndGetPid(argsForZygote);
• Service:服务是运行在后台的功能模块
• Content Provider,是 Android 平台应用程序间 数据共享的一种标准接口,它以类似于 URI (Universal Resources Identification)的方 式来表示数据
• Broadcast Receiver 是一个专注于接收广播通知 信息,并做出对应处理的组件。应用程序可以拥 有任意数量的 Broadcast Receiver 以对所有它 感兴趣的通知信息予以响应。
• (注:程序全局配置文件) ;
• 4. classes.dex
• (注:Dalvik字节码);
• 5. resources.arsc
• (注:编译后的二进制资源文件)。
缔造可信可靠的信息世界
两类APP
SDK:software development kit,软件开发工具包 NDK:Native Development Kit,原生软件开发工具包,NDK APP需关注的特点:
1、用C语言开发,速度更快 2、编写的Sevice不会被系统强制退出 3、没有应用级安全沙箱限制
SDK APP
NDK APP
Android Manifest
Dalvik Classes
Android Manifest
Dalvik Classes
Resource Bundle
Resource Bundle
缔造可信可靠的信息世界
注意:DALVIK不是JVM
相同点: 都使用Java语法
不同点: 字节码格式定义不同(dex格式 vs class格式) 运行库不同 多虚拟机并发运行优化:共用dex,大量使用mmap… 启动机制不同:预加载、预初始化 编译过程不同
Dalvik不能运行.class和.jar Dalvik不具备JavaME的API Dalvik的大部分函数库来自Apache Harmony项目
init设置了参数“--zygote”,进入服务模式。具体实现在Java 类:
com.android.internal.os.ZygoteInit
缔造可信可靠的信息世界
ZYGOTE服务器
zygote在完成了虚拟机的初始化后,启动UNIX domain socket服务, 循环接受命令,提供创建虚拟机的服务。
http://harmony.apache.org
缔造可信可靠的信息世界
DALVIK的并发执行改进:共享DEX
缔造可信可靠的信息世界
内存限制
内存使用过分,就会被杀掉。
可用内存一旦太少,就开始杀掉 没显示但还滞留的程序。
C/C++语言编写的程序 不受限制。
缔造可信可靠的信息世界
目录
系统架构 运行架构 调用架构(进程、线程、任务) 安全架构 系统优化(时&电)
APP程序
SDK
NDK
JAVA框架
JNI
C框架库文件
C程序
标准Linux ARM汇编语言
设备
应用程序
系统自带 APP
用户开发 APP
JAVA框架
SDK
NDK
Activity
Service
Broadcast Receiver
Content Provider
……
C程序框 架
JNI Android类库
JAVA运行环境 Android核心库
class AppRuntime: class AndroidRuntime:
<sdk>/frameworks/base/cmds/app_process/app_main.cpp <sdk>/frameworks/base/core/jni/AndroidRuntime.cpp
init创建的app_process进程被称为zygote(受精卵)。运行后 创建socket:/dev/socket/zygote,侦听和处理运行字节码 程序的请求
}
之后,当需要运行manifest文件中的 <activity>,<service>,<receiver>和<provider>中的类时,就 会通过socket向zygote发送启动命令。 进程的执行主要有两种情况:
• receiver收到特定的响应动作后,自动运行(例如开机自动运行的 android.intent.action.BOOT_COMPLETED动作)
操作系统 内核层 C语言
驱动模型 蓝牙、WIFI、显示、键盘、内存、相机、音频、电源、IPC binder等
等驱动程序
ห้องสมุดไป่ตู้内存管理
进程管理
安全管理
网络协议栈
设备层 汇编语言
主板 CPU 内存 外存 USB NFC 蓝牙 ……
移植开发 设备厂商 修改Android源码
内核 空间
缔造可信可靠的信息世界
开发架构