深入学习Android

news2024/11/18 8:39:07
我通过阅读邓凡平前辈的《深入理解Android》,为了加深学习作此学习笔记。
虽然是邓老师2011著的书,但其中的安卓框架还是可以学习的。
另老师的csdn地址在: 阿拉神农的博客_CSDN博客-Android开发系列,深入理解Android,移动万态领域博主
tips:阅读该知识应具有C++的基本知识,因为本书的大部分内容都集中在了Native层。
本书是在分析 Android 源码的基础上展开的,而源码文件所在的路径一般都很长,例如,
文件 AndroidRuntime.cpp 的真实路径就是 framework/base/core/jni/AndroidRuntime.cpp
本书的编写顺序,是 6 5 4 7 8 9 10 2 3 1 章,但出于逻辑连贯性的 考虑,还是建议读者按本书的顺序阅读。其中,第 2 5 6 章分别讲述了 JNI Android 常用类 ,以及 Binder 系统,这些都是基础知识,我们有必要完全掌握。其他部分的内容都是针对单个 模块的,例如 Zygote Audio Surface MediaScanner 等,读者可各取所需,分别对其进行研究
该书是上册, 全书一共 10 章, 10 章的主要内容是:
1 章  介绍了阅读本书所需要做的一些准备工作,包括对 Android 整个系统架构的认识,以
Android 开发环境和源码阅读环境的搭建等。注意,本书分析的源码是 Android2.2
2 章  通过 Android 源码中的一处实例深入地介绍了 JNI技术
3 章  围绕 init进程 ,介绍了如何解析 init.rc 以启动 Zygote 和属性服务( property service )的工作原理。
4 章  剖析了 zygote和system_server进程 的工作原理。本章的拓展思考部分讨论了 Andorid
启动速度、虚拟机 heapsize 的大小调整问题以及 看门狗 的工作原理。
5 章  讲解了 Android 源码中常用的类,如 sp、wp、RefBase、Thread类、同步类、Java中的
Handler类以及Looper类 。这些类都是 Android 中最常用和最基本的,只有掌握这些类的知识,
才能在分析后续的代码时游刃有余。
6 章   以 MediaServer 为切入点,对 Binder 进行了较为全面的分析。本章拓展思考部分讨论
了与 Binder 有关的三个问题,它们分别是 Binder 和线程的关系、死亡通知以及匿名 Service
7 章   阐述了 Audio 系统中的三位重要成员 AudioTrack、AudioFlinger和AudioPolicyService
的工作原理 。本章拓展思考部分分析了 AudioFlinger DuplicatingThread 的工作原理,并且和
读者一道探讨了单元测试、 ALSA Desktop check 等问题。
8 章   以 Surface系统 为主,分析了 Activity和Surface的关系、Surface和SurfaceFlinger的关系
以及SurfaceFlinger的工作原理 。本章的拓展思考部分分析了 Surface 系统中数据传输控制对象
的工作原理、有关 ViewRoot 的一些疑问,最后讲解了 LayerBuffer 的工作流程。这是全书中难 度较大的一章,建议大家反复阅读和思考,这样才能进一步深入理解 Surface 系统。
9 章   分析了 Vold和Rild ,其中 Vold负责Android平台中外部存储设备的管理,而Rild负责
与射频通信有关的工作 。本章的拓展思考部分介绍了嵌入式系统中与存储有关的知识,还探
讨了 Rild Phone 设计优化方面的问题。
10 章   分析了多媒体系统中 MediaScanner的工作原理

1.1 系统架构

1.1.1 Android系统架构

该平台本身是基于 Linux 内核的

Linux 内核层:包含了 Linux 内核和一些驱动模块(比如 USB 驱动、 Camera 驱动、蓝牙驱动
等)。目前 Android2.2 (代号为 Froyo )基于 Linux 内核 2.6 版本。
Libraries 层:这一层提供动态库(也叫共享库)、 Android 运行时库、 Dalvik 虚拟机等。从
编程语言角度来说,这一层大部分都是用 C C++ 写的,所以也可以简单地把它看成是 Native
层。
Framework 层:这一层大部分用 Java 语言编写,它是 Android 平台上 Java 世界的基石。
Applications 层:与用户直接交互的就是这些应用程序,它们都是用 Java 开发的。

 Android系统搭建出了一个java世界,他的运转依赖于另一个被Google极力隐藏的Native世界。

