您的位置 首页 java

<深入理解Android内核设计思想>笔记1:Android7简介

最近工作上需要定制一下Android系统,突然发现了Android系统对于 嵌入式 开发的重要性。大多数芯片厂商提供的 BSP 都是重点完善Android平台, Linux 平台则稍微轻视一点。那么开发人员理应先摸清芯片厂商提供的Android BSP,在Android平台下验证了硬件功能,在这个基础上再去移植和完善Linux平台,便于后面遇到问题时快速地定位出是软件还是硬件的出了问题。

在网上搜索了一番,发现好的Android书籍还是比较少,《深入理解Android内核设计思想(第2版)》 看上去评价还不错,打算阅读一下。由于自己看书有写笔记的习惯,那么就随便分享到微信里吧,希望能起到一个督促自己多读书的作用,同时也希望能和更多人分享想法和知识。套用别人的话,岛是没有意义的,除非别的岛可以到达它。信息是没有意义的,除非别的信息可以链接。文章里的内容并不高深,只是记录一些实用的东西,并且采用理论和实践相结合的方法,配合具体开发板进行分析,繁枝末节或者当前用不上的知识会被砍掉。

参考:

《深入理解Android内核设计思想(第2版)》

《Android系统源代码情景分析》

前言

Android诞生于 硅谷 的原因是什么

  1. 斯坦福大学 的人才辈出;
  2. 便利的交通环境,海陆空都可以很好的和外界相连;
  3. 鼓励创新,有完善的专利保护机制;
  4. 完善而成熟的风投体系,能容忍高失败率;

第2版和第1版有什么区别

  1. 基于Anroid N版本(即nougat,牛轧糖的意思),也就是 Android 7.x 版本。市面上太多的Android书基于2.x或者4.x了,不太喜欢旧版本。
  2. 部分章节保留和第1版一样,只能等作者下一次再版争取更新到Android最新版本;

第一章Android系统简介

Android系统有哪些特点

  1. 开放和扩展性,高度自由,随便定制;
  2. 合理的分层架构,整个软件栈条理清晰,分工明确,是一个值得所有 程序员 长期学习的优秀开源项目,无论是C/ C+ +/ JAVA程序员
  3. 易用强大的SDK;
  4. 不断改进的交互界面,追求用户体验;
  5. 逐步完善的生态系统,但是貌似Android平台的软件的盈利远远不如IOS平台。
  6. Android的免费开源降低了手机开发商的入门门槛,导致Android手机开发商良莠不齐。
  7. 运行速度相对IOS偏慢, Google 在不断提升运行速度中。
  8. 兼容性问题让Android APP开发人员头疼,Android手机型号太多,屏幕尺寸分辨率五花八门,开发人员难以适配,目前Google也没有好的解决办法。

Android系统的5层框架

<深入理解Android内核设计思想>笔记1:Android7简介

从下往上依次为:

内核 层(Linux+特定驱动): 在Linux内核的基础上,添加了Google自己编写的Binder和shared memory驱动。

硬件抽象层(简称HAL): 硬件厂商不愿意将自己的硬件驱动放在Linux里,那么Android就整出了一个HAL层,让硬件厂商将硬件的核心控制逻辑保存在HAL里并且允许其闭源(即只提供.so库文件,不提供.c文件),在Linux内核驱动里只提供粒度最小的操作函数,如读写寄存器。就是这种打擦边球的刺激行为保护了硬件厂商的利益,让各硬件厂商愿意为Android系统完善硬件驱动。

系统运行库层(Android Runtime,ART): 多数是C/C++实现,简单地叫“C库层”都可以,包含了许多成熟的开源项目: webkit opengl 、sqlite等,我们学习Android应该只要理解Android是如何使用这些C库,而这些C库是如何实现的跟我们关系不大。

应用程序框架层: 叫“Java库层”更好理解。它为上层应用提供了API接口,同时也包括了不少系统级服务进程的实现。

应用程序层: 各种系统原生应用和第三方应用,个人怀疑CPU厂商和手机厂商主要是定制这一层。

第二章Android源码下载和编译

参考资料:

如何管理Android源码庞大的源代码?

Android源码是由许多开源项目构成的,对于Google来说是要长期同时关注Android所有相关的开源项目的,这么多的开源项目用git来管理太吃力了,所以Google用Python编写了一个脚本工具repo,在git上多加了一层封装,用这个repo工具才能达到正常管理Android里的总多子项目的目的。repo本质上还是调用git命令,所以repo在操作也挺类似git,如果你不熟悉git,那么建议看看《pro git》这本书,有中文版,并且里面的内容挺简单实用的,有了git的基础再来实用repo会容易很多,下面简单看看如何使用repo。

<深入理解Android内核设计思想>笔记1:Android7简介

上述命令已经基本够用了,甚至如果只是用于个人学习,完全可以将Android源码初始化为一个单独的git项目,使用repo只是为了方便同步获取最新的Android源码。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取:

<深入理解Android内核设计思想>笔记1:Android7简介

<深入理解Android内核设计思想>笔记1:Android7简介

