大虾们的 android 浅谈

来源:互联网 发布:苹果mac办公软件 编辑:程序博客网 时间:2024/04/27 17:07
 
们将会针对Android根文件系统的相关目录结构等方面的问题进行一个详细的讲解,以帮助大家快速掌握这方面的知识。

  我们曾经在一篇文章中为大家详细介绍过Android文件系的一些基本概念,相信大家已经可以充分了解这一知识点了。在这里大家将会继续对Android根文件系统的基本概念进行一个初步的掌握。

  经过这几天在网上搜索关于Android根文件系统的相关资料,发现已经有很多高手 分析了Android的文件系统,这些高手多从不同的方面分析了其文件系统的结构和运行原理。我这里就写一下自己的理解。

  首先是Android根文件系统目录的结构:




sqlite_stmt_journals :一个根目录下的tmpfs文件系统,用于存放临时文件数据。
cache : 是缓存临时文件夹,据说是除了T-mobile的OTA更新外,别无用处。
sdcard :是SD卡 中的FAT32文件系统挂载的目录
etc :指向 /system/etc ,众所周知的配置文件存放目录
system :是Android根文件系统中一个很重要的目录,系统中的大部分东西都在这里了,以下是目录结构:




  sys :用于挂载 sysfs文件系统。 在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象的反应到用户空间中.用户空间可以修改sysfs中的文件属性来修改设备的属性值
  sbin : 只放了一个用于调试的adbd程序 。
  proc :/proc 文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。
  data :存放用户安装的软件 以及各种数据。
  root :什么都没有。
  dev :不用多说了,设备节点文件的存放地。
  以上就是对Android根文件系统的相关介绍。
附件: 你需要登录才可以下载或查看附件。没有帐号?免费加入
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0收藏收藏3好评好评1差评差评0
曾以为付出就会有收获,却发现现实并非那么简单
 

使用道具 举报

  • 提升卡
  • 置顶卡
  • 沉默卡
  • 喧嚣卡
  • 变色卡
  • 显身卡
  
zza19870308
zza19870308当前离线
最后登录
2010-10-28
注册时间
2010-10-18
阅读权限
30
在线时间
9 小时
查看详细资料 IP卡 狗仔卡

励精图治 Ⅳ

Rank: 3Rank: 3

励精图治 Ⅳ, 积分 456, 距离下一级还需 244 积分
UID
99809
精华
0
帖子
99
e望
0 点
e币
348 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
2#
发表于 2010-10-25 15:25:18 |只看该作者
Android文件系统深入剖析
Android文件系统具有什么样的结构?我们如何才能将这一文件系统分离出来?又能以何种方式挂载文件系统呢?这些问题都会在文中找到具体的解决答案。


  用过Linux的朋友可能对开源的系统有一个非常好的印象。那么在日益成熟的手机操作系统中,有没有一款像Linux一样的开源系统呢?谷歌公司就退出了一款基于Linux平台的Android 操作系统来满足人们的需求。在这里大家可以先来了解一下Android文件系统的相关内容。
  1、Android文件系统的结构
  Android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。因此,我们可以把ramdisk.img里的所有文件复制出来,system.img和userdata.img分别解压到 ramdisk文件系统中的system和 userdata目录下。
  2、分离Android文件系统出来
  system.img,ramdisk.img,userdata.img映像文件是采用cpio打包、gzip压缩的,可以通过file命令验证:




输出:



Android源码编译后除了生成system.img,userdata.img之外还生成system和 userdata文件夹,因此不需要解压它们。Android源码编译后还生成root文件夹,其实root下的文件与 ramdisk.img 里的文件是一样的,不过这里还是介绍怎样把 ramdisk.img解压出来:
将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令



然后新建一个文件夹,叫ramdisk吧,进入,输入命令



这下,你就能看见并操作ramdisk里面的内容了。