Java 虽具有与平台无关的特性,但 Java 和具体平台之间的隔离却是由 JNI 层来实现的。 Java
是通过 JNI 层调用 Linux OS 中的系统调用来完成对应的功能的,例如创建一个文件或一个
Socket 等。
除了 Java 世界外,还有一个核心的 Native 世界,它为整个系统高效和平稳地运行提供了强
有力的支持。一般而言, Java 世界经由 JNI 层通过 IPC 方式与 Native 世界交互,而 Android 平台
上最为神秘的 IPC 方法就是 Binder 了,第 6 章将详细分析 Binder 。除此之外, Socket 也是常用的
IPC 方式。

1.1.2 本书的架构

本书所分析的模块也将遵循 Android 系统架构

该书籍所分析的各个模块除未涉及 Kernel 外,其他三层均有所涉及,它们分别 是:
Native层 包括 init、Audio系统(包括AudioTrack、AudioFlinger和AudioPolicyService)、Surface系统(包括Surface和SurfaceFlinger)、常用类(包括RefBase、sp、wp等)、Vold和 Rild
Java Framework层 包括 zygote、System_server以及Java中的常用类 (包括 Handler Looper
等)。
Java Application层 包括 MediaProvider和Phone

1.2.1 下载源码

下面将详细介绍如何下载 Android 的源码。
1. 设置软件源

 将软件源地址设置成了http//mirror.bjtu.edu.cn/ubuntu

2. 下载 Android 源码
下面开始下载 Android 源码,工序比较简单,可一气呵成。
apt-get install git-core curl # 先下载这两个工具
mkdir-p/develop/download-froyo # 在根目录下建立 develop download-froyo 两个目录
cd~/develop/download-froyo # 进入这个目录
curl http://Android.git.kernel.org/repo>./repo # 从源码网站下载 repo 脚本,该脚本是 Google
为了方便源码下载而提供的,通过该脚本可下载整套源码。
chmod a+x repo # 设置该脚本为可执行
./repo init-u git://Android.git.kernel.org/platform/manifest.git-b froyo # 初始化 git
./repo sync # 下载源码,大小约为 2GB ,如果网速快,估计也得要 2 个多小时。

注意 Kernel 的代码必须单独下载,下载方法如下:
git clone git //android.git.kernel.org/kernel/common.git kernel

1.2.2 编译源码

1.部署JDK

Froyo 的编译依赖 JDK 1.5 ,所以首先要做的就是下载 JDK 1.5 。下载网址是
http://www.oracle.com/technetwork/java/javase/downloads/index-jdk5-jsp-142662.html
下载得 到的文件为 jdk-1_5_0_22-linux-i586.bin ,把它放到任意一个目录中,笔者将它放在了 /develop 中,然后在这个目录中执行如下命令:
./jdk-1_5_0_22-linux-i586.bin#执行这个文件 
这个命令的功能其实就是解压,解压后的结果在 /develop/jdk1.5.0_22 目录中。现在有了
JDK ,再按照下面的步骤部署它即可:
1 )在~ /.bashrc 文件的末尾添加以下几句话:
export JAVA_HOME=/develop/jdk1.5.0_22#设置为刚才解压的目录
export JRE_HOME=JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 
(2 )重新登录系统,这样 JDK 资源就能被正确找到了。

2.编译源码

Android 的编译有自己的一套规则,主要利用的是 mk 文件,在此简单地介绍其编译工序:
  1. 进入源码目录(以笔者的开发环境为例,也就是cd/develop/download_froyo):
  2. 执行.build/envsetup.sh,这个脚本用来设置Android的编译环境。
  3. 执行choosecombo命令,这个命令用来选择编译目标(如目标硬件平台、eng还是user等)。一般而言,手机厂商会设置自己特有的编译选项。
  4. 执行完上面几个步骤后,就可以编译系统了。
