android系统_android系统锁定 - CSDN
精华内容
参与话题
  • Android 系统架构详解

    千次阅读 2019-04-12 14:01:25
    本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制。虽然Android系统非常庞大且错综复杂,需要具备全面的技术...

    引言

     

    本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制。虽然Android系统非常庞大且错综复杂,需要具备全面的技术栈,但整体架构设计清晰。Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)连通系统的内核空间与用户空间。对于用户空间主要采用C++和Java代码编写,通过JNI技术打通用户空间的Java层和Native层(C++/C),从而连通整个系统。

    为了能让大家整体上大致了解Android系统涉及的知识层面,先来看一张Google官方提供的经典分层架构图,从下往上依次分为Linux内核、HAL、系统Native库和Android运行时环境、Java框架层以及应用层这5层架构,其中每一层都包含大量的子模块或子系统。

    上图采用静态分层方式的架构划分,众所周知,程序代码是死的,系统运转是活的,各模块代码运行在不同的进程(线程)中,相互之间进行着各种错终复杂的信息传递与交互流,从这个角度来说此图并没能体现Android整个系统的内部架构、运行机理,以及各个模块之间是如何衔接与配合工作的。为了更深入地掌握Android整个架构思想以及各个模块在Android系统所处的地位与价值,计划以Android系统启动过程为主线,以进程的视角来诠释Android M系统全貌,全方位的深度剖析各个模块功能,争取各个击破。这样才能犹如庖丁解牛,解决、分析问题则能游刃有余。

     

    Android架构

     

    Google提供的5层架构图很经典,但为了更进一步透视Android系统架构,本文更多的是以进程的视角,以分层的架构来诠释Android系统的全貌,阐述Android内部的环环相扣的内在联系。

    系统启动架构图

    图解:Android系统启动过程由上图从下往上的一个过程是由Boot Loader引导开机,然后依次进入 -> Kernel -> Native -> Framework -> App,接来下简要说说每个过程:

    关于Loader层:

    • Boot ROM: 当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在 ROM里的预设代码开始执行,然后加载引导程序到 RAM;

    • Boot Loader:这是启动Android系统之前的引导程序,主要是检查RAM,初始化硬件参数等功能。

    2.1 Linux内核层

    Android平台的基础是Linux内核,比如ART虚拟机最终调用底层Linux内核来执行功能。Linux内核的安全机制为Android提供相应的保障,也允许设备制造商为内核开发硬件驱动程序。

    • 启动Kernel的swapper进程(pid=0):该进程又称为idle进程, 系统初始化过程Kernel由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作;

    • 启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。 kthreadd进程是所有内核进程的鼻祖。

    2.2 硬件抽象层 (HAL)

    硬件抽象层 (HAL) 提供标准接口,HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如WIFI/蓝牙模块,当框架API请求访问设备硬件时,Android系统将为该硬件加载相应的库模块。

    2.3 Android Runtime & 系统库

    每个应用都在其自己的进程中运行,都有自己的虚拟机实例。ART通过执行DEX文件可在设备运行多个虚拟机,DEX文件是一种专为Android设计的字节码格式文件,经过优化,使用内存很少。ART主要功能包括:预先(AOT)和即时(JIT)编译,优化的垃圾回收(GC),以及调试相关的支持。

    这里的Native系统库主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等。启动init进程(pid=1),是Linux系统的用户进程, init进程是所有用户进程的鼻祖。

    • init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程;

    • init进程还启动 servicemanager(binder服务管家)、 bootanim(开机动画)等重要服务

    • init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程(即虚拟机进程), Zygote是所有Java进程的父进程,Zygote进程本身是由init进程孵化而来的。

    2.4 Framework层

    • Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:

    • 加载ZygoteInit类,注册Zygote Socket服务端套接字

    • 加载虚拟机

    • 提前加载类preloadClasses

    • 提前加载资源preloadResouces

    • System Server进程,是由Zygote进程fork而来, SystemServer是Zygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务。

    • Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务。

    2.5 App层

    • Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;

    • Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。

    • 所有的App进程都是由Zygote进程fork生成的。

    2.6 Syscall && JNI

    • Native与Kernel之间有一层系统调用(SysCall)层,见Linux系统调用(Syscall)原理;

    • Java层与Native(C/C++)层之间的纽带JNI,见Android JNI原理分析。

     

    通信方式

     

    无论是Android系统,还是各种Linux衍生系统,各个组件、模块往往运行在各种不同的进程和线程内,这里就必然涉及进程/线程之间的通信。对于IPC(Inter-Process Communication, 进程间通信),Linux现有管道、消息队列、共享内存、套接字、信号量、信号这些IPC机制,Android额外还有Binder IPC机制,Android OS中的Zygote进程的IPC采用的是Socket机制,在上层system server、media server以及上层App之间更多的是采用Binder IPC方式来完成跨进程间的通信。对于Android上层架构中,很多时候是在同一个进程的线程之间需要相互通信,例如同一个进程的主线程与工作线程之间的通信,往往采用的Handler消息机制。

    想深入理解Android内核层架构,必须先深入理解Linux现有的IPC机制;对于Android上层架构,则最常用的通信方式是Binder、Socket、Handler,当然也有少量其他的IPC方式,比如杀进程Process.killProcess()采用的是signal方式。下面说说Binder、Socket、Handler:

    3.1 Binder

    Binder作为Android系统提供的一种IPC机制,无论从系统开发还是应用开发,都是Android系统中最重要的组成,也是最难理解的一块知识点,想了解为什么Android要采用Binder作为IPC机制? 可查看我在知乎上的回答(https://www.zhihu.com/question/39440766/answer/89210950)。深入了解Binder机制,最好的方法便是阅读源码,借用Linux鼻祖Linus Torvalds曾说过的一句话:Read The Fucking Source Code。下面简要说说Binder IPC原理。

    Binder IPC原理

    Binder通信采用c/s架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。

    想进一步了解Binder,可查看Binder系列—开篇(http://gityuan.com/2015/10/31/binder-prepare/),Binder系列花费了13篇文章的篇幅,从源码角度出发来讲述Driver、Native、Framework、App四个层面的整个完整流程。根据有些读者反馈这个系列还是不好理解,这个binder涉及的层次跨度比较大,知识量比较广,建议大家先知道binder是用于进程间通信,有个大致概念就可以先去学习系统基本知识,等后面有一定功力再进一步深入研究Binder机制。

    Binder原理篇(具体文章地址可详见:http://gityuan.com/android/)

    序号 文章名 概述
    0 Binder系列—开篇 Binder概述
    1 Binder系列3—启动Service Manager ServiceManager守护进程 注册和查询服务
    2 Binder系列4—获取Service Manager 获取代理对象BpServiceManager
    3 Binder系列5—注册服务(addService) 注册Media服务
    4 Binder系列6—获取服务(getService) 获取Media代理,以及DeathRecipient
    5 Binder系列7—framework层分析 framework层服务注册和查询,Binder注册
    6 理解Binder线程池的管理 Binder的startThreadPool过程
    7 彻底理解Android Binder通信架构 startService为主线
    8 Binder系列10—总结 Binder的简单总结
    9 Binder IPC的权限控制 clearCallingIdentity/restoreCallingIdentity
    10 Binder死亡通知机制之linkToDeath Binder死亡通知机制

    Binder驱动篇:

    1 Binder Driver初探 驱动open/mmap/ioctl,以及binder结构体
    2 Binder Driver再探 Binder通信协议,内存机制

    Binder使用篇:

    1 如何使用Binder Native层、Framwrok层自定义Binder服务
    2 如何使用AIDL App层自定义Binder服务

    3.2 Socket

    Socket通信方式也是C/S架构,比Binder简单很多。在Android系统中采用Socket通信方式的主要有:

    • zygote:用于孵化进程,system_server创建进程是通过socket向zygote进程发起请求;

    • installd:用于安装App的守护进程,上层PackageManagerService很多实现最终都是交给它来完成;

    • lmkd:lowmemorykiller的守护进程,Java层的LowMemoryKiller最终都是由lmkd来完成;

    • adbd:这个也不用说,用于服务adb;

    • logcatd:这个不用说,用于服务logcat;

    • vold:即volume Daemon,是存储类的守护进程,用于负责如USB、Sdcard等存储设备的事件处理。

    等等还有很多,这里不一一列举,Socket方式更多的用于Android framework层与native层之间的通信。Socket通信方式相对于binder比较简单,这里省略。

    3.3 Handler

    Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信,Handler消息机制是由一组MessageQueue、Message、Looper、Handler共同组成的,为了方便且称之为Handler消息机制。

    有人可能会疑惑,为何Binder/Socket用于进程间通信,能否用于线程间通信呢?答案是肯定,对于两个具有独立地址空间的进程通信都可以,当然也能用于共享内存空间的两个线程间通信,这就好比杀鸡用牛刀。接着可能还有人会疑惑,那handler消息机制能否用于进程间通信?答案是不能,Handler只能用于共享内存地址空间的两个线程间通信,即同进程的两个线程间通信。很多时候,Handler是工作线程向UI主线程发送消息,即App应用中只有主线程能更新UI,其他工作线程往往是完成相应工作后,通过Handler告知主线程需要做出相应地UI更新操作,Handler分发相应的消息给UI主线程去完成,如下图:

    由于工作线程与主线程共享地址空间,即Handler实例对象mHandler位于线程间共享的内存堆上,工作线程与主线程都能直接使用该对象,只需要注意多线程的同步问题。工作线程通过mHandler向其成员变量MessageQueue中添加新Message,主线程一直处于loop()方法内,当收到新的Message时按照一定规则分发给相应的handleMessage()方法来处理。所以说,Handler消息机制用于同进程的线程间通信,其核心是线程间共享内存空间,而不同进程拥有不同的地址空间,也就不能用handler来实现进程间通信。

    上图只是Handler消息机制的一种处理流程,是不是只能工作线程向UI主线程发消息呢,其实不然,可以是UI线程向工作线程发送消息,也可以是多个工作线程之间通过handler发送消息。更多关于Handler消息机制文章:

    • Android消息机制-Handler(framework篇)(http://gityuan.com/2015/12/26/handler-message-framework/)

    • Android消息机制-Handler(native篇)(http://gityuan.com/2015/12/27/handler-message-native/)

    • Android消息机制3-Handler(实战)(http://gityuan.com/2016/01/01/handler-message-usage/)

    要理解framework层源码,掌握这3种基本的进程/线程间通信方式是非常有必要,当然Linux还有不少其他的IPC机制,比如共享内存、信号、信号量,在源码中也有体现,如果想全面彻底地掌握Android系统,还是需要对每一种IPC机制都有所了解。

     

    核心提纲

     

    博主对于Android从系统底层一路到上层都有自己的理解和沉淀,通过前面对系统启动的介绍,相信大家对Android系统有了一个整体观。接下来需抓核心、理思路,争取各个击破。后续将持续更新和完善整个大纲,不限于进程、内存、IO、系统服务架构以及分析实战等文章。

    当然本站有一些文章没来得及进一步加工,有时间根据大家的反馈,不断修正和完善所有文章,争取给文章,再进一步精简非核心代码,增加可视化图表以及文字的结论性分析。基于Android 6.0的源码,专注于分享Android系统原理、架构分析的原创文章。

    建议阅读群体: 适合于正从事或者有兴趣研究Android系统的工程师或者技术爱好者,也适合Android App高级工程师;对于尚未入门或者刚入门的App工程师阅读可能会有点困难,建议先阅读更基础的资料,再来阅读本站博客。

    看到Android整个系统架构是如此庞大的, 该问如何学习Android系统, 以下是我自己的Android的学习和研究论,仅供参考如何自学Android(http://gityuan.com/2016/04/24/how-to-study-android/)。

    从整理上来列举一下Android系统的核心知识点概览:

    4.1 系统启动系列

    Android系统启动-概述:

    链接地址:http://gityuan.com/2016/02/01/android-booting/

    Android系统中极其重要进程:init, zygote, system_server, servicemanager 进程:

    序号 进程启动 概述
    1 init进程 Linux系统中用户空间的第一个进程, Init.main
    2 zygote进程 所有App进程的父进程, ZygoteInit.main
    3 system_server进程(上篇) 系统各大服务的载体, forkSystemServer过程
    4 system_server进程(下篇) 系统各大服务的载体, SystemServer.main
    5 servicemanager进程 binder服务的大管家, 守护进程循环运行在binder_loop
    6 App进程 通过Process.start启动App进程, ActivityThread.main

    再来看看守护进程(也就是进程名一般以d为后缀,比如logd,此处d是指daemon的简称), 下面介绍部分守护进程:

    • debuggerd

    • installd

    • lmkd

    • logd

    4.2 系统稳定性系列

    Android系统稳定性主要是异常崩溃(crash)和执行超时(timeout):

    链接地址:http://gityuan.com/2016/06/19/stability_summary/

    序号 文章名 概述
    1 理解Android ANR的触发原理 触发ANR的场景以及机理
    2 Input系统—ANR原理分析 input触发ANR的原理
    3 理解Android ANR的信息收集过程 AMS.appNotResponding过程分析,收集traces
    4 解读Java进程的Trace文件 kill -3 信息收集过程
    5 Native进程之Trace原理 debuggerd -b 信息收集过程
    6 WatchDog工作原理 WatchDog触发机制
    7 理解Java Crash处理流程 AMS.handleApplicationCrash过程分析
    8 理解Native Crash处理流程 debuggerd守护进程
    9 global reference限制策略 global reference

    4.3 Android进程系列

    进程/线程是操作系统的魂,各种服务、组件、子系统都是依附于具体的进程实体。深入理解进程机制对于掌握Android系统整体架构和运转机制是非常有必要的,是系统工程师的基本功,下面列举进程相关的文章:

    序号 文章名 概述
    1 理解Android进程创建流程 Process.start过程分析
    2 理解杀进程的实现原理 Process.killProcess过程分析
    3 Android四大组件与进程启动的关系 AMS.startProcessLocked过程分析组件与进程
    4 Android进程绝杀技--forceStop force-stop过程分析彻底移除组件与杀进程
    5 理解Android线程创建流程 3种不同线程的创建过程
    6 彻底理解Android Binder通信架构 以start-service为线,阐述进程间通信机理
    7 理解Binder线程池的管理 Zygote fork的进程都默认开启binder线程池
    8 Android进程生命周期与ADJ 进程adj, processState以及lmk
    9 Android LowMemoryKiller原理分析 lmk原理分析
    10 进程优先级 进程nice,thread priority以及scheduler
    11 Android进程调度之adj算法 updateOomAdjLocked过程
    12 Android进程整理 整理系统的所有进程/线程

    4.4 四大组件系列

    对于App来说,Android应用的四大组件Activity,Service,Broadcast Receiver, Content Provider最为核心,接下分别展开介绍:

    序号 文章名 类别
    1 startActivity启动过程分析 Activity
    2 简述Activity生命周期 Activity
    3 startService启动过程分析 Service
    4 bindService启动过程分析 Service
    5 以Binder视角来看Service启动 Service
    6 Android Broadcast广播机制分析 Broadcast
    7 理解ContentProvider原理 ContentProvider
    8 ContentProvider引用计数 ContentProvider
    9 Activity与Service生命周期 Activity&&Service
    10 简述Activity与Window关系 Activity&&Window
    11 四大组件之综述 AMS
    12 四大组件之ServiceRecord Service
    13 四大组件之BroadcastRecord Broadcast
    14 四大组件之ContentProviderRecord ContentProvider
    15 理解Android Context Context
    16 理解Application创建过程 Application
    17 unbindService流程分析 Service
    18 四大组件之ActivityRecord Activity
    19 AMS总结(一) AMS

    4.5 图形系统系列

    图形也是整个系统非常复杂且重要的一个系列,涉及WindowManager,SurfaceFlinger服务。

    序号 文章名 类别
    1 WindowManager启动篇(http://gityuan.com/2017/01/08/windowmanger/) Window
    2 WMS之启动窗口篇(http://gityuan.com/2017/01/15/wms_starting_window/) Window
    3 以Window视角来看startActivity(http://gityuan.com/2017/01/22/start-activity-wms/) Window
    4 Android图形系统概述(http://gityuan.com/2017/02/05/graphic_arch/) SurfaceFlinger
    5 SurfaceFlinger启动篇(http://gityuan.com/2017/02/11/surface_flinger/) SurfaceFlinger
    6 SurfaceFlinger绘图篇(http://gityuan.com/2017/02/18/surface_flinger_2/) SurfaceFlinger
    7 Choreographer原理(http://gityuan.com/2017/02/25/choreographer/) Choreographer

    4.6 系统服务篇

    再则就是在整个架构中有大量的服务,都是基于Binder来交互的,Android系统服务的注册过程也是在此之上的构建的。计划针对部分核心服务来重点分析:

    • AMS服务

      AMS启动过程(一)(http://gityuan.com/2016/02/21/activity-manager-service/)

      更多组件篇[见小节4.3]

    • Input系统

      Input系统—启动篇(http://gityuan.com/2016/12/10/input-manager/)

      Input系统—InputReader线程(http://gityuan.com/2016/12/11/input-reader/)

      Input系统—InputDispatcher线程(http://gityuan.com/2016/12/17/input-dispatcher/)

      Input系统—UI线程(http://gityuan.com/2016/12/24/input-ui/)

      Input系统—进程交互(http://gityuan.com/2016/12/31/input-ipc/)

      Input系统—ANR原理分析(http://gityuan.com/2017/01/01/input-anr/)

    • PKMS服务

      PackageManager启动篇(http://gityuan.com/2016/11/06/packagemanagerservice)

      Installd守护进程(http://gityuan.com/2016/11/13/android-installd)

    • Alarm服务

      理解AlarmManager机制(http://gityuan.com/2017/03/12/alarm_manager_service/)

    • JobScheduler服务

      理解JobScheduler机制(http://gityuan.com/2017/03/10/job_scheduler_service/)

    • BatteryService

      Android耗电统计算法(http://gityuan.com/2016/01/10/power_rank/)

    • PMS服务

    • DropBox服务

      DropBoxManager启动篇(http://gityuan.com/2016/06/12/DropBoxManagerService/)

    • UserManagerService

      多用户管理UserManager(http://gityuan.com/2016/11/20/user_manager/)

    4.7 内存&&存储篇

    • 内存篇

      Android LowMemoryKiller原理分析(http://gityuan.com/2016/09/17/android-lowmemorykiller/)

      Linux内存管理(http://gityuan.com/2015/10/30/kernel-memory/)

      Android内存分析命令(http://gityuan.com/2016/01/02/memory-analysis-command/)

    • 存储篇

      Android存储系统之源码篇:http://gityuan.com/2016/07/17/android-io/

      Android存储系统之架构篇:http://gityuan.com/2016/07/23/android-io-arch

    • Linux驱动篇

      敬请期待

    • dalvik/art

      解读Java进程的Trace文件:http://gityuan.com/2016/11/26/art-trace/

    4.8 工具篇

    再来说说Android相关的一些常用命令和工具以及调试手段。

    序号 文章名 类别
    1 理解Android编译命令(http://gityuan.com/2016/03/19/android-build/) build
    2 理解Android.bp(http://gityuan.com/2018/06/02/android-bp/) build
    2 性能工具Systrace(http://gityuan.com/2016/01/17/systrace/) systrace
    3 Android内存分析命令(http://gityuan.com/2016/01/02/memory-analysis-command/) Memory
    4 ps进程命令(http://gityuan.com/2015/10/11/ps-command/) Process
    5 Am命令用法(http://gityuan.com/2016/02/27/am-command/) Am
    6 Pm命令用法(http://gityuan.com/2016/02/28/pm-command/) Pm
    7 调试系列1:bugreport源码篇(http://gityuan.com/2016/06/10/bugreport/) bugreport
    8 调试系列2:bugreport实战篇(http://gityuan.com/2016/06/11/bugreport-2/) bugreport
    9 dumpsys命令用法(http://gityuan.com/2016/05/14/dumpsys-command/) dumpsys
    10 Android logd日志原理(http://gityuan.com/2018/01/27/android-log/) logd
    11 介绍gdb调试工具(http://gityuan.com/2017/09/09/gdb/) gdb
    12 介绍addr2line调试命令(http://gityuan.com/2017/09/02/addr2line/) addr2line

    4.9 实战篇

    下面列举处理过的部分较为典型的案例,供大家参考:

    序号 文章名 类别
    1 Binder Driver缺陷导致定屏的案例(http://gityuan.com/2018/05/12/binder-driver-bug/) binder
    2 深度解读ArrayMap优势与缺陷(http://gityuan.com/2019/01/13/arraymap/) ArrayMap
    3 数组越界导致系统重启的案例(http://gityuan.com/2018/02/10/reboot-locked-method/) 数组越界
    4 一行Log引发多线程并发问题的案例(http://gityuan.com/2018/02/03/log-fc/) 多线程并发
    5 跑monkey压力测试过程的冻屏案例(http://gityuan.com/2018/02/17/monkey-deadlock/) monkey冻屏
    6 深度剖析APP保活案例(http://gityuan.com/2018/02/24/process-keep-forever/) 保活

     

    结束语

     

    Android系统之博大精深,包括Linux内核、Native、虚拟机、Framework,通过系统调用连通内核与用户空间,通过JNI打通用户空间的Java层和Native层,通过Binder、Socket、Handler等打通跨进程、跨线程的信息交换。只有真正阅读并理解系统核心架构的设计,解决问题和设计方案才能做到心中无剑胜有剑,才能做到知其然知其所以然。当修炼到此,恭喜你对系统有了更高一个层次的理解,正如太极剑法,忘记了所有招式,也就练成了太极剑法。

    再回过头去看看那些API,看到的将不再是一行行代码、一个个接口的调用,而是各种信息的传递与交互工作,而是背后成千上万个小蝌蚪的动态执行流。记得《侠客行》里面的龙木二岛主终其一生也无法参透太玄经,石破天却短短数日练成绝世神功,究其根源是龙木二岛主以静态视角去解读太玄经,而石破天把墙壁的图案想象成无数游动的蝌蚪,最终成就绝世神功。一言以蔽之,程序代码是死的,系统运转是活的,要以动态视角去理解系统架构。

    作者:袁辉辉,安卓知名博主Gityuan,现就职于手机厂商,热衷于研究Android系统架构与内核技术,对Android系统框架有着深刻理解与丰富的实战经验。

    转载地址:https://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650717962&idx=4&sn=d2d68b759ba53c392b5e56acb171e6ba&chksm=bea6ced989d147cfaa6ca7544209fc520f7de260a82bf8ba418a88ec2f46a91afb03e16343e9&mpshare=1&scene=23&srcid=0412B6lHrCvWrHkLTCfgtMBv#rd

    展开全文
  • Android系统框架总结(好文)

    万次阅读 2018-08-15 15:47:06
    Android框架图 Android应用程序框架 UI基本开发 Fragment 安全策略 在Android中,安全涵盖了应用程序的部署和执行.对于部署来 说,Android应用程序必须被赋予一个数字证书才允许被安装到某个设备中.对 于运行来...

    原址

    通用概念

    Android框架图

    2016071201.png

    Android应用程序框架

    UI基本开发

    Fragment

    安全策略

    在Android中,安全涵盖了应用程序的部署和执行.对于部署来 说,Android应用程序必须被赋予一个数字证书才允许被安装到某个设备中.对 于运行来说,每个应用程序都在一个独立的应用程序中执行,每个进程都有一 个唯一的永久的用户ID(在安装的时候分配的).

    注册应用程序需要三样东西:

    1. 一个数字证书,
    2. 一个.apk文件
    3. 以及用于将数字签名应用到.apk文件的工具(jarsigner).

    注册一个应用程序步骤如下:

    • 使用Keytool创建一个自注册的证书.

       步骤1 Create a folder to hold the keystore, for example

    c:\android\release\.
    

      步骤2 在命名行中执行如下命令:

           keytool -genkey -v -keystore "FULL PATH OF release.keystore FILE FROM STEP 1"
           -alias androidbook -storepass paxxword -keypass paxxword -keyalg RSA
           -validity 14000
    

    keytool的参数说明如下: 2016070502.png

    • 使用Jarsigner注册.apk文件
      jarsigner -keystore "PATH TO YOUR release.keystore FILE" -storepass paxxword
      -keypass paxxword "PATH TO YOUR APK FILE" androidbook(别名)
      
    • 用zipalign作字节对齐 命令如下:
      zipalign –v 4 infile.apk outfile.apk
      

      验证一个.apk文件是否是4字节对齐,用如下命令

      zipalign –c –v 4 filename.apk
      
    • 安装应用程序
      adb install "PATH TO APK FILE GOES HERE"(安装)
      adb uninstall packagename(卸载)
      adb install –r "PATH TO APK FILE GOES HERE"(重装)
      

    Framework

    Audio System

    Audio System 介绍

    2016053001.png

    AudioTrack 介绍

    2016053002.png

    基本说明:

    1. 用于管理来自一个Source的Audio 播放将播放的Audio 数据送给 AudioFlinger
    2. 提供播放的控制接口 API:start(), stop(), …
    3. 提供Volume 控制接口, 用于控制L/R声道各自的Volume
      • API: setVolume
      • Android 体系中有3个Audio Volume控制, 最终的输出Volume是下面3 者的乘积
        1. Master Volume
        2. Stream Type Volume
        3. Track Volume
    4. AudioTrack可以配置为下面三种Mode:
      1. PUSH MODE
      2. PULL MODE
      3. STATIC MODE
    5. AudioTrack测试程序
      /**
       * 利用AudioTrack播放一个wav文件
       */
      
      //#define LOG_NDEBUG 0
      #define LOG_TAG "AudioTrackTest"
      //#include <utils/Log.h>
      #include <media/AudioTrack.h>
      #include <system/audio.h>
      using namespace android;
      #define ALOGD printf
      int main(int argc, char *argv[])
      {
        int readNum;
        unsigned short channel;
        unsigned int sampleRate;
        FILE *fp = fopen("bzk_chic.wav", "ab+");
        if (fp == NULL) {
          ALOGD("Cannot open .wav file");
          return -1;
        }
        ALOGD("Open wav file successfully!\n");
        fseek(fp, 0x16, 0); 
        readNum= fread(&channel, 1, 2, fp);
        if (readNum < 1) {
          ALOGD("Can not read channel number: %d\n", readNum);
          fclose(fp);
          return 0;
        }
        ALOGD("channel number is %d\n", channel);
        fseek(fp, 0x18, 0); 
        readNum = fread(&sampleRate, 1, 4, fp);
        if (readNum < 1) {
          ALOGD("Cannot read sample rate: %d\n", readNum);
          fclose(fp);
          return 0;
        }
        ALOGD("Sample Rate is %d\n", sampleRate);
      
        // playing to an AudioTrack, set up mask if necessary
        audio_channel_mask_t audioMask = AUDIO_CHANNEL_OUT_STEREO;
        if (0 == audioMask) {
          return -1;
        }
        sp<AudioTrack> audioTrack = new AudioTrack(
                                                   AUDIO_STREAM_MUSIC, sampleRate, AUDIO_FORMAT_PCM_16_BIT, audioMask,
                                                   0, AUDIO_OUTPUT_FLAG_NONE);
        status_t status = audioTrack->initCheck();
        if(status != NO_ERROR) {
          audioTrack.clear();
          ALOGD("Failed for initCheck()");
          return -1;
        }
        audioTrack->start();
      
        unsigned char *buffer = new unsigned char[channel * 64 * 2];
        while (1) {
          readNum = fread(buffer, 1, channel * 64 * 2, fp);
          if (readNum <= 0)
            break;
          ALOGD("Write data : %d to AudioTrack", readNum);
          audioTrack->write(buffer, readNum);
        }
      
        fclose(fp);
        delete []buffer;
        audioTrack->stop();
      
      }
      

    AudioRecord介绍

    2016053003.png

    基本说明:

    1. 用于管理从底层获取录音数据,并提供给上层
    2. 提供录音的控制接口 API:start(), stop()
    3. 获取声音资料的方式
      • 由上层主动调用AudioRecord::read() 来获取数据 (PULL MODE)
      • 上层提供Callback function, 通过AudioRecord主动将资料通过 Callback 给上层(PUSH MODE)

    AudioPolicyService介绍

    2016053004.png

    AudioPolicyService在Audio system中的位置和作用

    • 仅是一个行为决策者,而不是行为的实施者
    • 真正的实施者为AudioFlinger
    • 它是一个在后台进程中的服务实体,提供的服务就是告诉实施者要怎么去 做

    2016053005.png

    AudioPolicyService几大功能:

    • 设备状态管理
    • 输入输出策略管理
    • 音量控制管理
    • Effect 控制管理

    AudioFlinger

    2016053006.png

    AudioFlinger的线程循环逻辑如下所示:

    2016053007.png

    Media Framework

    基础知识

    AMessage代表一个消息,对应一个target, 根据这个target可以知道对 应的消息应该归哪个AHandler去处理。

    AHandler是处理消息的基类,它有一个id,处理与这个id相关联的AMessage, 在 onMessageReceived 函数中处理各种消息。 从AHandler派生的类,都会重写该方法,以处理各种消息。

    有一个全局的 ALooperRoster 对象,它维护了系统中存在的 AHandler对 象。

    ALooper对象,通过 registerHandler 接口将AHandler对象注册给ALooperRoster 对象维护的AHandler列表中。

    主要代码路径

    • MediaPlayer.java
      • Java 层的 MediaPlayer 接口,APK 主要通过 call 它的接口实现播放功能
      • code path: framework/base/media/java/android/media/MediaPlayer.java
    • Media JNI
      • MediaPlayer java 层与 native 层的接口
      • code path: framework/base/media/jni/androidmediaMediaPlayer.cpp
      • output:libmediajni.so
    • MediaPlayer
      • MediaPlayer Native 层 client 端接口
      • code path: framework/av/media/libmedia/
      • output:libmedia.so
    • Media Service
      • Native 层真正实现播放功能的 Service 进程
      • code path: framework/av/media/mediaserver framework/av/media/libmediaplayerservice
      • output: mediaserver libmediaplayerservice.so

    Stagefright

    • StagefrightPlayer
      • 负责提供 player 的接口
      • code path: framework/av/media/libmediaplayerservice/StagefrightPlayer.cpp
    • AwesomePlayer
      • 真正实现 playback 功能的模块
      • code path: : framework/av/media/libstagefright
    • DataSource
      • 提供 Source 数据,可以是本地文件,也可以是网络数据
      • code path: : framework/av/media/libstagefright
    • MediaSource
      • MediaSource使用到了DataSoure和OMX,可以提供解码后的供显示的数据
      • code path: framework/av/media/libstagefright/
    • OMXClient
      • 使用 OMX 的 client 端
      • code path: framework/av/media/libstagefright/
    • OMX
      • 提供一套接口接到底层的 decoder 进行解码
      • code path: framework/av/media/libstagefright/omx

    NuPlayer

    2016053008.png

    OpenMAX

    OpenMAX is a royalty-free, cross-platform API. OpenMAX Working Group has been formed by the Khronos Group. The Standard for Media Library Portability. Reduce the cost and complexity of porting multimedia software to new processors and architectures. 分为 OpenMAX DL, IL, AL 三层,Android 上只用到 OpenMAX IL.

    Graphics

    Android Graphics Pipeline Overview

    • Android Graphics Pipeline

      2016052601.png

      如图,对于一些Buffer,有些通过GPU处理后,再送给HWComposer,有些则 直接送给HWComposer处理。

    • BufferQueue

      2016052602.png

      关于BufferQueue的说明如下:

      1. manages flow of buffers between producers and consumers
      2. two queues
      3. producers dequeue unused buffers, fill them, then queue them
      4. consumers acquire filled buffers, use them, then release them when done.
    • SurfaceFlinger

      它的主要使用是:

      1. Responsible for compositing all windows into the display(s)
      2. Just another GL client
    • HW Composer

      一开始是为了加速叠图而准备的一个HAL,目前作为所有显示的HAL。

      • Overlay
        • Overlay 是什么

          在android 上面,屏幕上输出的画面都是由多个图层(layer)合成 (compsing)得到的结果. 所以在android上面,图像的合成是非常普 通而且常见(频繁)的操作, 如果有一个简单而省电的hardware(hw)来负 责图像合成, 可以很有效的降低功耗,而且也可以降低GPU的loading.

          Overlay 就是一个专门负责图像合成的一个hw. 相比GPU 而言, overlay 是一个非常简单图像处理hw. 和GPU具有的庞大的图形功能不 同, overlay只能负责简单的图像合成动作.

          由于overlay 功能简单,所以hw的实现上相比GPU也要简单很多,工作起 来也会非常省电.

        • Overlay 有什么限制

          由于overlay hw很简单,所以它只能处理简单的图像合成工作,太复杂 的图像合成工作还是要GPU来协助完成.

          overlay 无法处理的case:

          1. 需要旋转的图像
          2. 需要缩放的图像
          3. 图层超过4层

          不过对于普通的android应用场景来说,很少会出现上述的那些cases.

        • 没有overlay HW,图像合成流程

          Surfaceflinger把需要合成的layers 交给GPU 做composing, 最终输出 到屏幕。

          2016071204.png

        • 有Overlay HW, 图像合成的流程

          Surfaceflinger把需要合成的layers 交给ovl做composing, 最终输出 到屏幕。

          2016071205.png

        • 有overlay HW,但需要GPU做图像合成流程

          Overlay不能处理的layers, 会交给GPU做图像合成,GPU把图像合成为 一个layer, 然后再通过overlay 输出.

          2016071206.png

    Android Sync Framework

    • 定义

      Synchronization between consumers and producers who are from different hardware components to use a buffer atomically

    • 应用背景

      在复杂的DMA管线如图形管线(多媒体,摄像头,GPU以及显示设备),一 个buffer的消费者需要知道生产者什么时候完成生产(即创建一个Buffer, 并往里面放置消费者所需要的数据)。同样地,生产者也需要知道消费者 什么时候使用它创建的Buffer,以便它可以重新使用这个Buffer。而且, 一个Buffer可能被多个不同的消费者使用不同的时间。另外,一个消费者 可能需要互斥地消费多个Buffer,等等,有一个问题应运而生,就是如何 保证多个消费者之间同步使用Buffer,以及生产者与消费者协调使用 Buffer。因为Buffer是一个共享资源,且任何消费者或生产者对Buffer的 使用都是排他性的(因为它们属于不同的硬件单元或模块),大体看来, 需要解决如下两个问题:

      1. 消费者与生产者之间对Buffer的同步访问。
      2. 消费者之间对Buffer的同步访问。
    • 目标
      1. Provide a simple API to let components signal when buffers are ready/released.
      2. Allow synchronization primitives to be passed between processes and between userspace and the kernel.
      3. Allow implementers to exploit hardware sync support
      4. Provide visibility into the graphics pipeline for debugging
    • Software Stacks

      2016052609.png

    • 实现
      1. synctimeline

        2016052603.png

        • Represents monotonically increasing counter
        • Generally one instance per driver context
        • allows hardware specific implementation
        • swsync implementation provided
      2. syncpt

        2016052604.png

        • Represents a specific values on a parent timeline
        • 3 states
          • active
          • signaled
          • error
        • starts active and transitions once to either signaled or error
      3. syncfence

        2016052605.png

        • A collection of syncpts
        • Backed by a file and can be passed to userspace.
        • Main primitive drivers and userspace use to describe sync events/dependencies.
        • Fences are a promise by the kernel
          • that work has been queued
          • and will complete in a "timely" manner
        • Starts active and transitions to signaled with all of its syncptsbecome signaled or one becomes errored
        • The list of syncpts is immutable after fence creation
        • A syncpt can only be in one fence.
        • Two fences can be merged to create a third fence containing copies of the sync points in both.
        • Sync Merge
          • Before Merge

            2016052606.png

          • After Merge

            2016052607.png

      4. 代码
        • supported in android-3.10 kernel + staged for quite some time
        • Core
          • drivers/staging/android/sync.c
          • drivers/staging/android/sync.h
        • swsync
          • drivers/staging/android/sw_sync.c
          • drivers/staging/android/sw_sync.h
        • 接口声明

          2016052608.png

      5. 实现synctimeline的建议

        在实现前,先考虑是否可以直接使用swsync, 以swsync为起点。

        • Don'ts
          • Don't base a timeline on any "real" time.
          • Don't allow userspace to explicitly
            • create a fence
            • signal a fence
          • Don't access synctimeline, syncpt, or syncfence elements explicitly.
        • Dos
          • Do provide useful names
          • Do implement timelinevalue str and ptvaluestr
          • Do implement fill driverdata

    Input System

    Input Event Process Flow

    2016053009.png

    Architecture (ICS)

    2016053010.png

    Architecture (JB)

    2016053011.png

    Wifi Framework

    传统WiFi

    Android Framework中的wifi代码分为两部分,一部分面向应用开发者,提供 公共接口给应用开发者,另一部分则是框架的实现灵魂,代码分别位于: Android 5.1

    • frameworks\base\wifi\java\android\net\wifi
    • frameworks\opt\net\wifi\service
    • WifiConfigStore

    P2P/Miracast

    • 开启WifiSink的调用序列

      DisplayManager.requestEnableSink DisplayManager.enableSink DisplayManagerGlobal.enableSink DisplayManagerService.enableSink DisplayManagerService.enableSinkInternal WifiDisplayAdapter.requestEnableSinkLocked WifiDisplayController.requestEnableSink

      WifiDisplaySinkActivity WfdSinkSurfaceFragment WfdSinkExt.setupWfdSinkConnection WfdSinkExt.setWfdMode(true) WifiDisplayAdapter.requestEnableSinkLocked … WifiDisplayController.startWaitConnection WifiDisplayController.enterSinkState

    Global Settings

    设置和访问一个全局变量。

    Settings.java

    //frameworks/base/core/java/android/provider/Settings.java
    public final class Settings {
        public static final String WIFI_AUTO_CONNECT = "wifi_auto_connect";
        ...
        MOVED_TO_GLOBAL.add(Settings.Global.WIFI_AUTO_CONNECT);
    }
    

    defaults.xml

    <!-- /packages/SettingsProvider/res/values/defaults.xml -->
    <integer name="def_wifi_auto_connect">0</integer>
    

    DatabaseHelper.java

    public class DatabaseHelper extends SQLiteOpenHelper {
        ...
        loadIntegerSetting(stmt, Settings.Global.WIFI_AUTO_CONNECT,
                           R.integer.def_wifi_auto_connect);
    
        ...
    }
    

    访问

    //读取
    Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.WIFI_AUTO_CONNECT);
    //写入
    Settings.Global.putInt(getContentResolver(), Settings.Global.WIFI_AUTO_CONNECT, 0);
    展开全文
  • Android系统四层体系结构详解

    万次阅读 多人点赞 2016-07-01 16:07:43
    Android会同一系列核心应用程序包一起发布,该应用程序包包括客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。 什么?这你已经知道了。那么你知道这些应用...

    开门见山,先上图
    Android系统架构图
    很明显四层:接下来一一讲解:

    Java应用程序层:

    Android会同一系列核心应用程序包一起发布,包括客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言调用应用程序框架层的接口编写的,显然你自己也可以使用Java通过JNI(Java Native Interface)的方式,配合Android NDK来开发原生程序(Android Studio里面可直接下载集成NDK。我的另外一篇博客里面有实例)。它允许Java代码和其他语言写的代码(通常为 C和C++ ,形成的代码称为本地代码)进行交互.使用Java与本地已编译的代码交互,通常会丧失平台可移植性.但有些情况下这样做是可以接受的,甚至是必须的。

    Java应用程序框架层

    这一层刚刚已经提到了一下,他其实就是隐藏在每个应用后面的是一系列的服务和系统。
    应用框架层为应用开发者提供了用以访问核心功能的API框架及各种服务和管理工具,包括界面管理、数据访问、应用层的消息传递、应用包的管理、电话管理、定位管理等功能。
    它主要包括以下几部分:
    丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(Lists),网格(Grids),文本框(Text boxes),按钮(Buttons), 甚至可嵌入的web浏览器。
    内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据。
    资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件。
    通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。
    活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。

    Android系统提供给应用开发者的本身就是一个框架,所有的应用开发都须遵守该框架的原则。我们在开发应用时就是在这个框架上进行扩展。Android应用框架功能如下。
    *android.app:提供高层的程序模型和基本的运行环境。
    android.content:包含对各种设备上的数据进行访问和发布。
    android.database:通过内容提供者浏览和操作数据库。
    android.graphics:底层图形库,包含画布、颜色过滤、点、矩形。可直接绘制到屏幕上。 android.location:定位和相关服务的类。
    android.media:提供一些类管理多种音频、视频的媒体接口。
    android.net:提供帮助网络访问的类,超过通常的java.net.接口。
    android.os:提供了系统服务、消息传输和IPC机制。
    android.opengl:提供OpenGL的工具。
    android.provider:提供访问Android内容提供者的类。
    android.telephony:提供与拨打电话相关的API交互。
    android.view:提供基础的用户界面接口框架。
    android.util:涉及工具性的方法,例如时间日期的操作。
    android.webkit:默认浏览器操作接口。
    android.widget:包含各种UI元素(大部分是可见的)在应用程序的布局中。

    C、C++本地库和Android运行时环境

    开发者可在自己的应用中使用C、C++本地库中的接口来方便地实现官方API未实现的功能 。例如,Facebook提供了一个开源的Java库,开发者可在自己的应用中嵌入Facebook的部分社交功能, 第三方类库独立于 Android系统架构实现,但与系统架构处于相同的地位,都是使用内核层来提供服务,实现、封装功能模块,供应用层调用。
    Android C/C++库通过Android应用程序框架为开发者提供服务。以下是一些核心库:
    系统 C 库 - 一个从BSD (Berkeley Software Distribution,伯克利软件套件),Unix的衍生系统继承来的标准C系统函数库 Libc ), 它是专门为基于Embedded linux的设备定制的。

    媒体库 - 基于PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

    Surface Manager - 管理显示子系统,并为多个应用程序提供2D和3D图层的无缝融合。

    LibWebCore - web浏览器引擎,支持Android浏览器和一个可嵌入的web视图。

    Android运行时环境( Android Runtime)提供了核心链接库和 Dalvik VM虚拟系统,采用 Java开发的应用程序编译成apk程序代码后,交给 Android操作环境来执行。
    Android采用 Dalvik VM来代替 Java VM,将写好的 Java程序“.java”先编译成“.class”程序,这个过程和开发 Java SE是相同的;接下来再次编译成可以在 Dalvik VM执行的“.dex”程序,最后包装成 Android可执行“.apk”文件
    每个Android 应用都运行在自己的进程上, Dalvik 虚拟机为它分配自有的实例。 Dalvik 使一台设备能运行多个虚拟机程序但消耗较少的资源。

    Linux内核与驱动层

    Android是基于不同版本的 Linux内核开发出来的, Linux内核层包括系统层安全机制、内存管理、进程管理、网络堆栈及一系列的驱动模块,位于硬件与其他的软件层之间,提供与硬件的交互.
    Android 内核与标准 Linux 内核在文件系统、进程间通信机制、内存管理等方面存在不同:
    Android内核中增加了标准 Linux 内核中没有采纳的 YAFFS2文件系统。 YAFFS2 ( Yet Another Flash File Sy-stem,2nd edition ) 是专用于 Flash 的文件系统, 对 NAND-Flash 芯片有着良好的支持。 YAFFS2 是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外断电对文件系统一致性和完整性的影响。
    Android 增加了一种进程间的通信机制 IPC Binder , 在内核源代码中, 驱动程序文件为 coredroid/include/linux/binder.h 和 coredroid/drivers/android/binder.c 。 Binder 通过守护进程 Service Manager 管理系统中的服务,负责进程间的数据交换。 各进程通过 Binder 访问同一块共享内存,以达到数据通信的机制。
    在标准 Linux内核当中,使用一种叫做 OOM( Out of Memory) 的低内存管理策略;当内存不足时,系统检查所有的进程,并对进程进行限制评分, 获得最高分的进程将被关闭(内核进程除外)。 Android 系统采用的则是一种叫作LMK ( Low Memory Killer )的机制,这种机制将进程按照重要性进行分级、分组。内存不足时,将处于最低级别组的进程关闭。 例如,在移动设备当中, UI 界面处于最高级别,所以该进程永远不会被中止,这样,在终端用户看来,系统是稳定运行的。LMK 内核源码->coredroid/drivers/misc/lowme -morykiller.c

    Android Linux内核核心驱动主要包括:

    Android Binder,基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通讯(IPC,inter-process communication)。Android中每个应用都是一个独立的系统进程,而资源的管理和分配是以进程为单位进行的,通常情况下一个进程不能直接访问另一个进程的资源.为了实现进程通信, Android系统引入了 Binder机制.这种通信基于 Client/Server模型,通信的双方都必须创建一个 IBinder接口,进行通信时, Client首先通过系统的 ServiceManager获取目标 Service的代理对象,并通过这个代理对象调用Service提供的功能接口,调用请求会通过 Binder驱动发送给Service,而Service的处理结果也会通过 Binder驱动发送给 Client。
    源代码位于drivers/staging/android/binder.c

    Android电源管理(PM),一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备做了很多优化。
    ####源代码位于kernel/power/earlysuspend.c
    kernel/power/consoleearlysuspend.c
    kernel/power/fbearlysuspend.c
    kernel/power/wakelock.c
    kernel/power/userwakelock.c

    低内存管理器(Low Memory Killer),相对于Linux标准OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程来释放需要的内存。
    源代码位于drivers/staging/android/lowmemorykiller.c

    匿名共享内存(ashmem),为进程间提供共享内存,同时为内核提供回收和管理这个内存的机制。
    源代码位于mm/ashmem.c

    Android PMEM,PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。
    源代码位于drivers/misc/pmem.c

    Android Logger,一个轻量级的日志设备,用于抓取Android系统的各种日志。
    源代码位于drivers/staging/android/logger.c

    Android Alarm,提供了一个定时器用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的时钟基准,
    源代码位于drivers/rtc/alarm.c

    USB Gadget Driver,一个基于标准Linux USB gadget驱动框架的设备驱动。
    源代码位于drivers/usb/gadget/

    Android Ram Console,为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。
    源代码位于drivers/staging/android/ram_console.c。

    Android Timed Device,提供了对设备进行定时控制功能,目前支持vibrator和LED设备。
    源代码位于drivers/staging/android/timed_output.c(timed_gpio.c)。

    Yaffs2 File System,Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2使用更小的内存来保存他的运行状态;Yaffs2的垃圾回收简单快速,因此能达到更好的性能;Yaffs2非常适合大容量的Flash存储。

    参考资料:
    【1】张玉清, 王凯, 杨欢, 方喆君, 王志强, 曹, 琛. Android安全综述[J]. 计算机研究与发展, 2014, (7): 1385-1396
    【2】陈璟, 陈平华, 李文亮. Android 内核分析[J]. 现代计算机(专业版), 2009, (11): 112-115
    【3】http://www.cnblogs.com/leaven/archive/2010/01/10/1643429.html

    展开全文
  • Android系统架构概述PPT

    千次下载 热门讨论 2013-10-23 01:18:24
    Android系统 = Linux内核 + Android运行时。 Android系统使用的Linux内核包含了一些专用驱动,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,这些Android专用驱动构成了Android运行时的基石。...
  • 在开始研究Android系统之前,我们要准备好一些开发的资料,比如Ubuntu,源码,开发资料等,Android系统本身来说,非常的庞大,应用使用的是JAVA语言,底层使用C/C++,所以,如果条件允许的话,尽可能的多掌握一些吧...

    《深入解析Android5.0系统》 一书笔记

    在开始研究Android系统之前,我们要准备好一些开发的资料,比如Ubuntu,源码,开发资料等,Android系统本身来说,非常的庞大,应用使用的是JAVA语言,底层使用C/C++,所以,如果条件允许的话,尽可能的多掌握一些吧。

    一.Ubuntu

    我们更多的可能会选择 Window + Ubuntu 来进行工作,所以我们会比较依赖虚拟机,在我之前的博客中已经有介绍了,这里不会重复介绍

    Android源码浅析(一)——VMware Workstation Pro和Ubuntu Kylin 16.04 LTS安装配置

    Android源码浅析(二)——Ubuntu Root,Git,VMware Tools,安装输入法,主题美化,Dock,安装JDK和配置环境

    Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机

    Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(五)——关于定制系统,如何给你的Android应用系统签名

    Android源码浅析(六)——SecureCRT远程连接Linux,配置端点和字节码

    这里我选择的是最新的Ubuntu 17.10.1 算是尝尝鲜吧。

    紧接着,我们需要安装一些必要的工具,比如git,vim之类的,我们来看下命令

    sudo apt-get install git
    
    sudo apt-get install vim
    
    sudo apt-get install repo
    
    sudo apt-get install curl
    
    sudo apt-get install make
    

    到这里,我们的准备工作算是可以了,我们现在需要准备一些开发工具

    二.开发工具

    我们需要安装一下便利于我们开发的东西,比如JDK

    1.JDK

    我这里安装的是JDK1.7,在哪里下载的话,自己官网或者其他地方随便搜索以下就出来了

    //解压
    sudo tar zxvf jdk-7u79-linux-x64.tar.gz 
    //移动
    sudo mv jdk1.7.0_79 /usr/lib/jdk/
    //配置
    vim ~/.bashrc
    //末尾处
    export JAVA_HOME=/usr/lib/jdk/jdk1.7.0_79
    export JRE_HOME=${JAVA_HOME}/jre   
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib   
    export PATH=${JAVA_HOME}/bin:$PATH   
    

    2.OpenJDK

    sudo add-apt-repository ppa:openjdk-r/ppa  
    sudo apt-get update   
    sudo apt-get install openjdk-7-jdk
    

    3.Android Studio/SDK

    Android Studio 中文社区

    下载下来解压,然后自动安装SDK即可,前提是有JDK

    4.Source Insight

    Source Insight

    Source Insight是个神器,可以很方便的搜索,查找源码中的内容

    三.下载源码

    PS:参考 Google 教程 https://source.android.com/source/downloading.html, 将 https://android.googlesource.com/ 全部使用 https://aosp.tuna.tsinghua.edu.cn/ 代替即可。

    在国内想要下载一份源码,实际上并不是那么容易的….

    这里我们通过清华大学的源去下载

    清华大学开源软件镜像站

    1.下载repo

    mkdir ~/bin
    PATH=~/bin:$PATH
    curl https://aosp.tuna.tsinghua.edu.cn/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
    

    这里写图片描述

    这里的代码应该很好理解吧,创建一个bin的文件夹来指定这个文件夹是PATH,然后去下载repo,并且给予权限

    2.同步源码

    mkdir Aosp
    cd Aosp
    //repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
    //指定版本
    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.0.0_r1
    repo sync

    正常来讲,我们上面的命令,是创建一个Aosp的文件夹然后init初始化后直接去同步代码的,但是我们实际操作过程中,会碰到几个小问题

    • a.repo sync 没有反应

    这个可能是最开始curl repo的时候repo有问题,我们可以进入bin目录下

    vim repo

    看下你的repo脚本里有没有内容,如果没有的话,需要参考

    git-repo帮助

    按照上面的提示,首先在你的bin目录下

    //删除原先的无用repo
    rm -rf repo
    curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
    chmod +x repo
    
    • b.无法连接源

    这里要注意下,repo的运行过程中会尝试访问官方的git源更新自己

    这里写图片描述

    如果想使用tuna的镜像源进行更新,可以将如下内容复制到你的~/.bashrc里

    export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

    注意重启或者刷新终端,这样我们就可以继续init了

    这里写图片描述

    到这里,我们就可以repo sync 来同步这份源码了。

    在这里说一下,就是在sync过程中碰到的一些错误

    这里写图片描述

    这个错误:

    error: Exited sync due to fetch errors
    

    可以参考 When running repo sync error: Exited sync due to fetch errors

    输入

    repo sync -f -j8
    

    即可解决

    碰到的第二个问题

    RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function

    这里写图片描述

    这是由于git默认缓存大小不足导致的,使用下面的命令增加缓存大小

    git config --global http.postBuffer 2000000000

    碰到的第三个问题

    Cannot fetch platform/packages/apps/OMA-DM

    这里写图片描述

    据说很多人下载Android5.0的源码的时候都碰到了这个问题

    我的解决是

    这里写图片描述

    在进入 .repo目录下的xml配置文件中注释掉这一行

    这里写图片描述

    终于,漫长的N个小时过去了,这份5.0的AOSP源码也下载下来了,不过我们还需要去下载一样东西,那就是kernel

    四.下载Kernel

    内核我们需要单独的去下载,并且每个厂家的都不一样,所以都会有些差异的,具体可参考这篇博客:

    不翻墙下载Android内核源码

    我使用的是google 自己手机的tegra的内核

    cd device/asus/grouper/
    //查看记录
    git log kernel
    git clone https://aosp.tuna.tsinghua.edu.cn/kernel/tegra.git
    cd tegra/
    git checkout 5d8ecd2
    

    五.源码编译

    事实上编译才是重头戏,因为很多问题都会出现,我们需要一步步的来排查,首先我们来看下编译源码的步骤

    source build/envsetup.sh
    //选择编译目标版本
    lunch
    //多线程编译
    make -j8
    

    这里我选择的是aosp_x86-eng

    这里写图片描述

    但是在编译过程中,会出现很多问题,我这里并没有去编译,因为我只是去看源码,主要还是一个个去解,再写出来很麻烦,所以我想下次编译的时候专门写一篇。

    本篇文章先写到这里,下篇我们来学习下Build环境

    PS:有兴趣的朋友可以加群讨论下:484167109

    展开全文
  • Android 将自己的应用改为系统应用

    万次阅读 多人点赞 2016-11-30 16:19:11
    所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定、减少内存(DATA)空间占用、恢复出厂设置后不会消失、修改系统时间、调用隐藏方法、系统关机重启、静默安装升级卸载应用等等等等优点,想...
  • Android系统移植:驱动篇

    万次阅读 多人点赞 2017-05-24 15:05:23
    【导语】在Android系统移植中,有很重要的一个部分工作,就是为新平台上的硬件设备移植驱动程序。因为Android系统是基于Linux kernel内核构建,所以这里说的移植驱动程序,其实就是基于Android系统平台开发适应移动...
  • 如何学习Android系统源码

    千次阅读 2018-05-22 12:16:37
    Android系统的源代码非常庞大和复杂,我们不能贸然进入,否则很容易在里面迷入方向,进而失去研究它的信心。我们应该在分析它的源代码之前学习好一些理论知识,下面就介绍一些与Android系统相关的资料。 我们知道,...
  • 理解Android系统(一)

    千次阅读 2015-01-06 18:16:49
    理解Android系统 Android 是业界流行的开源移动平台,受到广泛关注并为多个手机制造商作为手机的操作系统平台。由于它的开放性,市面上又出现了它的很多改良定制版本。且广泛的应用在手机、汽车、电脑等领域。因此...
  • 2019的最佳Android系统 | 运行在台式机、笔记本手提电脑的安卓Android系统 适用于PC 2019的最佳Android操作系统 2019年3月1日团队技术探索Android 您是否知道,即使有几个升级版本,如Windows 10和10.1,即使这样...
  • Android系统架构与系统源码目录

    万次阅读 多人点赞 2017-01-23 18:09:56
    技术博客终于可以恢复正常的更新速度了,原因是我编写的进阶书籍的初稿已经完成,窃以为它将会是Android应用书籍中最有深度的一本,可以说是《Android开发艺术探索》的姊妹篇。在这本书的最后一章我会分析Android...
  • Android系统截屏功能提取Demo

    千次下载 热门讨论 2014-09-15 21:34:58
    Android系统截屏功能提取的演示代码,文章在这里http://blog.csdn.net/xu_fu/article/details/39268771
  • Android系统固件定制方式

    千次阅读 2019-05-28 08:46:07
    一般情况下,一款基于Android的设备,会根据需求定制系统APP,定制的规格往往需要依据设备的具体应用场景。比如,面向通信的设备,那么需要预装phone、tablets、browser、TeleCom等APP或者服务;而面向可穿戴的设备...
  • 自己动手刷原生android系统

    万次阅读 2016-08-28 20:04:22
    刷机呢,以前,1~2年之前,基本上用这大师,那助手什么的刷,一来图个方便,二来,似乎那时候从刷机软件刷进去的系统,有真正的原生android系统,或者,即使是被修改过的,绑进去的软件也还凑活,采用的欺骗手段...
  • Android系统架构原理

    千次阅读 2018-02-09 20:45:52
    1. 应用程序层:最上面就是应用层。与用户打交道的应用程序。2.应用程序框架层:再上是把类库定义成接口供上层调用,2到3是通过JNI。Activity Manager(活动管理器):管理各个应用程序生命周期以及通常的导航回退...
  • Android系统介绍与框架

    万次阅读 2013-07-24 23:30:24
    Android系统是Google开发的一款开源移动OS,Android中文名被国内用户俗称“安卓”。Android操作系统基于Linux内核设计,使用了Google公司自己开发的Dalvik Java虚拟机。Android操作系统已经成为全球最大的智能手机...
  • Android系统简介

    千次阅读 2011-09-18 08:40:49
    中文名:安卓(官方) 安致 (非官方)安智(非官方)注:Google2005年8月17日收购美国Android公司得到手机巨头摩托罗拉的支持,摩托罗拉2010年放弃其他的操作系统(包括自家的Linux和UIQ)只支持AndroidAndroid的...
  • Android系统启动流程

    千次阅读 2019-02-12 17:35:34
    在此说明,此文章只是个人的一个关于“Android系统启动流程”的一个总结,没什么源码。 Android系统启动流程: 1、启动电源以及系统启动: 当电源键按下时引导芯片代码从预定义的地方(固化在ROM)开始执行。加载...
  • 深入浅出 - Android系统移植与平台开发(一)

    万次阅读 多人点赞 2013-05-17 16:25:44
    写在前面的 这是我最近两年的Android开发的经验总结,断断续续的写了几个月了,欢迎大家砖头,有不对的地方,或需要改进的地方,请指出来,先贴出来目录来看看。第一章、 概述... 51.1 Android 操作系统介绍.... ...
1 2 3 4 5 ... 20
收藏数 819,408
精华内容 327,763
关键字:

android系统