然后把Android源码编译后生成的system和 userdata里的文件复制到 ramdisk/system和 ramdisk/userdata下。这样就得到一个文件系统了。
3、使用网络文件系统方式挂载Android文件系统
因此,我们需要建立/nfsroot目录,再建立/nfsroot/Androidfs目录,把刚才的Android文件系统改名为Androidfs,并链接到/nfsroot/Androidfs
4、Android文件系统内核引导文件系统
Android内核挂载/nfsroot/Androidfs之后,根据init.rc,init.goldfish.rc来初始化并装载系统库、程序等直到开机完成。init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是:
1)设置一些环境变量
2)创建system、sdcard、data、cache等目录
3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals
4)设置一些文件的用户群组、权限
5)设置一些线程参数
6)设置TCP缓存大小
附件: 你需要登录才可以下载或查看附件。没有帐号?免费加入
曾以为付出就会有收获,却发现现实并非那么简单
 

使用道具 举报

  • 显身卡
  
zza19870308
zza19870308当前离线
最后登录
2010-10-28
注册时间
2010-10-18
阅读权限
30
在线时间
9 小时
查看详细资料 IP卡 狗仔卡

励精图治 Ⅳ

Rank: 3Rank: 3

励精图治 Ⅳ, 积分 456, 距离下一级还需 244 积分
UID
99809
精华
0
帖子
99
e望
0 点
e币
348 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
3#
发表于 2010-10-25 15:46:31 |只看该作者
回复 2# zza19870308

Android判断网络状态方法详解
我们在这篇文章中将会通过一段代码的解读来详细分析Android判断网络状态的应用技巧,以帮助大家判断网络的连接状态。


  Android 判断网络状态这一应用技巧在实际应中是比较重要的。那么,在Android操作系统中,如何能够正确的判断我们所连接的网络是否断开恩?今天我们就针对这一应用技巧进行一个详细的分析。



Android判断网络状态的具体应用方法就为大家介绍到这里。
附件: 你需要登录才可以下载或查看附件。没有帐号?免费加入
曾以为付出就会有收获,却发现现实并非那么简单
 

使用道具 举报

  • 显身卡
  
zza19870308
zza19870308当前离线
最后登录
2010-10-28
注册时间
2010-10-18
阅读权限
30
在线时间
9 小时
查看详细资料 IP卡 狗仔卡

励精图治 Ⅳ

Rank: 3Rank: 3

励精图治 Ⅳ, 积分 456, 距离下一级还需 244 积分
UID
99809
精华
0
帖子
99
e望
0 点
e币
348 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
4#
发表于 2010-10-25 15:49:53 |只看该作者
回复 3# zza19870308

Android核心模块内容概述
我们在这里为大家总结的Android核心模块都包括有:操作系统层(OS);各种库(Libraries)和Android 运行环境(RunTime);应用程序框架以及应用程序等等。


  51CTO曾经为大家详细介绍过一些Android操作系统中构造快的相关介绍。那么在这里我们会继续为大家介绍一下这方面的相关内容。在这篇文章中将会具体针对Android核心模块的相关概念进行详细介绍。