如何下载Android源码

如何下载原汁原味的Android源码

在国内已经很难从Google的官网上下载到Android源码了,清华大学做了Android源码的镜像。参考:

先获取repo:

$ curl -o repo

$ chmod +x repo

$ mv repo/usr/bin/

最快捷的下载Android源码包的方式是使用初始化包进行初始化,手动下载初始化包:

大约30G,下载完成后校验一下MD5:

$ md5sum -c aosp-latest.tar.md5

aosp-latest.tar: OK

由于所有代码都是从隐藏的.repo 目录中 checkout 出来的,只保留了.repo 目录,下载后解压再 repo sync 一遍即可得到完整的目录,参考下列命令:

<深入理解Android内核设计思想>笔记1:Android7简介

如何确定当前是哪个版本的Android

$ cat.repo/manifest.xml | grep revision

<defaultrevision=”refs/tags/android-7.0.0_r1″

manifests里跟踪的是android-7.0.0_r1,sync出来的就是android-7.0.0_r1,也可以通过查看源码来确定:

$ cat build/core/version_defaults.mk | grep “PLATFORM_SDK_VERSION:=”

PLATFORM_SDK_VERSION:= 24

参考:

24就是Android7.0。

如何切换出某个版本的Android

<深入理解Android内核设计思想>笔记1:Android7简介

如何下载基于真实开发板的Android源码

如果你不想用原生的Android源码来模拟运行Android,而是想在开发板上体验Android系统,可以参考这篇文章:

文章里描述的开发板为NanoPC T4(基于RK3399芯片),对应的Android7源码是保存在gitlab上的,没有使用repo,而是将Android7初始化为了一个git项目,放在gitlab上是为了提高下载的速度。对了,对应的编译步骤也在WiKi里,如果你是一个开发板爱好者,可以关注一下该WiKi网站里的开发板,品种众多,性价比和文档资料都还不错。

如何编译Android

搭建环境

只考虑在64bit Ubuntu14.04 LTS以上的版本里编译Android7,编译其他版本的Android需要准备的环境是雷同的。

硬盘安装的64BitUbuntu14.04 LTS或者以上版本。PC机硬件性能越高越好,建议使用8G内存 + 256G SSD的以上配置,Android源码很庞大,不要用虚拟机编译Android系统。

$ sudo apt-get install bison g++-multilib git gperf libxml2-utils makepython-networkx zip

$ sudo apt-get install flex curl libncurses5-dev libssl-dev zlib1g-devgawk minicom

$ sudo apt-get install openjdk-8-jdk

$ sudo apt-get install exfat-fuse exfat-utils device-tree-compilerliblz4-tool

不同版本的Android需要不同版本的JDK,Android7要求open-JDK-8.0,选择JDK版本:

$ update-alternatives –config java

$ update-alternatives –config javac

如何编译原生Android7

$ cd aosp

$ source ./build/envsetup.sh # 导出环境变量

$ lunch # 查看可选择的编译目标

$ lunch aosp_arm64-eng # 选择编译目标,arm64架构,eng工程师版本

$ make -j4 # 开始编译,先去吃个饭,大多数机器编译Android都要等几个小时。

编译出错:

<深入理解Android内核设计思想>笔记1:Android7简介

Android7.0上默认使用JACK编译器,在内存较小的机器编译时可能会出现上述问题,解决办法:

$ export JACK_SERVER_VM_ARGUMENTS=”-Dfile.encoding=UTF-8-XX:+TieredCompilation -Xmx4g”

$ ./prebuilts/sdk/tools/jack-admin kill-server

$ ./prebuilts/sdk/tools/jack-admin start-server

然后重新执行source/lunch/make命令,编译完成的提示信息如下:

<深入理解Android内核设计思想>笔记1:Android7简介

#### make completedsuccessfully (03:54 (mm:ss)) ####

如果没有再次source/lunch,而是直接make,会没有make completed successfully的提示,但其实也是编译成功了。

如何模拟运行原生Android7

使用Android的模拟器Emulator来模拟运行。Emulator是Google基于开源项目qemu定制开发的,它用到核心技术是虚拟化,对于我们来说可以简单地理解为通过虚拟化技术在X86架构的PC机上虚拟了一台ARM架构的手机。我们完全没必要去分析Emulator的源码,只要会用它来启动Android系统就可以了。在编译完系统后,执行下列命令启动Android:

<深入理解Android内核设计思想>笔记1:Android7简介

效果如下:

<深入理解Android内核设计思想>笔记1:Android7简介

用到的核心文件包括:

<深入理解Android内核设计思想>笔记1:Android7简介

这5个文件就可以构成一个完整的Android系统。

第二章的内容未完,待续…

文章链接:

转载自:老吴嵌入式 ,作者 可爱的东东

文章链接: <深入理解Android内核设计思想>笔记1:Android7简介_下载_编译_运行

文章来源:智云一二三科技

文章标题:<深入理解Android内核设计思想>笔记1:Android7简介

文章地址:https://www.zhihuclub.com/200768.shtml

关于作者: 智云科技

热门文章

网站地图