首页 > 其他分享 >Android开发学习之路--Android系统架构初探

Android开发学习之路--Android系统架构初探

时间:2023-01-15 15:05:24浏览次数:35  
标签:app hal -- 虚拟机 初探 模块 linux Android android


    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究。这里从芯片及硬件模块->linux内核驱动->hal层->jni->android framework层->android app做个简单的介绍。

1、芯片及硬件模块

    就像人脑,电脑的cpu一样,android手机也需要一个中央处理器,那便是主控芯片。一般电脑的cpu是intel或者amd的,但是android手机不需要电脑那样的cpu,浪费了,而且还要考虑耗电量,所以android手机一般用的是高通的芯片,或者很多山寨机用的mtk的芯片。平板电脑用的比较多的有全志的芯片,基本是都是基于arm的,所以智能设备很多都是arm的天下,而电脑则是intel的天下。下图就是高通的骁龙:

    

Android开发学习之路--Android系统架构初探_linux

    有了主控芯片之后呢还需要一些外围设备才可以运行起来,简单来说就像电脑需要硬盘,内存啊之类的。一般android手机呢需要如下外围硬件模块

    内存DDR:用于存放运行中的程序,一般4g的内存还是需要的,以前是256M和512M对于现在的应用来说远远不够了;

    内部存储EMMC:用于存放app和需要存储的一些资源信息,像我的iphone只有16g,感觉就有点不够用。

    电源管理和锂电池:主要用于电量的控制,低功耗,提供电量等。

    液晶屏和触摸屏:很多手机是两块合二为一的,液晶屏当然是显示图像的,触摸屏呢主要是用于人机交互用的。

    wifi模块:现在都需要wifi模块来连接入网了,现在的人到哪里都要问wifi密码,哈哈。

    蓝牙模块:用来实现蓝牙的功能。

    nfc模块:近场通信芯片。

    rtc时钟芯片:系统时间,闹铃等都需要这个。

    gsm模块:用来打电话啊,发短信啊之类的。

    gps模块:定位用的。

    小喇叭/麦克风:用来播放音乐和录音。

    摄像头:用来录像和拍照。

    接近传感器/加速度传感器/磁传感器等各类传感器:用来获取一些信息,比如重力用来屏幕的横屏之类,磁力计用来指南针等等。

    还有很多的电阻,电容,电感啊,二极管,三极管等等。

    以上基本是手机里的所有的模块了,然后加上画一个电路板,把这些元器件都安装上,接着再工业设计个外壳把电路板和元器件都装在里面,那么一个手机基本是就成型了。

    既然手机成型了,那么怎么才能运行出android系统呢?怎么才能使用起这些硬件模块呢?先看一张android的架构图

Android开发学习之路--Android系统架构初探_android手机_02


2、linux驱动

​​嵌入式linux那点东东之整体框架​​,

       所谓boot指的是搬代码,引导,主要就是芯片有boot的功能,会自动从flash搬启动代码到内存并执行处理。这里的代码其实就是bootloader的第一个阶段,一般这个阶段会用到EMMC。loarder就是加载各个需要的驱动,像EMMC驱动就是必要的,需要从EMMC把内核代码搬运到内存中跑起来。接着就开始启动linux内核代码了,过程有点复杂,这里可以参考​​和菜鸟一起学linux内核之引导启动篇​​,这里主要介绍了内核代码的启动。


3、android系统启动

当linux内核启动完成之后就需要启动android代码了。android的简单启动流程如下图所示:

Android开发学习之路--Android系统架构初探_android_03

    等到系统都启动完了之后,手机变可以正常使用了,但是底层是linux,那么上层的android是怎么调用到底层的linux来进行数据的交互呢?先来了解下linux上面android下面的hal层。


4、android hal层

    hal是hardware abstraction layer的简写,也可说是android和linux的中间件,其主要是由c/c++编写得到的,这一层主要是负责实现硬件的功能和控制,同时又提供了统一的api接口,这样换了底层的linux驱动,照样不用改变android的代码。一般做android的底层开发主要就是针对这一层做修改适配具体的硬件。比如led灯底层换了一个gpio口,那么hal层重新适配上,android app还是可以照样控制的。hal层的功能基本就是这样,那么android framework的java代码是怎么调用hal层的c/c++代码的呢?