Android作为一个移动设备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application)。
根据Android的软件框图,其Android核心模块结构自下而上分为以下几个层次:
第一、操作系统层(OS)
第二、各种库(Libraries)和Android 运行环境(RunTime)
第三、应用程序框架(Application Framework)
第四、应用程序(Application)
以下分别介绍Andoid各个层次的软件的重点及其相关技术:
● Android核心模块之操作系统层(OS)
Android使用Linux2.6作为操作系统,Linux2.6是一种标准的技术,Linux也是一个开放的操作系统。Android对操作系统的使用包括核心和驱动程序两部分,Android的Linux核心为标准的Linux2.6内核,Android更多的是需要一些与移动设备相关的驱动程序。主要的驱动如下所示:
显示驱动(Display Driver):常用基于Linux的帧缓冲(Frame Buffer)驱动。
Flash内存驱动(Flash Memory Driver)
照相机驱动(Camera Driver):常用基于Linux的v4l(Video for )驱动。
音频驱动(Audio Driver):常用基于ALSA(Advanced Linux Sound Architecture,高级Linux声音体系)驱动。
WiFi驱动(Camera Driver):基于IEEE 802.11标准的驱动程序
键盘驱动(KeyBoard Driver)
蓝牙驱动(Bluetooth Driver)
Binder IPC驱动: Andoid一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能。
Power Management(能源管理)
● Android核心模块之各种库(Libraries)和Android 运行环境(RunTime)
本层次对应一般嵌入式系统,相当于中间件层次。Android的本层次分成两个部分一个是各种库,另一个是Android 运行环境。本层的内容
大多是使用C++实现的。
在其中,各种库包括:
▅ C库 :C语言的标准库,这也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现。▅ 多媒体框架(MediaFrameword):这部分内容是Android多媒体的核心部分,基于PacketVideo(即PV)的OpenCORE,从功能上本库一共分为两大部分,一个部分是音频、视频的回放(PlayBack),另一部分是则是音视频的纪录(Recorder)。
▅ SGL:2D图像引擎。
▅ SSL:即Secure Socket Layer位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。
▅ OpenGL ES 1.0 :本部分提供了对3D的支持。
▅ 界面管理工具(Surface Management):本部分提供了对管理显示子系统等功能。
▅ SQLite:一个通用的嵌入式数据库
▅ WebKit:网络浏览器的核心
▅ FreeType:位图和矢量字体的功能。
Android 的各种库一般是以系统中间件的形式提供的,它们均有的一个显著特点就是与移动设备的平台的应用密切相关。
Android 运行环境主要指的虚拟机技术——Dalvik。Dalvik虚拟机和一般JAVA虚拟机(Java VM)不同,它执行的不是JAVA标准的字节码(bytecode )而是Dalvik可执行格式(.dex)中执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。 二者最大的区别在于Java VM是以基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。
● Android核心模块之应用程序框架(Application Framework)
Android的应用程序框架为应用程序层的开发者提供APIs,它实际上是一个应用程序的框架。由于上层的应用程序是以JAVA构建的,因此本层次提供的首先包含了UI程序中所需要的各种控件:
例如: Views (视图组件)包括 lists(列表), grids(栅格), text boxes(文本框), buttons(按钮)等。甚至一个嵌入式的Web浏览器。
一个Andoid的应用程序可以利用应用程序框架中的以下几个部分:
Activity (活动)
Broadcast Intent Receiver (广播意图接收者)
Service (服务)
Content Provider (内容提供者)
● Android核心模块之应用程序(Application)
Android的应用程序主要是用户界面(User Interface)方面的,通常以JAVA程序编写,其中还可以包含各种资源文件(放置在res目录中)JAVA程序及相关资源经过编译后,将生成一个APK包。Android本身提供了主屏幕(Home),联系人(Contact),电话(Phone),浏览器(Browers)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。这也是Android开源的巨大潜力的体现。
曾以为付出就会有收获,却发现现实并非那么简单
 

使用道具 举报

  • 显身卡
  
zza19870308
zza19870308当前离线
最后登录
2010-10-28
注册时间
2010-10-18
阅读权限
30
在线时间
9 小时
查看详细资料 IP卡 狗仔卡

励精图治 Ⅳ

Rank: 3Rank: 3

励精图治 Ⅳ, 积分 456, 距离下一级还需 244 积分
UID
99809
精华
0
帖子
99
e望
0 点
e币
348 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
5#
发表于 2010-10-25 15:51:13 |只看该作者
Android系统架构基本模式解析
Android系统架构总共被分为四层,在这里大家就可以通过介绍对这四个层次进行一个深入的解读,以加深大家对这一系统的认识。


  如今,大家面对市场中种类繁多的手机必然挑的眼花缭乱。不过,在智能手机占据主要地位的今天,挑选手机的主要因素就是挑选一款性能高的手机操作系统,Android就是其中的一个必然选择。Android系统架构和其操作系统一样,采用了分层的架构。Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。