Android 平台提供了三个命令用于编译,它 们分别是 make、mmm和mm ,这三个命令的使用方法及其优劣如下:
make :不带任何参数,它用于编译整个系统,时间较长,笔者不推荐这种做法,除非读者 想编译整个系统。
make MediaProvider :下面几个例子都以编译 MediaProvider 为例。这种方式对应于单个模 块编译。它的优点是,会把该模块依赖的其他模块也一起编译。例如 make libmedia ,就会把 libmedia 依赖的库全部编译好。其缺点也很明显,它需要搜索整个源码来定位 MediaProvider 块所使用的 Android.mk 文件,并且还要判断该模块所依赖的其他模块是否有修改。整体编译 时间较长
mmm packages/providers/MediaProvider :该命令将编译指定目录下的目标模块,而不编译
它所依赖的模块。所以,如果读者是初次编译,采用这种方式编译一个模块往往会报错。错
误的原因是因为它依赖的模块没有被编译
mm :这种方式需要先用 cd 命令进入 packages/providers/MediaProvider 目录,然后执行 mm
令。该命令会编译当前目录下的模块。它和 mmm 一样,只编译目标模块, mm mmm 命令编
译的速度都很快。
如果只知道目标模块的名称,则应使用 make 模块名的方式来编译目标模块。例如,如果要
编译 libmedia ,则直接使用 make libmedia 即可。另外,初次编译时也要采用这种方法。
如果不知道目标模块的名称,但知道目标模块所处的目录,则可使用 mmmmm 命令来编
译。当然,初次编译还必须使用 make 命令,以后的编译就可使用 mmm mm 了,这样会节约
不少时间。
注意 一般的编译方式都使用增量编译,即只编译发生变化的目标文件,但有时则需重新
编译所有目标文件,那么就可使用 make 命令的 -B 选项。例如 make-B 模块名,或者 mm-B
mmm-B 。在 mm mmm 内部,也是调用 make 命令的,而 make -B 选项将强制编译所有目标文

 

3. 本书各模块的编译目标
本书各模块的编译目标如表 1-1 所示,这里仅列出几个有代表性的模块:

 

 假设make framework,那么编译完的结果则如图1-6所示

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何进阶一名有竞争力的程序员?

前言 这段时间,又互联网寒冬了,你看消息满天飞。一瞬间,裁员的,辟谣的,很是热闹。这搞得我们程序员很难受,本来压力就大,还动不动有人在你耳边煽风点火制造恐慌。我想说:难道就不能…

[附源码]Python计算机毕业设计SSM教师信息采集系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

APISIX 在君润人力云原生平台的架构实践

讲师:袁鹏,一页科技架构师 摘要: 君润人力采用多套 Apache APISIX 集群来满足自研服务平台的功能需求。 君润人力成立于 2019 年,是一家以科技驱动的人力资源解决方案服务商,依托行业领先的科技水平和服务能力&#xf…

透视投影函数的图像

因为有个需求是判断线是否被视锥体裁切,因为NDC比较好判断是否裁切,所以研究了一下透视投影变换的函数图像。 从透视投影矩阵可以看出,在同一个z上,x,y都是线性的,所以这里主要研究z的变换函数图像。 我用的是Vulkan&a…

