一、Android源码目录结构

Android系统源码内容实在太广,其目录结构也实在庞大,每位开发者也无法做到对每一块都弄明白,工作中接触的也只是其中的一小部分。以下只从宏观上对系统源码的一级目录进行介绍,后续再慢慢完善更细致的内容。

二、Android虚拟机

1.Android虚拟机之Dalvik虚拟机

Android虚拟机的使用,使得Android应用和Linux内核分离,这样做使得Android系统更稳定可靠,比如程序中即使包含恶意代码,也不会直接影响系统文件;也提高了跨平台兼容性。在Android4.4以前的系统中,Android系统均采用Dalvik作为运行Andorid程序的虚拟机,在Android发展中具有举足轻重的地位,而Android5.0及以后的系统使用ART虚拟机取代Dalvik,在性能上做了很大的优化。这里将对这两款虚拟机做一些介绍,主要内容如下:

2.Dalvik在Android架构中所处的位置

Android系统架构图。从上图可以看到,Dalvik虚拟机在Android Runtime中,在Linux Kernel之上。Android其实就是一个操作系统,其底层基于Linxu Kernel,这一层有许多的驱动程序,主要完成操作系统所具备的功能。Android Runtime,即android的运行环境,我们可以类比于java的jre,即java平台运行时环境。Java程序的开发、编译和运行需要java的核心包(jdk/lib/和jre/lib)支持,然后通过JVM来运行java程序,同样android程序的运行也是如此,Libraries就相当于java的jdk/lib,是开发/编译android程序所需要的库,Android Runtime里面的Core Libraries里就相当于java的jre/lib,是运行android程序所需要的核心库,自然而然,Dalvik虚拟机也就类比于java中的JVM,用于运行android程序。

3.Dalvik的作用

Dalvik虚拟机在Android操作系统上虚拟出一个设备,用来运行android 应用程序。Dalvik是apk运行的温床,其作为面向Linux、为嵌入式操作系统特别设计的虚拟机, 主要负责完成对象的生命周期管理、堆栈管理、线程管理、安全及异常管理、垃圾回收等。Dalvik充分利用Linux进程管理的特性,对其进行了面向对象的设计,使得可以同时运行多个程序,而传统的Java程序通常只能运行一个进程,这也是为什么Android不采用JVM的原因之一。在Android中,每一个app进程对应一个Dalvik,多个app进程在运行,就对应多个虚拟机的存在,这样设计的好处就是,当一个应用crash后,只会影响自己所在的dalvik,而不会影响到整个系统,不同的进程之间(即不同的Dalvik之间)通过进程间通信来实现交互。

4.Dalvik和JVM的区别与联系

5.Davik的孵化器Zygote进程

在Android系统中有个一特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,完成虚拟机的初始化、库的加载、预制类库和初始化操作。如果系统需要一个新的虚拟机实例,他会迅速复制自身,以最快的速度提供给系统。对于一些只读的系统库,所有的虚拟机实例都和Zygote共享一块区域。

6.Dalvik的致命缺点-拖慢Android系统速度

Dalvik有个致命的弱点,就是Dalvik虚拟机一直被用户指责为拖慢Android系统运行速度而不如IOS的根源。主要原因如下:

(1).开发者因素

(2).运营商因素

(3).Dalvik运行时机制因素

在编译Android程序的时候,首先java代码被编译成class文件,然后被java打包工具dx打包成.dex文件,然后.dex文件和资源文件一起被压缩成apk文件。Apk文件其实也是zip格式,只是后缀被修改为apk,读者可以自己解压一个apk试试看。Android应用的安装过程:复制apk安装包到data/app目录下,解压并扫描安装包,把dex文件保存到dalvik-cache目录下,并在data/data目录下创建对应的应用数据目录。这样每次用户点击图标运行android程序时,dalvik虚拟机就会用JIT(Android2.2及以后版本)的方法把dex文件翻译为机器码,然后再执行机器码。虽然Dalvik虚拟机已经被做过很多优化(.dex文件基础上被优化为.odex文件,o表示optimization,“优化”的意思),但因为此种机制的存在,先翻译再执行,所以Android在电量消耗和程序运行流畅程度上一直不太理想。

