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编译过程##

  1. 需要安装Python mako,是一个Python的模板库,apt-get
  2. 需要安装yasm,同样apt-get可以解决
  3. kitkat必须使用oracle-java6-jdk来进行编译,否则会出现java-full-debug,41的报错。
  4. 编译后得到的iso在虚拟机中使用,必须选择linux2.6,32bit版本。64bit会出现硬盘分区错误,error17,无法开机
  5. 调试iso是否正确时,分区中记得加boot,sdcard可以设也可以不设,GPT不需要安装,EFI Grub2也不必要使用。
  6. 在使用鼠标模拟触摸屏时,记得现在控制里将“禁止独占鼠标”给勾上,这样就可以在两边切换鼠标,使用功能键,默认为右ctrl。

Android内核剖析(1)的更多相关文章

  1. 《Android内核剖析》读书笔记 第13章 View工作原理【View树遍历】

    View状态分类 在View视图中定义了多种和界面效果相关的状态,比如拥有焦点Focused.按下Pressed等,不同的状态一般会显示不同的界面效果,而且视图状态会随着用户的操作而改变,一般通过xm ...

  2. 《Android内核剖析》读书笔记 第13章 View工作原理【View重绘过程】

    计算视图大小的过程(Measure) 视图大小,准确的来说应该是指视图的布局大小:我们在layout.xml中为每个UI控件设置的layout_width/layout_height两个属性被用来设置 ...

  3. 类装载器DexClassLoader (android内核剖析)

    在java环境中,有个概念叫做"类装载器",其作用是动态装载Class文件.标准的java SDK中有一个ClassLoader类,借助它可以装载 想要的Class文件,每个Cla ...

  4. Android内核剖析读书笔记(1)—Framework概述

    一.Framework组成 1.服务端组成 a.WindowManagerService     决定各窗口的叠放次序.隐藏或者显示窗口 b.ActivityManagerService   管理应用 ...

  5. Android内核剖析读书笔记

    第16章 程序包管理 PackageManagerService類 PmS 目錄 16.1 包管理概述 16.2 packages.xml文件格式 16.3 包管理服務的啟動過程 16.4 應用程序的 ...

  6. 《深入理解Android内核设计思想》

    <深入理解Android内核设计思想> 基本信息 作者: 林学森 出版社:人民邮电出版社 ISBN:9787115348418 上架时间:2014-4-25 出版日期:2014 年5月 开 ...

  7. Android内核驱动程序的编写和编译过程

    注意:涉及的代码为android内核代码而不是android源码. 在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非ip ...

  8. Android内核sysfs中switch类使用实例

    Android内核sysfs中switch类使用实例 最终在这个周末,能够干点自己想要干的事了. 由我这个二流的内核驱动开发人员来解析一下sysfs中的switch类.先猜測一下来历,在普通的嵌入式L ...

  9. 《PHP内核剖析 - 变量/内存管理》

    本文总结自: <PHP7 内核剖析 - 变量的内部实现> 一:变量的实现 - 变量是一个语言实现的基础. - 在PHP中,变量的组成部分为 变量名(zval) 变量值(zend_value ...

随机推荐

  1. 第3章 编写ROS程序-3

    1.订阅者程序 我们继续使用 turtlesim 作为测试平台,订阅 turtlesim_node发布的/turtle1/pose 话题. 这一话题的消息描述了海龟的位姿 (位置和朝向) .尽管目前你 ...

  2. LeetCode: 598 Range Addition II(easy)

    题目: Given an m * n matrix M initialized with all 0's and several update operations. Operations are r ...

  3. codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】

    容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2<=n则有解,否则无解 然后剩下的情况最 ...

  4. JAVA接口详细讲解

    接口 接口的概念  接口代表的是一个功能的集合,定义规范,所有的方法都是抽像方法,这是一种思想是一种规则,将这个种规则称为接口. 接口的定义 使用关键字 interface 叫做接口 修饰符 inte ...

  5. Sonya and Matrix Beauty Codeforces - 1080E

    https://codeforces.com/contest/1080/problem/E 比赛时候一个多小时码不出来... 来看遇到的困难: 1.没有能用的随机unsignedlonglong函数 ...

  6. scrapy 一些设置和问题

    scrapy设置ua池 设置后在setting启用 DOWNLOADER_MIDDLEWARES = { 'laogou.middlewares.LaogouDownloaderMiddleware' ...

  7. Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率和决策树多元分类使用.precision方法以precision来评估模型的准确率(图文详解)

    不多说,直接上干货! Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的 ...

  8. linux basename命令的使用

    用途 返回一个字符串参数的基本文件名称. 语法 basename String [ Suffix ] 描述 basename 命令读取 String 参数,删除以 /(斜杠) 结尾的前缀以及任何指定的 ...

  9. 有关在python中使用Redis(一)

    python作为一种处理数据的脚本语言本身有许多方法函数供大家使用,有时候为了提升数据处理速度(如海量数据的访问或者海量数据的读取),涉及分布式管理架构,可能需要用到Redis,Redis是一个开源的 ...

  10. strust2的10种type类型

    <result-types> <result-type name="chain" class="com.opensymphony.xwork2.Acti ...