Android系统架构之应用程序
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
Android系统架构之应用程序框架
开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和系统, 其中包括;
* 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。
* 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据
* 资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。
* 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。
* 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。
有关更多的细节和怎样从头写一个应用程序,请参考 如何编写一个 Android 应用程序.
Android系统架构之系统运行库
1)程序库
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:
* 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。
* 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
* Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。
* LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。
* SGL - 底层的2D图形引擎
* 3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。
* FreeType -位图(bitmap)和矢量(vector)字体显示。
* SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
2)Android 运行库
Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。
Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
Android系统架构之Linux 内核
Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
曾以为付出就会有收获,却发现现实并非那么简单
 

使用道具 举报

  • 显身卡
  
zza19870308
zza19870308当前离线
最后登录
2010-10-28
注册时间
2010-10-18
阅读权限
30
在线时间
9 小时
查看详细资料 IP卡 狗仔卡

励精图治 Ⅳ

Rank: 3Rank: 3

励精图治 Ⅳ, 积分 456, 距离下一级还需 244 积分
UID
99809
精华
0
帖子
99
e望
0 点
e币
348 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
6#
发表于 2010-10-25 15:52:15 |只看该作者
回复 5# zza19870308

怎样使用Eclipse来开发Android源码
本篇文章讲述如何使用Eclipse来开发Android源码。可以用eclipse来编辑代码、检查错误,在命令行通过make(或mm或mmm)编译android源码,并可以在eclipse上调试android源码程序。


  用eclipse + ADT作为android开发工具,可以说是很方便的,在HelloActivity小程序里我们就感觉到eclipse功能的强大。那么,我们可以用 eclipse来开发android源码吗?如果我们直接把android源码里一个工程导入eclipse,一般来说都会出现错误,说许多类库(包)找不到。
 
  从该文档和实践可以总结出几点:
  1、可以使用eclipse来编辑JAVA程序、检查错误(主要是类库包含和语法方面),但是不能在eclipse上编译运行android源码,还是得在shell中make(或mm或mmm)
  2、android源码文件夹里提供有一些eclipse配置文件,
  .claapath:eclipse工程的配置文件,方便我们直接把android源码相应的文件和JAVA包导入工程
  android-formatting.xml和android.importorder:这个很重要,主要是用来规范我们的编码风格,更容易使我们的代码风格一致
  3、把android源码作为一个工程导入eclipse时,必须注意两点
  1)、新建的工程必须是java project,不能是android project,否则会破坏android源码(一般是多添加文件/文件夹)
  2)、导入前最好检查.classpath里的文件在android源码中是否有相应的文件(文件夹),否则也会破坏android源码(一般是多添加文件/文件夹)
  总的来说:
  1、用eclipse来编辑代码、检查错误
  2、不在eclipse上编译、运行android源码程序,只能在命令行通过make(或mm或mmm)编译android源码
  3、可以在eclipse上调试android源码程序(原理:eclipse通过ddms服务器在emulator上进行调试),并可以单步调试、断点调试。
  下面,从官方文档总结出具体怎样用eclipse来开发android源码
  1、建立基本的android开发环境
  请参考官方文档或
  2、编译android源码
  android源码根目录下通过make进行编译,请注意一些配置,具体可参考
  3、把eclipse工程配置文件复制到android源码根目录下
  cp development/ide/eclipse/.classpath ./
  chmod u+w .classpath # Make the copy writable
  4、修改eclipse程序的配置
  1)、修改eclipse缓存设置
  把eclipse.ini(在eclipse软件的安装目录下)的3个值改为下面的值:
  -Xms128m
  -Xmx512m
  -XX:MaxPermSize=256m
  2)、把android-formatting.xml和android.importorder导入eclipse
  android-formatting.xml、.classpath和android.importorder都放在development/ide/eclipse/下
  android-formatting.xml用来配置eclipse编辑器的代码风格;android.importorder用来配置eclipse的import的顺序和结构。
  在window->preferences->java->Code style->Formatter中导入android-formatting.xml
  在window->preferences->java->Code style->Organize Imports中导入android.importorder
  3)、安装anyedit插件(可选)
  在http://andrei.gmxhome.de/anyedit/下载并导入eclipse中
  5、把android源码作为一个工程导入eclipse
  导入前先检查.classpath里的文件在android源码中是否有相应的文件(文件夹),否则也会破坏android源码(一般是多添加文件/文件夹),.classpath里多余的路径可删除
  新建Java Project(不是android project,否则会破坏android源码),选择从已存在的工程导入,工程名任意,完成。
  导入时,eclipse要build工程,比较慢。导完后,一般都没有错误。
  6、eclipse上调试android里的程序。
  先执行:
  cd android源码目录
  . build/envsetup.sh
  lunch 1 # to build the emulator
  emulator & # you should see a GUI picture of a phone
  ddms & # you should get a splufty debugging console
  然后在eclipse中配置调试类型和端口:
  在Run->Debug Configurations->Remote java application上双击,然后,”Host:”设为localhost,”Port:”设为8700,”Connection Type”为Standard(Socket Attach)
  然后“Apply”
  注意,在点击”Debug”时苦出错,说8700端口被占用,那么把DDMS程序关掉,重新打开DDMS就OK了。如果提供连不到VM错误时,请注意,要先在DDMS中选中某一进程(对应某一应用程序),才能在eclipse执行 Debug。
  在eclipse调试时,可以设断点、单步调试。估计google团队也是这样开发、调试android应用程序的
  7、编译android源码
  执行:
  cd android源码目录
  . build/envsetup.sh
  那么就会多出mm/mmm等命令,mm/mmm用来编译模块(包括C、C++、JAVA程序)。我们也可以直接在 android源码根目录下执行“make 模块名”来编译模块。
