Android编译篇(前三章)
# Android系统简介
2005年4月,谷歌收购Android
2007年11月,安卓的第一个SDK版本发布
2008年9月,Android1.0版本发布
# 安卓系统特点
- 开发与扩展性
- 合理的分层架构
- 原先的android是只有四层,后因为版权问题,在kernel层之上新增了硬件抽象层
- 易用强大的SDK
- SDK是操作系统与开发者之间的接口,也就是一个系统对外的窗口;android sdk覆盖很广,从线程管理、进程通信等到各种界面组件
- 不断改进的交互界面
- 完善的生态系统
- .......
# Android 系统框架
烂大街的知识了,这里贴个清朝老图吧:
# Android源码和编译
# 基于repo和git的版本管理
在repo环境下,版本修改和提交的流程:
- 用repo创建新分支,通常不建议在master分支上操作
- 开发者根据需求对项目修改
- git add 将修改提交到暂存区
- git commit 将修改提交到仓库
- repo upload 将修改提交到代码服务器
# repo命令
同步:repo sync
,同步当前所有的项目
# 系统编译
由于Android系统通常运行在类似Arm (opens new window) 这种嵌入式平台,因此会涉及到交叉编译。简单来说,交叉编译需要宿主机、目标机、交叉编译器,即在宿主机上运行交叉编译器,输出可用于目标机可执行的编译器。
# 定制产品的编译与烧录
如何在原生态的Android系统中添加自己的定制产品?⬇️
其实是在Android源码项目下的device文件夹下,进行一些列操作,这里略过
# Android系统映像文件
重点来了,之前一堆源码下载,系统编译,以及定制化编译等,结果有什么用呢?
编译成果后,会得到我们需要的映像文件,就和虚拟机的一个xx系统一样的映像文件,可以说这样一个“我们的安卓系统”也就产生了,下面介绍下这些映像文件
boot.img : 其由四部分组成,boot header、kernel、ram disk、second stage
- boot header:存储内核启动参数,占据一个page大小,即4kb
- kernel:内核程序是整个Android系统的基础,可以通过--kernel指定内核映射文件路径
- ramdisk:虚拟内存盘,通过软件技术给一部分RAM模拟成硬盘技术,极大提高访问速度,这也是为什么说它是Android系统启动的关键
- second stafge:可选项,用于扩展功能
ramdisk.img(比较重要,再谈谈):Android系统文件都是以.img为后缀名,这里对其执行file命令,得到一个gzip的压缩文件,更名gz后解压,最后可以得到各种文件和文件夹,常用的system目录,data目录以及init程序等都包含在ramdisk中。由此看来,其在Andorid系统的启动过程中发挥重要作用
system.img:这个文件解压出来的文件夹包括:app、bin、etc、fonts、lib等等,由此看来该文件包含了设备/system节点中的相关内容
# Android编译系统
# makefile入门
makefile (opens new window)是一个脚本文件,由make程序来解析
定义:makefile是一个工程文件的编译规则,make则是一个构建自动化工具,运行make,则会在当前目录下寻找makefile,根据其中定义的规则完成构建任务
[target] ... : [prerequisites] ...
<tab>[command]
...
...
2
3
4
5
- targets:规则的目标
- prerequisites:可选的要生成 targets 需要的文件或者是目标。
- command:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。
# make编译样例
testc.h
#include "testc.h"
int main()
{
fun();
return 0;
}
2
3
4
5
6
7
8
testc.c
#include "testc.h"
void fun()
{
printf("hello\n");
}
2
3
4
5
6
7
main.c
#include "testc.h"
int main()
{
fun();
return 0;
}
2
3
4
5
6
7
8
makefie
maketest:main.o testc.o
gcc -o maketest main.o testc.o
2
makefile文件记得后缀写makefile,不然make程序不能识别找到,然后在当前目录下执行make命令,生成如下的文件:
简单来说,每个工程都需要编译,比如c源码需要经过gcc编译,java需要经过jvm编译,makefile则是帮助我们定义好这些编译规则,make自动帮我们编译,make工具是十分强大的,有很多隐含规则,比如自动推导等
# Android编译系统
编译流程: 初始化环境——》构建依赖树——》执行编译流程——》打包
🐶后续....