图片 1

Android 编写翻译后的out目录解析

Android编译完毕后,将要根目录中生成八个out文件夹,全部变化的剧情均放置在此个文件夹中。

要害的七个目录是host和target,
前面贰个表示在主机(x86)生成的工具,host目录是有的在主机上用的工具,有局地是二进制造进程序,有一部分是JAVA的前后相继。前面一个表示目的机(模以为ARMv5)运营的原委。target中中common目录表示通用的内容,product中则是针对付加物的剧情。

引导程序优化

因地制宜程序主要成就对 CPU 的底工设置,管理 ARM 标识(ATAGS,ARM
TAGS)或设施树(device trees),切换存款和储蓄管理单元(MMU,Memory Management
Unit)等职业。

对于U-Boot,常用的优化措施有:

  • 删去不不要的功力:如网络加载等,假诺无需,那么直接移除那么些代码吧;
  • 关门无需的效果与利益
  • 关门内核镜像验证
  • 关闭辅导程序输出
  • 关闭运营延迟
  • 将通用效率的引导程序改善成贰个优化后的发端程序加载器(Initial
    Program Loader,IPL),对于U-Boot,能够经过 SPL(Second Program
    Loader,第二品级程序加载器)来促成。
1. 简介


bootloader是系统上电后最早加载运营的代码。它提供了Computer上电重置后最起头需求实施的发轫化代码。通过这一小段程序,大家能够开首化硬件装置、创设内部存款和储蓄器空间的映射表,进而确立适合的系统软硬件情形,为末段调用操作系统内核做好思虑。在PC机上教导程序日常由BIOS开头实行,BIOS完结硬件检查实验和财富分配之后,将身处硬盘MBPAJERO(Main
Boot Record,主教导记录卡塔尔(قطر‎中的OS
Bootloader(举例LILO或GRUB卡塔尔读到系统的RAM个中,然后将调节权交给OS
Bootloader,并进而携带操作系统的启航,首要产生的职业是将根本影像从硬盘上读到RAM当中,
然后跳转到内核的入口点去施行,
即最初起步操作系统。然则在嵌入式系统中何奇之有未有像BIOS那样的固件程序,因而整个系统的加载运营就全盘由bootloader来形成。

​ 举例在一个基于ARM7TDMI
core的嵌入式系统中,系统在上电或重新载入参数时日常都从地址0x00000000处开始执行,而在这里个地址处布置的常备正是系统的Boot
Loader程序。(先想转手,通用PC和嵌入式系统为啥会在此边存在这里样的异样呢?)


Bootloader张开所谓的“kernel指引”,其进度只是是从bootloader里的一句跳转代码,跳转到kernel代码处(推行kernel中的第七个函数),所谓传递参数也只是是bootloader和kernel约定二个内部存款和储蓄器地方贮存。在这里个历程中,bootloader和kernel纵然都地处同三个内部存款和储蓄器里,然则它们除了“教导”与“传递有限的参数”那样的关联,并无任何关系,完全部是八个独立的次序。之所以在kernel从前用八个bootloader来指点(为啥开机不能够直接施行kernel,全部专门的学问都交给kernel做?),其思想周围于叁个板级支持包:kernel假定实行的时候曾经怀有了多少个主干的硬件运营法规,这么些环境的发轫化(最尾巴部分的一部分硬件发轫化、硬件音讯设定)供给bootloader来变成,恐怕那样kernel的准备技术保持自然的一致性。


Bootloader是依据特定硬件平台来落到实处的,由此差相当的少不容许为富有的嵌入式系统创建一个通用的Bootloader,不一样的计算机结构都有不一致的Bootloader,Bootloader不但注重于cpu的连串布局,还依据于嵌入式系统板级设备的计划。对于2块分歧的板子来说,即使他们使用的是如同一口的计算机,要想让运转在一块板子上的Bootloader程序也能运维在另一块板子上,平时也亟需修正Bootloader的源程序。

​ U-Boot,全称 Universal Boot
Loader,是服从GPL条约的开放源码项目。U-Boot的功力是系统教导。U-Boot不止扶助嵌入式Linux系统的引导,它还扶植NetBSD,
VxWorks, QNX, RTEMS, ARTOS, LynxOS,
android嵌入式操作系统。U-Boot除了扶持PowerPC体系的微管理机外,还是能够支撑MIPS、
x86、ARM、NIOS、XScale等居多常用种类的微型机。

​ 一个嵌入式的存款和储蓄设备平时包蕴多个分区:

  1. 存放bootloader(通常是U-boot).

  2. 寄存bootloader要传递给系统基本的参数.

  3. 系统基本

  4. 根文件系统

![](https://upload-images.jianshu.io/upload_images/6128001-32cf75ccd7478e3b.jpg)

应用程序优化

根本完毕系统运维之后,接来下就是实践应用程序。对于应用程序的优化,首要有两有个别,一部分是由应用程序来接管运维的
INIT 进度,另一有的是优化应用程序的链接格局。

专门的学问的 SystemV INIT
程序,须要施行一群运转脚本。对于嵌入式系统的话,大部分是还未意思的。另一有些(比如挂载文件系统),能够由应用程序自身来贯彻。然后,能够在根本运行参数中通过“init=”参数,将
INIT 进度一贯钦命为应用程序。

行使正视的动态链接库,会遵守以下依次查找:

  • LD_PRELOAD 意况变量钦命的门径(平日对应文件/etc/ld.so.preload);
  • ELF .dynamic 节中 DT_RPATH 入口钦点的路径,若 DT_RUNPATH
    入口不真实的话;
  • 遭受变量 LD_LIBRARY_PATH 钦命的门路,但若是可施行文件有
    setuid/setgid 权限,则忽视这么些渠道;编写翻译时内定–library-path
    会覆盖那一个门路;
  • ELF .dynamic 节中 DT_RUNPATH 入口钦点的门路;
  • ldconfig 缓存中的路线(平时对应/etc/ld.so.cache
    文件),若编写翻译时使用了-z nodeflib 的链接选项,则此步跳过;
  • /lib,然后/usr/lib 路线 ,若使用了-z nodeflib
    链接选项,则此步亦跳过;

故而,尽或然的将应用程序信任的动态链接库放到优先查找的路子,能够加快链接速度。对于交叉编写翻译意况极其须要留意,主机上的动态链接库地点和对象连串上的岗位只怕不平等,那会大增应用程序试行时动态链接库的加载时间。

Linux内核层

席卷驱动程序以致管理内存、进度、电源等财富的主次,因为Android是基于Linux内核的,所以Android和别的Linux系统的中央部分的分裂超级小;分化版本的Android使用的Linux内核版本有反差,所以分裂Android版本的驱动程序或许不通用;

背景知识

系统从上电到完全运维,要求经过重重历程。叁个简化的开发银行流程大致包蕴:

  • 硬件重新设置
  • 初始指导程序(bootloader)
  • 操作系统伊始化
  • 应用程序施行

中间硬件特别首要,然而硬件日常难以退换。后续的优化,首要针对指引程序、Linux
内核和应用程序展开。

U-Boot镜像的下载与烧写

基本优化

Linux
内核被规划的非常灵活,能够本发急需的意义做种种配置优化。因而,优化内核查于系统运维速度是任重(Ren Zhong卡塔尔国而道远的。

先是,移除一切毫无的驱动,尽大概的减弱水源加载的情节,能够大大裁减系统运维时间。其次,还应该有众多基本功接收恐怕须求更加的尝试,比方基本压缩情势,对于嵌入式系统的话,LZO
压缩模式,经常会是一个不错的选料。最后,还是能透过定制一些开行参数,达到增加速度运营的目标。比方能够通过“lpj=”参数,预设种种循环必要的节拍数(loops
per jiffy,lpj)的值,防止系统在运行时自动推算。那样在依赖 ARMv5
的连串中,能够节省 100ms 以上的时日。

对此基本运行的优化,能够通过 bootgraph.pl
脚本(坐落于内核源码的 script/bootgraph.pl)来绘制内核运维耗费时间图表,用以深入分析运营最耗费时间之处。那些剧本使用特别轻巧,直接将
dmesg 的出口作为其输入,就能够生成 svg 图表:

dmesg perl scripts/bootgraph.pl > output.svg

转移的图纸如下图,

图片 2

图中每七个色段表示二个职能的领头化耗费时间。能够简轻易单的倒闭无需的意义,也许针对功效扩充一定的优化。

除了这些之外内核本人之外,内核所在的文件系统也对系统运行有着极度大的震慑。对于使用闪存晶片作为存款和储蓄的种类来讲,UbiFS 是二个很好的选料。它可以耐受意外断电,有着优秀的挂载速度,以管教系统急速运行。

[TOC]

总结

依照上面提到的三个优化点,能够将系统的运营时间,从最早的 11s 降低到656ms(数据参考 Jan Altenberg 在圣地亚哥进行的嵌入式 Linux
会议上的演讲稿)。从硬件到引导程序再到根本最终到应用程序,每一种运营步骤都有协调可优化的地点,经过一些归纳的优化,就足以裁减系统的运维时间。

有关录像:How to Boot Linux in One Second – Jan
Altenberg

运行时(Runtime);

Dailvk设想机是Google集团安排的基于Android平台的虚构机,它能够帮助已更动为
.dex(即Dalvik
Executable)格式的Java应用程序的周转;那些库能被Android系统中不一样的机件使用,通过Android应用程序为开拓者提供劳动;

一部分大旨库:

  1. 系统C库:多个从BSD世襲来的标准C系统函数库(libc卡塔尔国,是特意为基于embedded
    linux的道具定制的;
  2. 媒体库:基于PacketVideo
    OpenCORE,支持各样常用的节拍、摄像格式重放和录像,同偶尔候协助静态图像文件。编码格式包罗MPEG4,H.264,DVD,AAC,AM景逸SUV,JPG,PNG;
  3. Surface
    Manager:对展现子系统的管理,并且为几个应用程序提供了2D和3D图层的无缝融入
  4. LibWebCore:最新的web浏览器引擎,辅助Android浏览器和三个可停放的web视图;
  5. SGL:底层的2D图片引擎;
  6. 3D Libraries:基于OpenGL ES 1.0
    APIs完结,该库能够运用硬件3D加快(假设可用State of Qatar或许使用中度优化的3D软加快;
  7. FreeType:位图和矢量字体突显;
  8. SQLite:一个对于有着应用程序可用,功效强盛的轻型关周详据库引擎;

Android运行库:

Android富含了二个主导库,该大旨库提供了Java编程语言基本库的大比较多职能。每一个Android应用程序都在友好的历程中运作,都负有一个独门的Dalvik虚构机实例,Dalvik被设计成二个设备能够何况神速地运行多少个设想系统。Dalvik虚构机实践.dex的Dalvik可施行文件,该格式文件针对小内部存款和储蓄器使用做了优化。同有时候虚构机是依据贮存器的,全数的类都经由Java编写翻译器编译,然后通过SDK中的dx工具转形成.dex格式由设想机推行;

用尽了全力快的开发银行系统,对于自动化设备是非常首要的。系统能够在顾客不可能感知的时刻内运行,也就表示在不供给工作时,能够完全隔离电源,并非挂起步向休眠状态。本文基于
Atmel AT91 类别片上系统和 NAND 闪存,经过一三种的优化,将 Linux
系统运转时间,从早先时代的 11 秒,降到最终的 656 飞秒。

移植前的备选

指标硬件平台: 山抛子派 ARM-V9 四核

支付情形: ubuntu 17.04-64 位

编译器 :

Android 源码: Android 8.0

U-boot目录结构
  • board
    目标板有关文件,首要含有SDRAM、FLASH驱动;
  • common 独立于计算机连串构造的通用代码,如内部存款和储蓄器大小探测与故障检验;
  • cpu
    与计算机相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及暂停初叶化等公事;
  • driver 通用设备驱动,如CFI FLASH驱动(前段时间对INTEL FLASH扶植较好卡塔尔(قطر‎
  • doc U-Boot的表达文书档案;
  • examples可在U-Boot下运作的示范程序;如hello_world.c,timer.c;
  • include
    U-Boot头文件;越发configs子目录下与目的板相关的布署头文件是移植进度中时时要修正的文本;
  • lib_xxx 微机体系相关的文书,如lib_ppc,
    lib_arm目录分别包涵与PowerPC、ARM种类布局有关的文书;
  • net
    与网络成效有关的文件目录,如bootp,nfs,tftp;
  • post
    上电自检文件目录。尚有待进一层完善;
  • rtc RTC驱动程序;
  • tools 用于成立U-Boot
    S-RECOLacrosseD和BIN镜像文件的工具;

Android 系统结构

Android O 早先的体系划分

图片 3

图片 4

Android O 新架构

Android从高层到低层分别是行使程序层、应用程序框架层、系统运行库层和linux主题层。Linux内核和应用程序框架层之间的HAL层重即便对linux内核驱动的包裹,将硬件抽象化,屏蔽掉了底部的实现细节。HAL规定了一套应用层对硬件层读写和安插的合併接口,本质上正是将硬件的驱动分为客商空间基本空间多个规模;Linux内核驱动程序运维于内核空间,硬件抽象层运转于顾客空间。

Android 并不是Linux

  1. 它未有本地窗口系统
  2. 它没有glibc支持
  3. 它并不富含一条龙正式的Linux使用程序
  4. Android专有的驱动程序

嵌入式交叉编写翻译意况的搭建


交叉编写翻译遭逢的搭建是Android移植的首先步,差异的系统结构,区别的操作内容竟是是例外版本的水源,都会利用分歧的时有时无编写翻译器.
gcc用来扭转交叉编写翻译器,首要生成arm-linux-gcc交叉编写翻译工具,
之后用此交叉编写翻译来编写翻译Linux内核.
我们层出不穷使用网3月部分交叉编写翻译器并非和睦生成,
广泛利用的是crosstool的交叉编写翻译工具链.能够在crosstool的docs中查看使用表达.

应用程序

这一层是具有的Android客户都要接触到的,因为这一层约等于Android的UI。全体的Android应用程序(包蕴照相,电话,短信,Android的桌面,浏览器以致各个娱乐卡塔尔(قطر‎都归于这一层。重要依附第三层中的Android
SDK API来成功各样成效。

发表评论

电子邮件地址不会被公开。 必填项已用*标注