Android中/data目录

/data/app目录

/data/app目录下应用的信息

/data/dalvik-cache目录下的内容

/data/data目录下应用数据目录,存储对应应用运行中产生的一些数据

7.ART虚拟机取代Dalvik虚拟机

由于Dalvik虚拟机机制的问题,拖慢了android应用的速度。由此,ART(即Android RunTime)虚拟机应运而生,在Android4.4中可以在设置中切换选择Dalvik或ART作为虚拟机,在Android L(5.0)中就直接删除了Dalvik,而全面使用ART。ART在机制上做了优化,可以在第一次安装应用时,字节码就会预编译(即AOT编译:Ahead-of-time)成机器码,使其成为真正的本地应用。在点击桌面的应用图标运行时,无需再翻译字节码,而是直接运行机器码,从而提升了启动速度。另外,ART在英语单词中是“艺术”的意思,可见,ART虚拟机的设计是匠心独运,同时也是被其设计中所高度赞誉的。

8.Dalvik和ART对.dex文件的处理的对比情况

9.ART的优缺点

优点

ART的AOT方式相比于Dalvik的JIT方式(Just-In-Time,即时编译,,参见JIT_百度百科),主要由如下的有优势:

(1).ART抛弃了Dalvik的JIT方式,而采用AOT预编译方式,在安装apk的过程中,将.odex文件(.dex优化后的文件)预编译为二进制机器码,存储在设备中,以后每次启动应用的时候,直接运行机器码,而无需再翻译.odex,这样极大地提高了应用的启动速度。

(2).每次运行时所做的工作也少了,这样占用了更少的CPU资源,也消耗了更少的电池资源。

(3).ART也在开发者工具和垃圾回收器上做了改善。

Dalvik和ART在性能上的对比

缺点

硬币有正反面,ART的预编译,也带来了一定的劣势

(1).增加了安装时间。在安装的时候需要预编译,无疑增大了安装的工作量,从而增大了安装时间,对于一些大的应用,可能需要几分钟的时间才能安装完。

(2).需要更多的空间存储预编译后的机器码,无疑占用了更多的存储空间。当然,现在硬件设备更新换代很快,性能也非常好,相比于ART带来的优点,该缺点几乎没什么影响。

10.Android N对ART的优化

ART的机制使得apk在安装的时候比较耗时,为了改变这种状态,在Android N(Android7.0)中对此做了优化。Android N实现了一个使用AOT、解释、JIT混合模式的运行环境,这里使用的JIT是改进后的JIT,ART也提供了一种新的、更快的解释器。这种方式在apk安装的过程中不再进行预编译,第一次运行该应用相关程序后,在手机处于idle状态和充电的时候再将运行过的程序编译为机器码并存储在设备中。JIT提供了一套追踪机制来决定哪一部分代码需要在手机idle和充电的时候来编译(即热区域hot method的确定),这个追踪技术被称为Profile Guided Compilation,其工作原理如下:

(1).应用程序第一次启动的时候,只会通过解释器执行,同时JIT会介入并针对hot methods执行优化工作。代码在执行期间会被分析,分析结果被保存起来,同步输出一种被称为profile information的信息保存到文件中。该文件中记录了需要离线优化的hot methods,影响程序启动速度的Classes,它们主要用于进一步优化程序的启动速度。

(2).当设备处于idle状态并且在充电,就会进入Profile Guided Compilation服务,使用第一步中的profile information,生成二进制机器码,用于替代原始应用程序的相应部分。

(3).应用程序在后续启动时,就可以根据实际情况在AOT/JIT/Interpreter中选择最合适的执行方式了。

通过以上的步骤可以得知,因为有了Profile Guided Compilation,同一app会因为不同的用户行为产生不同的编译结果。

11.可以概括性地做一个总结:

第一次运行到某些模块的程序的时候(此次JIT信息不会持久化),产生一个文件来记录这些被执行的程序信息,从而实现了将以往在安装过程中预编译生成机器码的过程,延迟到手机处于idle和充电的时候来完成,最终实现既能避免漫长的安装等待,又不影响程序启动速度,还节约了空间(因为有些功能程序一直不被使用,就不需要编译为机器码占用空间),cpu资源,电池资源等的目的。

三、Android系统架构和源码的联系

Android虚拟机、Android的系统架构,其实在Native Libraries层和Linux Kernel层之间还有一层HAL层,即Hardware Abstract Layer,硬件抽象层。

Android源码官网中Android系统架构图

https://source.android.google.cn/

对于Android系统架构每一层,Android源码结构中都有相关目录与之对应。下图展示了在Android源码一级目录中,各框架层和部分目录的对应关系:

理解Android系统结构和Android系统源码的对应关系,有助于帮助咱们理解Anroid系统源码。当然这幅思维导图中只介绍了源码一级目录和系统架构的对应关系,深入各个目录,每个系统架构层还可以找到很多源码与之对应,读者可以再深入研究研究。与此同时,同一个目录下的源码,也可能涉及多个系统架构层的内容,比如frameworks层中就有frameworks/base/packages/SystemUI这个目录,众所周知,SystemUI是一款系统App,是属于应用层的。所以,对某个目录的对应的系统架构层,也不能一概而论。

Android源码阅读工具介绍

https://source.android.google.cn/http://androidxref.com/http://aospxref.com/

查看并选择系统版本

进入首页后,可以看到Google发布的各个系统版本,按照发布时间排序,包括版本别名,版本号,内核号等

源码查找主界面功能点

搜索条件的解锁及使用

进行全文搜索,属于模糊查询,忽略大小写,会匹配所有的单词、字符串、标识符以及数字等,包括注释在内。如下图所示,为全文搜索“Activity”的结果,也显示了所在文件的路径,可以点击进入对应的文件。

Android系统所有版本
https://www.androidos.net.cn/sourcecodeAndroid Kernel系统所有版本
https://www.androidos.net.cn/sourcecodeAndroid系统核心服务
https://www.androidos.net.cn/androidservicehttps://download.mokeedev.com/
https://wiki.lineageos.org/devices/https://github.com/MoKee
https://github.com/LineageOS

鸿蒙Harmony OS核心架构

鸿蒙系统(HarmonyOS)应用开发入门篇

Ubuntu20.04.2.0环境的安装与配置过程

Android10系统源码的下载与编译方法(完美编译)

Android11系统源码的下载与编译方法(解决内存、磁盘不足问题)

Ubuntu虚拟机环境搭建Android系统源码编译环境及问题解决方法

Ubuntu18.04/20.04虚拟机编译Android4/5/6/7/8/9/10/11系统源码的问题解决

Ubuntu环境Python3版本的更新升级使用方法

Ubuntu安装配置切换Python3版本的解决方法

ndk配置内核交叉编译环境(1)

内核交叉编译配置定制和编译(2)

内核篇加载内核模块(Android10)

内核系统调用openat Hook

Android8.1虚拟化定制系统定制

Android9一键安全手机

Android10系统源码的下载与编译方法(完美编译)

Android11系统源码的下载与编译方法(解决内存、磁盘不足问题)

原文链接

经典|Android系统定制开发基础篇