5、android 系统运行库

    android底层有许多的开源库,像数据库的sqlite啊,网络连接的wpa_supplicant啊,3D绘图的OpenGL|ES啊之类,这些库都是linux下常用的开源库,很好的实现了android的功能。具体可以参考android源码的/external目下的开源库。


6、android jni层

    jni是java native interface的简写,允许java和其他语言进行交互,这里主要是和c/c++进行交互,jni的作用不仅仅是为了与hal层打交道从而控制硬件,还可以提升性能。主要是一些算法,一些库是c/c++的,效率也很高,换做java效率肯定变低了,所以借助jni,android应用也可以得到很好的性能提高。像一些游戏就是用的c++的库,这里就不多加介绍了,当然后续还是会实际搞个例子来理解理解。


7、android framework层

    framework层很庞大,主要提供了构建应用程序时可能用到的各种api,android自带的一些核心应用就是使用这些api来完成的。对于hal层和jni层还有framework层,app层的一个例子就是我的那篇关于gps的文章:​​和菜鸟一起学android4.0.3源码之硬件gps简单移植​​。


8、android app层

    这一层就是我们所编写的android app了,上一篇的hello world就是属于这一层,一般的android应用开发也是主要针对这一层而言的。


9、android虚拟机

    这里摘抄一份内容,觉得这里讲得不错:​​android虚拟机​​。

    Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。

    当一个java程序启动时,一个虚拟机就诞生了,每个android应用程序都运行在自己的dalvikvm实例当中,有几个进程就有几个dalvik虚拟机实例在运行,dalvik虚拟机主要做了两件事:处理jni,提供thread。

    好了,对于android的整个系统做了简单的介绍,之后基于这几部分,会有三个博客专栏,初探linux子系统集,android源码学习之路和android开发学习之路。今天评了个准专家,希望16年成为专家!fighting!!!^_^

标签:app,hal,--,虚拟机,初探,模块,linux,Android,android
From: https://blog.51cto.com/u_15940062/6008703

相关文章

  • 初探linux子系统集之led子系统(二)
             巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一眼看到7:1还以为点球也能踢成这样,后来想想,点球对多嘛6比1啊,接着就是各种新闻铺天盖地的来了......
  • app配置智能硬件的解决方案
    在此不再详述BLE、NFC等的设置,流程比较简单和统一。    市面上已经有的关于手机app配置智能硬件主要有以下几种,        这个方式相信没有难度,手机连......
  • 和菜鸟一起学linux总线驱动之i2c死锁问题
        不知不觉中已经有好几个月没有写点东西了,懒了就是懒了,说是忙着想把产品做得更好,都是借口,每天花一点时间来写点东西确实很不错,自己也坚持了很久很久,只不过今年以......
  • 人生总会遇到浑噩期,但是需要反思
        2013的最后一个月,到2014的3月,不经意间已经过去了3个月之久,而这三个月,不管是能力,还是其他各个方面,都没有得到锻炼,突然发现离梦想越来越远了。唯一值得庆幸的,就是......
  • 人生顿悟之梦想岂能丢掉
         清晨的马路,落叶飘洒,又是一个秋冬季,不知不觉,即将迎来新的一年----2014。2013,过得是那么的快,周而复始,难道就这样一直下去嘛。每一年都有一个梦想,年初总是信心满......
  • 初探linux子系统集之led子系统(一)
         就像学编程第一个范例helloworld一样,学嵌入式,单片机、fpga之类的第一个范例就是点亮一盏灯。对于庞大的linux系统,当然可以编写一个字符设备驱动来实现我们需......
  • 人生顿悟之那绝不是人脉
        很多时候,朋友总劝我多出去玩,而我总是一笑而过。其实本身并不是内向,也算是比较外向的,主要是没有找到共同的语言,共同的兴趣,共同的梦想而已。试想,为什么马云,马化腾......
  • 和菜鸟一起学产品之交互式设计
    ps:参考产品经理深入浅出ppt......
  • 和菜鸟一起学产品之产品经理的三大文档
    ......
  • 和菜鸟一起学产品之用户体验设计UED
    ps:参考产品经理深入浅出ppt......