android教程(底层)

上传人:wm****3 文档编号:43194704 上传时间:2018-06-04 格式:DOC 页数:14 大小:47.50KB
返回 下载 相关 举报
android教程(底层)_第1页
第1页 / 共14页
android教程(底层)_第2页
第2页 / 共14页
android教程(底层)_第3页
第3页 / 共14页
android教程(底层)_第4页
第4页 / 共14页
android教程(底层)_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《android教程(底层)》由会员分享,可在线阅读,更多相关《android教程(底层)(14页珍藏版)》请在金锄头文库上搜索。

1、androidandroid 教程教程( (底层底层) )本文由 zkgg133 贡献ppt 文档可能在 WAP 端浏览体验不佳。建议您优先选择 TXT,或下载源文件到本机查看。Android 开发杂谈 开发杂谈广州网易,闻波 wenbob内容提要了解系统 ? 了解程序 ? 优化与混淆 ? Hacking了解系统系统组成与特点 ? 系统启动过程典型的手机硬件方案Android 的体系结构 的体系结构五层体系结构解读ApplicationAndroid 内置程序:Home、Contracts、Phone 内置程序: 内置程序 、 、 Google 闭源程序:Google Client 闭源程序:

2、闭源程序 Vendor 程序:HTC Dream,OMS 程序: 程序 ,FrameworkAndroid Core Code(java) ( ) Vendor extensionsNative libraries功能函数库: 功能函数库:C/C+库、音视频、SQLite、OpenGL/ES、 库 音视频、 、 、 Webkit、FreeType、SSL 、 、 Android JNI Android Dalvik VMUserspace drivers ? Linux Kernel精简版的 IPC 补丁:Binder 补丁: 精简版的 补丁 更积极的电源管理:没有人宣布要用的部件, 更积极的

3、电源管理:没有人宣布要用的部件,就关掉函数调用关系Android 的重要特色 的重要特色 ?HAL许多驱动程序以用户态的方式运行,依赖内核的 机制。 许多驱动程序以用户态的方式运行,依赖内核的 HAL 机制。 机制 CameraService、SurfaceFlinger、AudioFlinger 等都位于用户态。等都位于用户态。 、 、 等都位于用户态Bionic精简版的 C/C+运行库,类似于嵌入式系统中常用的 uCLib。 运行库,类似于嵌入式系统中常用的 精简版的 运行库 。 被重复发明的轮子。为什么不用 uCLib?商业用途的版权考虑,不想 被重复发明的轮子。为什么不用 ?商业用途的