干货|Android系统定制开发基础篇相关推荐

  1. 后悔没早点看这篇直播系统定制开发入门篇

    直播想必大家都不陌生了,在互联网的风口下,以及5G技术的推动,流量带宽的提高,使得直播在我们生活中扮演着越来越重要的角色.本文先来讲一下入门直播需要了解的一些基本概念,搜集整理了直播入门需要了解的一些 ...

  2. android系统定制开发动态显示隐藏虚拟按键虚拟导航Navigationbar

    新需求:删除Android 原生自带的虚拟导航按键(暂定) 如想直接删除不显示Navigationbar,可以用如下两个方法 1)在资源xml文件中把导航按键的高度和宽度设置为0 frameworks ...

  3. Android App开发基础篇—数据存储(SQLite数据库)

    Android App开发基础篇-数据存储(SQLite数据库) 前言:Android中提供了对SQLite数据库的支持.开发人员可以在应用中创建和操作自己的数据库来存储数据,并对数据进行操作. 一. ...

  4. Android音视频开发基础(七):视频采集-系统API基础

    前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了<Android 音视频从入门到提高 - 任务列表>.本文是Android音视 ...

  5. 直播系统定制开发——海量用户实时消息系统架构演进实践

    1.引言 一套完整的直播系统定制开发核心功能有两个: 1)实时音视频的推拉流: 2)直播间消息流的收发(包括聊天消息.弹幕.指令等). 本文主要分享的是百度直播的消息系统的架构设计实践和演进过程. * ...

  6. 极光小课堂 | 极光推送之 Android 客户端使用指南——基础篇

    " 本文中涉及到的所有代码现已在 Github 上开源,地址:https://github.com/xuexiangjys/JPushSample" 01 前言 - 极光推送是国内 ...

  7. android 基础应用程序,android应用程序基本实现(基础篇).ppt

    <android应用程序基本实现(基础篇).ppt>由会员分享,可在线阅读,更多相关<android应用程序基本实现(基础篇).ppt(22页珍藏版)>请在人人文库网上搜索. ...

  8. 深入了解Android蓝牙Bluetooth——《基础篇》

    深入了解Android蓝牙Bluetooth--<基础篇> 什么是蓝牙?   也可以说是蓝牙技术.所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,是由爱立信公司公司发明的 ...

  9. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM中的查询

    前文回顾 前面的文章一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作一文给大家介绍了如果使用ORM实现数据的读取.插入.更新与删除基本业务也讲解了ORM开发基 ...

  10. 为Android系统定制重启功能

    按计划每周更新一篇技术博文,第二篇:<为Android系统定制重启功能> 一.Android系统重启的实现方式 1.广播方式 之前的博文介绍过这种方式<使用广播实现的Android关 ...

最新文章

  1. 开需求评审会,你会出汗吗?
  2. Eclipse创建java webproject配置Tomacat和JDK
  3. qt中sendevent_Qt中postEvent和sendEvent函数
  4. html怎么让五张照片并排显示,最考验右脑5张照片,30s内能发现问题都是牛人,PS做不出来...
  5. HTTPS 能否避免流量劫持?
  6. java set集合转数组_java set转list,数组与list的转换
  7. Asp.net五大对象
  8. python 字符串中符号的意义
  9. Node.js 学习笔记--- (2)创建一个简单的博客工程
  10. 翻译Programming WCF Services第二版
  11. 地铁关门提示音,可使用倒计时
  12. 盘点全球8K视频直播的解决方案和成果
  13. oracle数据库应用中实现汉字“同音”查询(转)
  14. 人工晶状体在线公式A常数优化——多线程
  15. fat+linux权限,ubuntu挂载的fat32后文件没有执行权限
  16. 塔米狗热门项目:杭州北鸿置业有限公司100%股权转让
  17. 小武与GPU与pytorch的bug 还有反向传播
  18. linux内核源码lxr,配置glimpse与LXR读取linux内核源码
  19. 怎样挑选适合自己的云主机
  20. 答案揭晓 | 关于云基础架构,你了解多少?

热门文章

  1. 浅谈python运算符运算法则
  2. 知乎300万人围观:我为公司挣了17万,工资只有8千块,该辞职吗?
  3. linux基本操作大全centos7
  4. Compose | 一文理解神奇的Modifier
  5. java中modifier_Ruby中的private modifier与Java中的对比
  6. Data Migration 架构
  7. 前端面试题及解答(尽量口语化,模拟面试现场时的回答)
  8. 详解Excel中最常用的查找公式Vlookup及Sumifs
  9. Unity 多端游戏画面同步
  10. html5hr标签默认值,hr_标签 | Elements_HTML_参考手册_非常教程