赞
踩
1 Android 是什么
1 如何理解 Android
Android 是一种基于 Linux 的开放源代码软件栈,为各类设备和机型而创建。下图所示为
Android 平台的主要组件。
这个图是一个框架图,很多人看到这个其实会混淆一个逻辑,这里画的是每一层,但是没有
按照进程的方式去画,我在这个基础上补充了进程方式的一个框架,主要是启动过程。
Android 本身网上讲解的启动流程很多,那为什么我还要画这张图呢? 原因是网上讲的是
比较多,但是画出来的图,我在理解的时候,总是有偏差,自己在整理,想给别人传输概念
时候,发现网上的那些图总是会带来一些误导。
我在画这张图的时候,里面标注最明显的就是进程,以及一些线程的文字,我想传递出去的
就是,虚拟机是在 Zygote 里面,是属于内部的一个实现,然后其他的 APK 在 fork 的时候,
直接拿到了一个虚拟机。
而我们的 AMS PMS 这些,我画在了 system_server 进程里面,标注是线程。让你直观上去看
到 AMS 这些是在 system_server 进程内部,不会出现理解偏差。
在 Zygote 进程里面,我标注了一些 so jar apk 的信息,这些就是在 Zygote 进程启动时候,自
己首先加载了一堆库和资源,这样子我们启动 APK 的时候,从它这里 fork 的时候,就直接
带过去了,这样子我们 APK 就直接有了一个虚拟机,这样子就能解析执行 Java 语言编出来
的 DEX 字节码了。
说回来,Android 该怎么理解呢?我想简单的说下,就是我们有一堆硬件,想让更多的人开
发使用,于是我们研究了一套开发套件,这个开发套件定义了硬件的添加接口,以及别人开
发时候的一些 API,我们把这一套东西称之为一套解决方案。
而这个解决方案,我们把它称之为 Android。Android 就可以这么去理解,先弄清楚它整个是
什么。
2 如何从已有的知识类比到 Android
这里我们主要讲的是,是否有一定的开发基础。我们在学习一个新的知识的时候,一般来讲
是跟我们已知的信息进行类比的。比如内存地址,讲的时候就是用楼房门牌号去讲的。
这个在学习的时候是叫做类比法,非常重要。如果没有这技巧,你基本上学习新知识很慢,
这也是你跟大佬的差距。
这里说下怎么来学习 Android,已知的语言比如是 C,那么第一点就是开发 Android ,主要
语言是 Java,于是如何从 C 语言学习到 Java 语言,就是你第一个要做的事情。
学习完这个,下来就是搭建 Android 环境,开发 APP.而开发 APP 过程中使用的方法,系统接
口,就是我们 C 里面的库,有头文件和静态或者动态库组成。
这是我想说的,如何去找到这样的技巧,快速的进行比对,映射,最终以最高效的方式掌握
Android 开发,这个也是我们当时一个月内就对接了 Android 项目。
C 语言到 Java 语言,基本上一周内就适应的差不多,剩下的就是多看代码,多写,多翻资料,
已经属于边用边学。
然后 Android 的知识,就是去看看网上的资料,同时要知道每个动作的意义,从而很快的总
结出来学习路径,而且是可以给同事来讲的,让大家都能够跟着快速掌握 Android 的学习知
识。
3 都有哪些知识点需要掌握
这里我们主要讲一下 Framework 需要掌握的一些知识点,希望大家能有个概念。我们后面
会逐个展开。
Java 是 Android 主要的语言,所以相关的基础需要学扎实,基础的语法,用法,以及它的锁,
高级用法在系统中很常见,所以需要注意。还有一些常见的 Hash 用法,都是需要掌握的。
这里推荐基本经典的 Java 书籍,大家可以去翻阅。《Java 编程思想 》《Effective Java》
Java 虚拟机相关的去官网去看,同时的话,可以去下载 openJDK 的源码,我当时有些实现
不懂,就是翻看的这个代码学习的。
Android 相关的虚拟机,有几个人出的书,《Android Dalvik 虚拟机结构及机制剖析》《深入
理解 Android:Java 虚拟机 ART》。为什么还推荐老的虚拟机,主要是实现的逻辑一致,对
于建立概念非常用帮助。
然后在学习 Android 的时候,书籍推荐《疯狂 Android 讲义》《第一行代码》,我们在学习
的时候,可以参考 Android 中文网,还有一个 www.androiddevtools.cn 去找相关的资料,方
便入门。
在学习的时候最好是在 Ubuntu 环境下,我们经典的版本就是 12,14,16,我再新的环境没怎
么搭建了,大家安装的时候可以参考网上文档,现在这块很成熟了。VM 虚拟机+ubuntu 系
统+Andoird 源码。
源码我们从清华园去下载就可以了。
还有的知识就是 Git 操作,这块网络资料很多,推荐个
https://www.runoob.com/git/git-tutorial.html ,有些时候我们还会用到 SVN,因为有些时候客
户给的驱动代码,modem 是 c 源码,建立在 SVN 仓库,所以两个都去学习下。
可以在本地搭建环境进行提交,删除等操作。
然后 C/C++相关的知识也是需要的,因为 Android 虚拟机内部的实现,我们的 Java 服务,实
现最后都会到 C 的底层服务支撑,最终跑到驱动或者硬件响应。
这里推荐几本书,《C 与指针》《C Primer Plus》《你必须知道的 495 个 C 语言问题》
随后我们需要掌握操作系统相关的内容,这个主要是解决理解 Linux 底层驱动,设计,整个
上层的进程管理概念,进程间通信,没有这些概念没法深入 Android 系统。
《现代操作系统》《深入理解 Linux 驱动程序设计》《深入理解 LINUX 内核 第三版》
《Unix/Linux 系统编程》《鸟哥的 Linux 私房菜》《LINUX 设备驱动程序》
在这个之外还需要掌握 Python,Makefile 的相关知识,这个直接网上找找资料就可以了。
4 源码目录结构详细讲解
对于一个学习系统的人来说,每个目录都有什么,都是很熟悉的,这个也是没办法的,必须
要掌握。一个大牛你问他这个东西怎么解决,他们有时候没有答案,但是能够快速的定位出
来,最终搞定问题,这个主要就是依赖对系统整个目录的熟知,知道该从哪个方向去找答案。
于 是 我 们 这 里 说 下 这 块 的 内 容 , 让 大 家 对 整 个 的 目 录 有 个 感 知 。 在 线 看 源 码 :
http://www.androidos.net.cn/sourcecode 或者是 androidxref,我一般用的 androidxref,因为
可以快速检索。我建议本地也下载一份代码,去阅读学习。
我们在学习安卓的时候,要记得官网文档,非常重要。
https://developer.android.google.cn/guide/platform,再一个就是很多时候我们遇见问题,都
是从源码去找答案的,这个解决问题的能力才是最为关键的,也是在一般的视频课程中讲不
到的。
下来我们说下一些目录,后面我们会单独讲怎么找代码,怎么看源码。
Android 深入系统完全讲解
1 代码目录结构
abi 应用程序二进制接口
art ART 虚拟机
bionic Android 移植的 C 库
bootable 引导程序以及 recovery
build 存放系统编译规则及 generic 等基础开发包配置
cts Android 兼容性测试套件标准
dalvik dalvik 虚拟机
developers 开发者目录
development 应用程序开发相关
device 项目配置相关内容
docs 参考文档
external 三方开源库
frameworks 应用程序框架层,Android 应用开发核心代码,由 Java 和 C++编写
hardware 硬件抽象层代码
libcore 核心库相关文件
libnativehelper 动态库,实现 JNI 库的基础
ndk NDK 相关库和代码
out 编译过程和结果输出目录
packages 应用程序包,Settings/Dialer 等系统应用都在这里
pdk Plug Development Kit 的缩写,本地开发套件
platform_testing 平台测试
prebuilts 预编译的一些资源,参与编译过程
sdk sdk 和模拟器
system 底层文件系统库、应用和组件
toolchain 工具链文件
tools 工具文件
Makefile 全局 Makefile 文件,用来定义编译规则
kernel Linux 内核
vendor 厂商定制部分,比如 MTK/展讯三方客制化部分
标记红色的代表开发时候经常会去看的代码路径,更多细节可以在随后学习中不断扩充,这
个是我常去看的目录。
这里我们再详细说下 out 目录,很多人不注意,这个里面有大宝藏 ,学习的时候要多去看
看,对编译过程,流程,最终出来的文件有很好的理解。
2 out 目录结构
out/ 编译输出目录
out/host/ 主机可执行文件,作为工具使用
out/target/product/product 目标文件
boot.img Android 启动映像(Linux 内核+根 FS)
system.img Android 核心支撑镜像
userdata.img Android 开发应用程序和数据库,挂载在 data 分区
root/ 编译到 ramdisk.img 且合并到 boot.img
system/ 整体打包成 system.img
obj/ 中间对象文件
include/ 来自组件的已编译包含文件
lib/ 引用的库文件
STATIC_LIBRARIES/ 每个子目录显示对应的静态库生成过程文件
SHARED_LIBRARIES/ 每个子目录显示对应的动态库生成过程文件
EXECUTABLES/ 每个子目录显示对应的可执行文件生成过程文件
APPS/ 每个子目录显示对应的 APK 文件生成过程文件
out/target/common/obj/APPS
symbols/ 所有目标二进制代码的符号,在出现 native 异常时候使用 addr2line 工具定位代码
位置
这个里面基本都是常看的,所以不做标记,有任何疑问可以找我,参加我的训练营。我的
微信 code_gg_boy 。
我们再来看一个手机上的目录结构,基本上目录这一节就会讲到这里,后面会不断的展开。
3 手机目录结构
init.rc 初始化配置文件
dev/驱动节点
proc/ 虚拟节点,存储进程相关的内容
sys/ 系统/内核配置,可以通过此处驱动节点,读写驱动数据
sbin/ 系统启动二进制代码(ADB 后台程序;只读
system/ 来自 system.img(读-写)
– bin/ Android 系统二进制代码
– lib/ Android 系统库
– xbin/ 非必要二进制代码
– framework/ Android 框架组件(Java) – app/ Android 应用程序(Java) – priv-app/ 系统级别的应用程序
– etc/ Android 配置文件
– etc/permissions 权限信息
– etc/wifi wifi 配置信息
– etc/bluetooth 蓝牙配置信息
recovery/ 放置进入 recovery 模式的相关配置及应用
sdcard/ SD 卡挂载点
data/– app/ 用户安装的 Android 应用程序
– tombstones/Android 崩溃日志
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。