[附源码]Python计算机毕业设计SSM健身网站平台(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【SQL】锁机制

【SQL】锁机制锁的不同角度分类从数据操作的类型划分:读锁,写锁从数据操作的粒度划分:表级锁,页级锁,行锁表锁意向锁(intention lock)自增锁(AUTO-INC锁)元数据锁&#x…

Java --- Spring6对IoC的实现

目录 一、控制反转 二、依赖注入 三、set注入 四、构造注入 一、控制反转 1、控制反转是一种思想 2、控制反转是为了降低程序耦合度,提高程序扩展力,达到OCP原则,达到DIP原则。 3、控制反转主要有:①、将对象的创建权力交出去&#xff…

莱特飞行优化及其使用场景

莱特飞行优化及其使用场景 一,莱特飞行 但是产生一个莱特飞行分布的随机数是比较难的,莱特只给出了一个积分,所以后面就有人提出了如何制造这样分布的随机数。 Mantegna 在1994年提出的一种用正态分布求解随机数的方法,有时也叫…

nginx目录穿越漏洞(insecure-configuration)

该漏洞是由于配置错误导致的 漏洞原理:传送门 这个常见于Nginx做反向代理的情况,动态的部分被proxy_pass传递给后端端口,而静态文件需要Nginx来处理。 环境: vulhub靶场 进入nginx/insecure-configuration 运行docker-comp…

【编码】PHP中文路径问题详解

1. 问题 低版本的PHP可能会遇到不支持中文路径的情况: (1) require(‘http://localhost/中文路径/test.php’); (2) require(‘\中文路径\test.php’); (3) $file fopen(‘http://localhost/中文路径/test.php’); (4) $file fopen(‘\中文路径\test.php’);…

SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读

环境搭建 生产和消费 RestTemplate,底层源码解读SpringCloud环境搭建:生产和消费 RestTemplateSpringCloud的服务调用SpringBootApplication业务调用方法一: 通过静态工厂去拿业务调用方法二: 通过注入依赖去拿Template的底层源码…

BI国产化,必须要弄懂的2个关键

自“十四五”以来,我国诸多政策开始推动信创产业的深入,实现关键数字技术自主研发和自主可控。我国信创产业竞争力不断突破,国产化进程稳步推进。2022年开始政策重点提及“数字经济”、“数字政府”和国家信息化。在此背景下,BI产…

造物数藏:以数字藏品为契机 不断完善应用场景探索

数字时代已至,文化艺术作品的表现形式、传播途径都发生了变化,中华民族上下五千年的文化瑰宝得以借助新的形式被传承弘扬。而数字技术在发展过程中,也逐渐与文化产业水乳交融,孕育出数字文化产业新业态。数字藏品在近两年的突然红…

MySQL高可用MHA

目录 一.MHA概述 1.1 什么是MHA 1.2 MHA的组成 1.3 MHA的特点 二.MHA的工作原理 2.1 MHA的优点总结 三、实现过程 3.1 准备实验 Mysql 的 Replication 环境 3.1.1 相关配置 3.1.2 初始主节点 master 的配置 3.1.3 所有 slave 节点依赖的配置 3.1.4 配置一主多从复制…

VINS学习04———Omni教程

1. 本文简介 本文依照港科大开源的代码和论文 文章主要内容:对无人机集群实现协同定位。参与融合的定位因子有以下4点 全向鱼眼相机的VIO定位:VINS-Fisheye基于地图定位:视觉特征点协同建图基于UWB协同定位:节点间测距视觉检测定…

爆款小游戏用的都是什么游戏开发引擎?

随着微信生态中,小程序应用指数级的增长,许多休闲游戏变成为了众多游戏厂商流量变现的新手段。以近期很火的“羊了个羊”为例,它便是我们常常所说的小游戏。 游戏和小游戏的区别 要盘点小游戏开发引擎之前,我们得先来了解下游戏和…

[附源码]计算机毕业设计基于Springboot校园招聘系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

jQuery 效果- 动画

jQuery animate() 方法允许您创建自定义的动画。 jQuery 动画实例 jQuery jQuery 动画 - animate() 方法 jQuery animate() 方法用于创建自定义动画。 语法: $(selector).animate({params},speed,callback); 必需的 params 参数定义形成动画的 CSS 属性。 …

如何优雅的排空节点上的pod?云服务商是如何回收机器的?

概述 在 Kubernetes 中,不仅容器和 Pod 可以更换,节点也可以更换。Kubernetes 中的节点是 VM、服务器和其他具有计算能力的实体 (其实对k8s来说就是一个对象),在这些实体中运行 Pod 和容器。 节点耗尽是一种允许用户…

Matplotlib入门[01]——Pyplot

Matplotlib入门[01]——Pyplot 参考: https://ailearning.apachecn.org/Matplotlib官网 使用Jupyter进行练习 Matplotlib简介 matplotlib 是一个 Python 的 2D 图形包。 在线文档:http://matplotlib.org ,提供了 Examples, FAQ, API, Galle…