Android Framework入门介绍

framework概述

Android简介

      Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。20058月由Google收购注资。200711月,Google84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良 Android系统,随后GoogleApache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008 10,随后,Android逐渐扩展到平板电脑及其他领域上,如电视数码相机游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%

     开发者能使用Android SDK为Android platform开发应用,这些应用使用JAVA语言书写,运行在虚拟机(一个专为手机程序开发的基于linux内核的JAVA虚拟机)上。 

Android架构


        Android架构主要分为分为四部分,从下往上以此为LINUX KERNEL(内核层),LIBRARIES(共享库,以及android运行时库),APPLICATION FRAMEWORK(应用框架层),APPLICATION(应用程序)。而本文主要分析就是APPLICATION FRAMEWORK(应用框架层)。

  APPLICATION

      主要为系统中的应用,如桌面,闹铃,设置,日历,电话,短信等系统应用。

  APPLICATION FRAMEWORK

      Android的应用程序框架为应用程序层的开发者提供APIs,它实际上是一个应用程序的框架。由于上层的应用程序是以JAVA构建的,因此本层次提供了以下服务:

i. 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器;

ii. 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据;

iii. 资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件( layout files );

iv. 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息;

v. 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。

 Android Runtime

      Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

 Libraries

Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:

i. 系统 C 库:一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。

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

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

iv. LibWebCore:一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。

v. SGL:底层的2D图形引擎

vi. 3D libraries:基于OpenGL ES 1.0 APIs实现,该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。

vii. FreeType:位图(bitmap)和矢量(vector)字体显示。

SQLite:一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。

 Linux Kernel

      Android 的核心系统服务依赖于 Linux 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。

framework简介

系统服务

      SystemServer 是framework中非常重要的一个进程,它是在虚拟机启动后运行的第一个java进程,SystemServer启动其他系统服务,这些系统服务都是以一个线程的方式存在于SystemServer进程中。 

a) EntropyService 提供伪随机数

b) PowerManagerService 电源管理服务

c) ActivityManagerService 最核心的服务之一,管理Activity

d) TelephonyRegistry 通过该服务注册电话模块的事件响应,比如重启、关闭、启动等

e) PackageManagerService 程序包管理服务

f) AccountManagerService 账户管理服务,是指联系人账户,而不是Linux系统的账户 

g) ContentService ContentProvider服务,提供跨进程数据交换

h) BatteryService 电池管理服务

i) LightsService 自然光强度感应传感器服务

j) VibratorService 震动器服务 

k) AlarmManagerService 定时器管理服务,提供定时提醒服务

l) WindowManagerService Framework最核心的服务之一,负责窗口管理

m) BluetoothService 蓝牙服务

n) DevicePolicyManagerService 提供一些系统级别的设置及属性

o) StatusBarManagerService 状态栏管理服务

p) ClipboardService 系统剪切板服务

q) InputMethodManagerService 输入法管理服务

r) NetStatService 网络状态服务

s) NetworkManagementService 网络管理服务

t) ConnectivityService 网络连接管理服务

u) AccessibilityManagerService 辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果

v) MountService 挂载服务,可通过该服务调用Linux层面的mount程序

w) NotificationManagerService 通知栏管理服务,Android中的通知栏和状态栏在一起,只是界面上前者在左边,后者在右边

x) DeviceStorageMonitorService 磁盘空间状态检测服务

y) LocationManagerService 地理位置服务

z) SearchManagerService 搜索管理服务

aa) DropBoxManagerService 通过该服务访问Linux层面的Dropbox程序

ab) WallpaperManagerService 墙纸管理服务,墙纸不等同于桌面背景,在View系统内部,墙纸可以作为任何窗口的背景 

ac) AudioService 音频管理服务

ad) BackupManagerService 系统备份服务

ae) AppWidgetService         Widget服务

af) RecognitionManagerService 身份识别服务

ag) DiskStatsService 磁盘统计服务

核心服务介绍

a) ActivityManagerService

ActivityManagerService(以下简称:AMS)是android系统的一个系统服务,是应用进程的管理服务端,直接的控制了应用程序的各个行为,保证了系统中不同的应用程序之间能够和谐的合理的进行调度运行。

AMS是android上层系统最核心的模块之一,其主要的工作是对所有的应用进程及其进程中的四大组件进行管理。(当然这里面也涉及了一些window、电源、权限等内容)

对进程的管理包括:进程的创建与销毁、进程的优先级调整。

对组件的管理包括:Activity的调度管理、Service的管理、Broadcast的分发、以及ContentProvider管理。

                             

b) WindowManagerService

对系统中所有窗口进行管理;动画处理 ;Input分发、处理;Display管理(多屏显示) 。

c) Android Graphics系统

                  

a) Surfaceflinger

负责Layer合成(composer);创建surface;管理surface。

b) PackageManagerService

负责Package的管理,应用程序的安装 、卸载、信息查询等。

                                     

c) Input系统

android的输入系统主要完成键盘、触屏、鼠标等输入设备的事件输入及向焦点窗口和焦点视图的事件派发,插入,过滤,拦截等功能。

android支持的输入设备主要有:键盘、鼠标、触摸屏、轨迹球、游戏摇杆/手柄、绘图板。


Framework的范围

Framework负责APPLICATION FRAMEWORKANDROID RUNTIMELIBRARIES三部分。

a) 系统ManagerService相关内容

b) 系统接口和jni相关内容