曾以为付出就会有收获,却发现现实并非那么简单
 

使用道具 举报

  • 显身卡
  
zza19870308
zza19870308当前离线
最后登录
2010-10-28
注册时间
2010-10-18
阅读权限
30
在线时间
9 小时
查看详细资料 IP卡 狗仔卡

励精图治 Ⅳ

Rank: 3Rank: 3

励精图治 Ⅳ, 积分 456, 距离下一级还需 244 积分
UID
99809
精华
0
帖子
99
e望
0 点
e币
348 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
7#
发表于 2010-10-25 15:58:55 |只看该作者
回复 6# zza19870308

Android电源管理相关应用技巧分享Android电源管理的相关内容对出初学者来说是比较复杂的一个知识点。我们可以通过这篇文章介绍的内容初步的掌握一下这方面的知识。


  对于刚刚接触Android操作系统的朋友来说,他们对这一开源的手机操作系统所带来的功能深深的吸引着。我们在这篇文章中就通过对Android电源管理的相关概念的解读,来对这一系统进行深入的了解。
  接下来我们从Java应用层面, Android framework层面, Linux内核层面分别进行详细的讨论:
  Android电源管理应用层的使用:
  Android提供了现成android.os.PowerManager类,该类用于控制设备的电源状态的切换.
  该类对外有三个接口函数:




Note:
尝试在应用层调用该函数,却不能成功,出现的错误好象是权限不够, 但在Framework下面的Service里调用是可以的.


flags参数说明:




ACQUIRE_CAUSES_WAKEUP: 一旦有请求锁时强制打开Screen和keyboard light
ON_AFTER_RELEASE: 在释放锁时reset activity timer
Note:
如果申请了partial wakelock,那么即使按Power键,系统也不会进Sleep,如Music播放时
如果申请了其它的wakelocks,按Power键,系统还是会进Sleep




Note:
1. 在使用以上函数的应用程序中,必须在其Manifest.xml文件中加入下面的权限:



2. 所有的锁必须成对的使用,如果申请了而没有及时释放会造成系统故障.如申请了partial wakelock,而没有及时释放,那系统就永远进不了Sleep模式.
Android Framework层面:
其主要代码文件如下:



其中PowerManagerService.java是核心, Power.java提供底层的函数接口,与JNI层进行交互, JNI层的代码主要在文件android_os_Power.cpp中,与Linux kernel交互是通过Power.c来实现的, Android电源管理跟Kernel的交互主要是通过sys文件的方式来实现的,具体请参考Kernel层的介绍.
这一层的功能相对比较复杂,比如系统状态的切换,背光的调节及开关,Wake Lock的申请和释放等等,但这一层跟硬件平台无关,而且由Google负责维护,问题相对会少一些,有兴趣的朋友可以自己查看相关的代码.
Kernel层:
其主要代码在下列位置:



其对Kernel提供的接口函数有



提供给Android Framework层的proc文件如下:



Android电源管理主要是通过Wake lock来实现的,在最底层主要是通过如下三个队列来实现其管理:



所有初始化后的lock都会被插入到g_inactive_locks的队列中,而当前活动的partial wake lock都会被插入到g_active_partial_wake_locks队列中, 活动的full wake lock被插入到g_active_full_wake_locks队列中, 所有的partial wake lock 和full wake lock在过期后或unlock后都会被移到inactive的队列,等待下次的调用.

在Kernel层使用wake lock步骤如下:
1. 调用函数android_init_suspend_lock初始化一个wake lock
2. 调用相关申请lock的函数android_lock_suspend 或 android_lock_suspend_auto_expire请求lock,这里只能申请partial wake lock, 如果要申请Full wake lock,则需要调用函数android_lock_partial_suspend_auto_expire(该函数没有EXPORT出来),这个命名有点奇怪,不要跟前面的android_lock_suspend_auto_expire搞混了.
3. 如果是auto expire的wake lock则可以忽略,不然则必须及时的把相关的wake lock释放掉,否则会造成系统长期运行在高功耗的状态.
4. 在驱动卸载或不再使用Wake lock时请记住及时的调用android_uninit_suspend_lock释放资源.
Android电源管理的相关内容就为大家介绍到这里。
附件: 你需要登录才可以下载或查看附件。没有帐号?免费加入
曾以为付出就会有收获,却发现现实并非那么简单
 

使用道具 举报

  • 显身卡
  
bigpretty
bigpretty当前离线
最后登录
2011-11-15
注册时间
2010-6-29
阅读权限
40
在线时间
341 小时
QQ查看详细资料 IP卡 狗仔卡

略有小成 Ⅴ

Rank: 4

略有小成 Ⅴ, 积分 1278, 距离下一级还需 222 积分
UID
36924
精华
0
帖子
473
e望
0 点
e币
464 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
8#
发表于 2010-10-25 18:01:59 |只看该作者
详细一点,很强大
我思故我在,思想决定命运
 

使用道具 举报

  • 显身卡
  
rmn190
rmn190当前离线
最后登录
2011-6-1
注册时间
2010-8-30
阅读权限
20
在线时间
75 小时
查看详细资料 IP卡 狗仔卡

业精于勤 Ⅲ

Rank: 2

业精于勤 Ⅲ, 积分 295, 距离下一级还需 5 积分
UID
88835
精华
0
帖子
85
e望
0 点
e币
135 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
9#
发表于 2010-10-25 21:41:21 |只看该作者
8错!Mark
学习Android,着眼于Android架构
 

使用道具 举报

  • 显身卡
  
hexter
hexter当前离线
最后登录
2011-11-17
注册时间
2010-10-7
阅读权限
40
在线时间
421 小时
查看详细资料 IP卡 狗仔卡

略有小成 Ⅴ

Rank: 4

略有小成 Ⅴ, 积分 1355, 距离下一级还需 145 积分
UID
96865
精华
0
帖子
451
e望
0 点
e币
483 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
10#
发表于 2010-10-25 22:38:24 |只看该作者
xuexi
要成为android砖家
 

使用道具 举报

  • 显身卡
  
pythonso
pythonso当前离线
最后登录
2011-9-24
注册时间
2010-10-3
阅读权限
20
在线时间
60 小时
QQ查看详细资料 IP卡 狗仔卡

业精于勤 Ⅲ

Rank: 2

业精于勤 Ⅲ, 积分 189, 距离下一级还需 111 积分
UID
96367
精华
0
帖子
58
e望
0 点
e币
71 元
  • 串个门
  • 加好友
  • 打招呼
  • 发消息
11#
发表于 2010-10-25 23:49:02 |只看该作者
这个要认真看看!