Android内核剖析(1)
Linux的启动过程##
开机上电执行bootloader,将内核的前n条指令加载到系统内存中------>系统内核的初始化----------->启动应用程序。
bootloader的位置装载在每个CPU要执行的第一条指令的内存地址处,该地址对于不同的CPU是相同的。所以称为引导程序。目的为装载真正的用户程序,而装载的目标位置和device可能不同,因此共同的需要知道:
- 从哪里读取用户程序
- 用户程序的长度是多少
- 装载完用户程序后跳转多少,入口程序在哪儿
Android和Android-x86代码的下载过程##
主要参考为:http://source.android.com/source/initializing.html
其中需要注意的有
- 安装必要的关联包,在Android5.0之后需要使用jdk7,使用openJDK也可以。详细的依赖文件上面都有
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
同样可以升级Java:
$ sudo update-alternatives --config java
$sudo update-alternatives --config javac
另外需要的包为:
$sudo apt-get install bison g++-multilib git gperf libxml2-utils make zlib1g-dev:i386 zip
注意这里并没有列出全部,还有额外的依赖项存在。
- 配置USB设备:我们这里暂时不用,因此先不使用该部分
//TODO
- 下载repo,(“这是个坑人的东西”)用来拿源码的
$ mkdir ~/bin
$ PATH=$PATH:~/bin
这里还需要装好git和curl,之前git其实已经装好了。官方给出的链接应该是被墙了,有另外的链接:
$ curl http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo > ~/bin/repo
//获取repo
或者:
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
注意这里的链接的repo确实比较老,容易出现下面的问题,error: Cannot fetch platform/bionic repo tailao。因此可以考虑不使用该源,在外网上面可以直接使用官方的链接来安装。
- 安装repo的client和初始化
$ mkdir Workspace_dir
$ cd Workspace_dir
$ repo init -u http://git.code.sf.net/p/android-x86/manifest -b $branch
或者:
$ repo init -u http://git.android-x86.org/manifest -b $branch
其中的branch是不同的版本。
$ repo sync
//实际下载的指令
repo实际上就是一个管理多个git库的python的脚本,可以方便的同步而已。
别人的总结##
罗升阳这里给出了一个自己的镜像,http://d.zhu.im/ 可以参考看看
http://blog.csdn.net/ilittleone/article/details/6823441 一个源码的地址
http://blog.csdn.net/chenzujie/article/details/40321267
ed2k://|file|Linux.Kernel.Development,.Robert.Love,.3ed.(Addison-Wesley,.2010,.0672329468)(ED2000.COM).pdf|2558172|3d723fc133f6771d6fcdbcbe83813e38|h=rztsayzpuo6lm4nh7wc26ddclep66c6e|/ 内核简介
http://www.stormzhang.com/android/2014/07/07/learn-android-from-rookie/ Android的学习路线
http://blog.csdn.net/xueerfei008/article/details/17409447 小问题
http://www.linuxidc.com/Linux/2011-04/33966.htm 总结
http://blog.csdn.net/maxleng/article/details/5490770 核心介绍
http://blog.csdn.net/innost/article/details/45670567 邓X凡深入理解系列
深入理解Android内核思想
异步线程##
同步线程是执行完run()内的代码后就结束,异步线程的则是线程启动后会自动进入一个无限循环中,一直等待着消息的到来,内部的消息队列一旦有消息就调用相应的回调函数,如果没有消息即消息队列为空则线程会暂停。一般的应用场景为:
- 任务需要常驻,一直有效交互
- 任务需要根据外部传递的消息做不同的操作
具体的问题还有:
- 维护一个消息队列MessageQueue
- 在while(true)循环体内写回调函数
- 在读写消息中都应该加锁,不能一边读一边写
(需要补充东西)
Binder框架##
Binder是应用于多进程之间通信的,可以认为其是工作在Linux层面隶属于一小段内存的驱动,客户端调用Binder是通过系统调用完成的。
Binder是一个轻量级的IPC架构(不像CORBA),主要提供了三个模块:即服务端接口,Binder驱动,客户端接口。
Binder可以认为是在Android中的前端页面和后端实现的公共对象代理。基本的模型是:
Activity & 公共服务请求(客户端) -----------> 公共服务对象代理(IBinder)-------------> Service(服务端)
其中的数据转换流为JVM----> C++ Library--------> Linux Binder-----------> 应用层service进程
Binder提供了系统中不同进程间的参数传递和通讯协议,在客户端和服务端均不可见,认为是一个通道而已。其实在两端均有一个binder对象,不过仅仅生成一个线程。
Framework##
主要分为三大部分,即客户端,服务端和Linux驱动。
服务端###
其中的服务端主要包括:
- WindowsManagerService 前者主要管理各个窗口的叠放次序,显示或者隐藏等
- ActivityManagerService 后者则主要管理各种应用程序中的Activity。
此外比较重要的类
- KeyQ 继承于KeyInputQueue主要作用是开启一个线程,不断读取用户的UI操作的信息,如按键,触摸屏,鼠标等等,并将触发的事件放入到QueueEvent中去。
- InputDispatcherThread 启动一个线程,并不断从QueueEvent中抽取事件,过滤后送给客户端程序。
客户端###
Android4.0-kitkat-x86编译过程##
- 需要安装Python mako,是一个Python的模板库,apt-get
- 需要安装yasm,同样apt-get可以解决
- kitkat必须使用oracle-java6-jdk来进行编译,否则会出现java-full-debug,41的报错。
- 编译后得到的iso在虚拟机中使用,必须选择linux2.6,32bit版本。64bit会出现硬盘分区错误,error17,无法开机
- 调试iso是否正确时,分区中记得加boot,sdcard可以设也可以不设,GPT不需要安装,EFI Grub2也不必要使用。
- 在使用鼠标模拟触摸屏时,记得现在控制里将“禁止独占鼠标”给勾上,这样就可以在两边切换鼠标,使用功能键,默认为右ctrl。
Android内核剖析(1)的更多相关文章
- 《Android内核剖析》读书笔记 第13章 View工作原理【View树遍历】
View状态分类 在View视图中定义了多种和界面效果相关的状态,比如拥有焦点Focused.按下Pressed等,不同的状态一般会显示不同的界面效果,而且视图状态会随着用户的操作而改变,一般通过xm ...
- 《Android内核剖析》读书笔记 第13章 View工作原理【View重绘过程】
计算视图大小的过程(Measure) 视图大小,准确的来说应该是指视图的布局大小:我们在layout.xml中为每个UI控件设置的layout_width/layout_height两个属性被用来设置 ...
- 类装载器DexClassLoader (android内核剖析)
在java环境中,有个概念叫做"类装载器",其作用是动态装载Class文件.标准的java SDK中有一个ClassLoader类,借助它可以装载 想要的Class文件,每个Cla ...
- Android内核剖析读书笔记(1)—Framework概述
一.Framework组成 1.服务端组成 a.WindowManagerService 决定各窗口的叠放次序.隐藏或者显示窗口 b.ActivityManagerService 管理应用 ...
- Android内核剖析读书笔记
第16章 程序包管理 PackageManagerService類 PmS 目錄 16.1 包管理概述 16.2 packages.xml文件格式 16.3 包管理服務的啟動過程 16.4 應用程序的 ...
- 《深入理解Android内核设计思想》
<深入理解Android内核设计思想> 基本信息 作者: 林学森 出版社:人民邮电出版社 ISBN:9787115348418 上架时间:2014-4-25 出版日期:2014 年5月 开 ...
- Android内核驱动程序的编写和编译过程
注意:涉及的代码为android内核代码而不是android源码. 在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非ip ...
- Android内核sysfs中switch类使用实例
Android内核sysfs中switch类使用实例 最终在这个周末,能够干点自己想要干的事了. 由我这个二流的内核驱动开发人员来解析一下sysfs中的switch类.先猜測一下来历,在普通的嵌入式L ...
- 《PHP内核剖析 - 变量/内存管理》
本文总结自: <PHP7 内核剖析 - 变量的内部实现> 一:变量的实现 - 变量是一个语言实现的基础. - 在PHP中,变量的组成部分为 变量名(zval) 变量值(zend_value ...
随机推荐
- HDU - 1869 六度分离 Floyd多源最短路
六度分离 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即 ...
- 如何選擇最佳的 Wi-Fi 無線網路頻道,獲得最佳的傳輸速度(转载)
转自:https://blog.gtwang.org/useful-tools/how-to-find-the-best-wi-fi-channel-for-your-router/
- VS 远程部署程序
第1步 https://www.cnblogs.com/hydor/p/6604053.html 第2步 http://www.cnblogs.com/potential/p/3751426.html ...
- ue4 简单数据储存
- 图像像素灰度内插(Matlab实现)
常用的像素灰度内插法:最近邻元法.双线性内插法.三次内插法 %%像素灰度内插 factor = 0.75;%缩放比 u = 0.6;v = 0.7; itp1 = uint8(zeros(ceil(h ...
- 字典排序permutation
理论 C++ 中的next_permutation 一般作为正序全排列的使用规则,其实这个就是正序字典排序的实现. 比如我们要对 列表 [1,2,3] 做full permutation 一般使用递 ...
- virtualenv模块安装
依赖包管理模块(virtualenv) virtualenv是Python的虚拟环境,可以在同一台PC隔离不同的python开发环境.virtualenv可以创建一个隔离的python环境(沙盒).使 ...
- ABP框架和NET CORE实战
http://www.fishpro.com.cn/2017/09/ ABP实战系列 ABP实战 ABP-第一个Asp.net core 示例(7)AutoMapper的使用 我们为什么需要使用DDD ...
- windows/Linux下设置ASP.Net Core开发环境并部署应用
10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用 创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 ...
- Maven--setting详解
settings.xml有什么用? 如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径. settings.xml文件是干什么的,为什么要配置它呢? ...