c) 系统功能相关内容(watchdogvoldbinder等)

d) 虚拟机dalvikart

e) 系统so库相关内容

f) CTSGTS等预分析

g) Monkey预分析

h) 系统稳定性问题(系统ANR、冻屏、重启、蓝屏等)

i) 系统性能问题

framework基础

语言基础:JavaC++C

技术基础:进程间通信,多线程,jnilinux相关知识,binder

Linux入门介绍

    由于在进行framework工作时,代码的下载和管理主要在Ubuntu下面进行比较方便,所以在搞framework之前需要对linux系统有所了解,会使用一些常用命令。linux是基于 shell命令行操作,shell是系统的一个工具。用户直接面对的不是计算机硬件而是shell,用户想操作计算机硬件,需先把指令告诉shell,shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。


启动shell界面,快捷键Ctrl+Atl+t或者可以点击桌面左上角的图标进行搜索“终端”如下图,点击终端就可以出现shell终端。


      当启动一个shell时,默认目录为/home/username/:可以使用pwd来查看当前的目录。


      当系统第一次启动,且能连上internet,先更新系统的软件库信息,使用命令sudo apt-get update,sudo为使用管理员权限,第一次执行时需要输入系统的开机密码,之后五分钟内不需要输入密码,过了五分钟需要再次输入密码。


    等更新完成后,就可以开始安装软件了,例:安装git,可以sudo apt-get install git进行安装,非常简便。install是安装系统中存在安装包的软件。


如果我们从网上下载一个deb的软件包sudo dpkg -i .deb软件包


命令:sudo dpkg -i xxx.deb,安装xxx软件包与apt-get install 安装方式的区别:

dpkg方式
apt-get install方式
手动下载deb软件包 自动下载deb软件包
手动指定软件包下载路径 自动下载到/var/cache/apt/archive/下
手动执行sudo dpkg -i xxx.deb安装 自动执行dpkg安装命令
一般在做framework开发时都会有一个代码服务器专门放置一些系统源码,而该服务器是没有显示器的,我们只能远程登录到服务器上进行查看代码,这时就需要安装远程终端访问软件:ssh

安装方法:sudo apt-get install openssh-server

用法:ssh username@ip


当我们想从服务器copy文件到我们本地,我们可以使用scp命令:scp username@ip:/文件位置,

或者scp -r username@ip:/文件夹位置,就可以轻松复制文件,同理也可以将本地文件copy到服务器。


LINUX常用命令请查看博客(Linux常用命令

Android代码管理

代码结构

      framework开发工作方式与应用开发的工作方式是完全不同的,framework开发是基于Android源代码进行的开发,版本管理主要使用:git,repo两种工具。如果想要学习framework开发,必须需要下载一套Android源码。官方下载地址【参考、需翻墙】: https://source.android.com/source/downloading.html,具体的下载编译调试代码的方式可以参考老罗的博客视频,讲解的非常清楚,附上地址(http://0xcc0xcd.com/p/index.php),感谢老罗。

    当下载完成代码后首先了解一下Android源代码的结构:

├── bionic    android上实现的libc库
├── bootable  存放可启动项,如recovery、bootloader等
├── build     android编译系统所用到的make文件及其它工具
├── cts       android兼容性测试
├── dalvik    dalvik虚拟机
├── development  与开发相关的一些东西
├── device    存放需要适配的设备信息
├── external  第三方库
├── frameworks  framework部分
├── hardware  硬件相关代码
├── kernel    kernel相关代码
├── libcore   android上实现的Java基础库
├── Makefile
├── ndk
├── out       编译输出目录
├── packages  包含系统应用、壁纸应用、内容提供者、输入法等
├── prebuilt  预编译好的工具
├── sdk       sdk相关内容
├── system    操作系统层次的一些可执行程序和配置文件
├── u-boot    用于引导linux启动的u-boot
└── vendor    存放与厂商相关的信息,也可粗放需要适配的设备信息

而framework开发主要要了解的就是frameworks下面的内容。

代码编译

当把代码下载完毕后需要对源代码整体进行编译,具体方法如下:

1.source build/envsetup.sh
  读取各个board的vendorsetup.sh
2.lunch
   去选择要编译的对象

3.完整系统编译,输出到out/target/product/<device>/...

      make -j4(j4为使用四个线程同时编译)

4.如果要单编某个模块,就是用如下命令来编译需要的模块。

   编译bootloader,
      make bootloader
   编译kernel生成boot.img,
      make bootimage
   编译system生成system.img,
      make systemimage
   编译userdata生成userdata.img,
      make userdataimage
   编译recovery生成recovery.img,

      make recoveryimage

当编译好对应的image后,可以使用fastboot将image烧到手机里面:

如何进入fastboot:
   开机状态下执行adb reboot bootloader
   关机状态组合键:home+power
1.检查连接设备
     Fastboot devices
2.烧写system.img
   Fastboot flash system system.img
3.烧写boot.img(recovery)
   fastboot flash boot boot.img(recovery.img)
4.烧写bootloader

    Fastboot flash 2ndbl u-boot.bin

常用工具以及调试方法

详细参考Framework工具及调试方法

Android启动流程分析

      根据上文分析Android分为四个层次,而系统如何从长按power开机进入系统桌面的呢,系统都进过了哪些流程,framework从中起到了什么的作用,请参考之前的Android启动流程系列文章

猜你喜欢

转载自blog.csdn.net/fu_kevin0606/article/details/79532710