4、版权考虑, 限制。 被LGPL 限制。 限制Surface Flinger表面渲染,目前是比较低效的 代码实现 有待芯片厂商来改善。代码实现, 表面渲染,目前是比较低效的 C 代码实现,有待芯片厂商来改善。Android 的重要特色 的重要特色 ?BrowserWebkit 移植版,并不是 Chrome,无 Plugins 接口 移植版,并不是 移植版 , 接口 内置 Google gears(无源代码 内置 (无源代码) 2.x 提供了更多的 提供了更多的 HTML5 特性,如本地存储等 特性, 提供了更多的 特性 不支持文件上传 /frameworks/base/cmds/app_proc

5、ess/app_main.cpp /frameworks/base/core/jni/AndroidRuntime.cppinit 创建的 创建的 app_process 进程被称为 进程被称为zygote(受精卵 。运行后 受精卵)。 创建的 进程被称为 受精卵 创建 socket:/dev/socket/zygote,侦听和处理运行字节码 创建 : , 程序的请求init.rc line 243: service zygote /system/bin/app_process -Xzygote /system/bin -zygote -startsystem-server socket zy

6、gote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state oninit 设置了参数“-zygote” ,进入服务模式。具体实现在 设置了参数“ 设置了参数 ,进入服务模式。具体实现在 Java 类: com.android.internal.os.ZygoteInitZygote 服务器 服务器zygote 在完成了虚拟机的初始化后,启动 UNIX domain socket服务, 在完成了虚拟机的初始化后,启动 服务, 在完成了虚拟机的初始化后

7、服务 循环接受命令,提供创建虚拟机的服务。 循环接受命令,提供创建虚拟机的服务。void run() throws ZygoteInit.MethodAndArgsCaller int loopCount = ZygoteInit.GC_LOOP_COUNT; while (true) if (loopCount 和中的类时,就 中的类时, 和 中的类时 通过 socket 向zygote 发送启动命令。 发送启动命令。 会通过 向 发送启动命令 进程的执行主要有两种情况: 进程的执行主要有两种情况:receiver 收到特定的响应动作后,自动运行(例如开机自动运行的 收到特定的响应动作后,自

8、动运行 例如开机自动运行的 收到特定的响应动作后 android.intent.action.BOOT_COMPLETED 动作 动作) 动作 ? 手动运行 实质是被其他程序通过 手动运行(实质是被其他程序通过 实质是被其他程序通过 StartActivity 等函数启动的 等函数启动的) 等函数启动的Java 程序的进程创建与执行 程序的进程创建与执行进程的创建是通过向 Zygote 服务器提交请求来实现的。 服务器提交请求来实现的。 进程的创建是通过向 服务器提交请求来实现的frameworks/base/core/java/android/os/Process.java 542: pid

9、 = zygoteSendArgsAndGetPid(argsForZygote);zygote 收到命令后,在 runOnce()函数中 收到命令后, 函数中 fork 一个子进程: 一个子进程: 收到命令后 函数中 一个子进程(ZygoteConnection.java 212) pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, rlimits);相似, 虚拟机也把传入类的 main 方法作为入口。 方法作为入口。 和 JVM 相似,D

10、alvik 虚拟机也把传入类的 相似 虚拟机也把传入类的 方法作为入口函数 RuntimeInit.zygoteInit()的最后,调用了invokeStaticMain(startClass, 的最后,调用了 函数 的最后 startArgs),把传入的命令行参数作为类名加载,执行其 函数。 ,把传入的命令行参数作为类名加载,执行其 main 函数。这样,用户的 函数 这样,用户的 java 程 程 序最终运行起来。 序最终运行起来。注意: 不是 JVM 注意:Dalvik 不是 不是相同点: 相同点: 都使用 Java 语法 都使用 语法 不同点: 不同点: 字节码格式定义不同(dex 格

11、式 vs class 格式 格式) 字节码格式定义不同 格式 格式 运行库不同 多虚拟机并发运行优化:共用 dex,大量使用 多虚拟机并发运行优化:共用 ,大量使用mmap 启动机制不同:预加载、 启动机制不同:预加载、预初始化 编译过程不同 Dalvik 不能运行 不能运行.class 和.jar 不能运行 和 Dalvik 不具备 不具备 JavaME 的 API 不具备 的 Dalvik 的大部分函数库来自 的大部分函数库来自 Apache Harmony 项目 的大部分函数库来自 项目 http:/harmony.apache.orgDalvik 的并发执行改进:共享 dex 的并发执

12、行改进:共享 的并发执行改进内存限制内存使用过分,就会被杀掉。 内存使用过分,就会被杀掉。 可用内存一旦太少,就开始杀掉 可用内存一旦太少, 没显示但还滞留的程序。 没显示但还滞留的程序。 C/C+语言编写的程序 语言编写的程序 不受限制。 不受限制。了解程序虚拟机运行机制 GUI 机制 机制 进程与线程GUI 机制 机制Android 的图形用户界面 的图形用户界面栈式的场景(Activity) 栈式的场景 同一个程序,调用其他apk 的功能 的功能 Activity,则每个场景 同一个程序,调用其他 的功能 , 都运行在独立的进程中。采用 IPC 机制,而不是运行库机制(除非 机制, 都运

13、行在独立的进程中。采用 机制 而不是运行库机制( 两个 apk 的 UID 一模一样 一模一样) 。 两个 apk 的UID 一模一样) 。不一样的任务概念A task is what the user experiences as an “application.“ Its a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 一句话: 也就是程序运行时产生的场景的栈。 一句话:Ta

14、sk 也就是程序运行时产生的场景的栈。 也就是程序运行时产生的场景的栈 Android 刻意的弱化进程的概念,只保留线程,又定义了一系列 刻意的弱化进程的概念,只保留线程, 刻意的弱化进程的概念 新的名词。 新的名词。 本意是简化理解,但实际上并没有降低理解难度, 本意是简化理解,但实际上并没有降低理解难度,Task 这样的 这样的 定义反而迷惑了很多人。 定义反而迷惑了很多人。 只要程序有跨越 apk 的场景 的场景(Activity),那就是多进程的,合起来 只要程序有跨越 的场景 ,那就是多进程的, 组成了一个 Task,如下图。 组成了一个 ,如下图。apk 与任务 与任务Activi

15、ty Activity Task ContentProvider ContentProvider Process Activity ActivityService Process APK PackageService Process APK PackageTask 由一组嵌套启动的 由一组嵌套启动的 Activity 组成,但右侧的子 组成, 由一组嵌套启动的 组成 但右侧的子 Activity 并不是 并不是 的子进程。 出来乱 父 Activity 的子进程。这些进程都由 zygote fork 出来 乱 的子进程 出来了解程序虚拟机运行机制 GUI 机制 机制 进程与线程Android

16、中的进程 中的进程进程的生命周期 进程的生命周期Activity 结束后进程仍然存在,开发者不 结束后进程仍然存在, 结束后进程仍然存在 需要编写结束进程的代码, 需要编写结束进程的代码,系统自动判断何 时该终止。 时该终止。 当然也可以主动结束本 Activity: : 当然也可以主动结束本 正常方式(进程未必会结束) 正常方式(进程未必会结束) finish(); 传统方式(真正结束进程 : 传统方式 真正结束进程): 真正结束进程 System.exit(0); 自杀方式(真正结束进程 : 自杀方式 真正结束进程): 真正结束进程 android.os.Process.killProcess( android.os.Process.myPid();进程中的线程默认的线程为主线程, 及事件处理。 默认的线程为主线程,主线程负责 UI 及事件处理。每个线程中都有一个 Looper,循环处理本线程的消息队列。线程之间通过消息通讯。主线程中 ,循环处理本线程的消息队列。线程之间通过消息通讯。 也可以创建辅助线程,但辅助线程不能直接操作 U

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号