近来工作上须要订制一下Android系统,忽然发觉了Android系统对于嵌入式开发的重要性。大多数芯片厂商提供的BSP都是重点建立Android平台,Linux平台则稍为贬低一点。这么开发人员理应先摸透芯片厂商提供的AndroidBSP,在Android平台下验证了硬件功能,在这个基础上再去移植和建立Linux平台,以便前面遇见问题时快速地定位出是软件还是硬件的出了问题。
在网上搜索了一番,发觉好的Android书籍还是比较少,《深入理解Android内核设计思想(第2版)》看起来评价还不错基于嵌入式linux的智能手机应用系统研究,准备阅读一下。因为自己看书有写笔记的习惯,这么就随意分享到陌陌里吧,希望能起到一个督促自己多读书的作用,同时也希望能和更多人分享看法和知识。套用他人的话,岛是没有意义的,除非别的岛可以抵达它。信息是没有意义的,除非别的信息可以链接。文章里的内容并不艰深,只是记录一些实用的东西,而且采用理论和实践相结合的方式,配合具体开发板进行剖析,浓荫末节或则当前用不上的知识会被锯掉。
参考:
《深入理解Android内核设计思想(第2版)》
《Android系统源代码情境剖析》
序言Android诞生于硅谷的缘由是哪些哈佛学院的人才辈出;便利的交通环境,海陆空都可以挺好的和外界相连;鼓励创新,有建立的专利保护机制;建立而成熟的创投体系,能容忍高失败率;第2版和第1版有哪些区别基于AnroidN版本(即nougat,牛轧糖的意思),也就是Android7.x版本。市面上太多的Android书基于2.x或则4.x了,不太喜欢旧版本。部份章节保留和第1版一样,只能等作者下一次重印争取更新到Android最新版本;第一章Android系统简介Android系统有什么特征开放和扩充性,高度自由,随意订制;合理的分层构架,整个软件栈条理清晰,分工明晰,是一个值得所有程序员常年学习的优秀开源项目,无论是C/C++/JAVA程序员。易用强悍的SDK;不断改进的交互界面,追求用户体验;逐渐建立的生态系统,并且似乎Android平台的软件的赢利远远不如IOS平台。Android的免费开源增加了手机开发商的入门门槛,致使Android手机开发商参差不齐。运行速率相对IOS偏慢,Google在不断提高运行速率中。兼容性问题让AndroidAPP开发人员头痛,Android手机机型太多,屏幕规格码率五花八门,开发人员无法适配,目前Google也没有好的解决办法。Android系统的5层框架
从下往上依次为:
内核层(Linux+特定驱动):在Linux内核的基础上,添加了Google自己编撰的Binder和sharedmemory驱动。
硬件具象层(简称HAL):硬件厂商不乐意将自己的硬件驱动置于Linux里RED HAT LINUX 9.0,这么Android就整出了一个HAL层,让硬件厂商将硬件的核心控制逻辑保存在HAL里而且容许其闭源(即只提供.so库文件,不提供.c文件),在Linux内核驱动里只提供细度最小的操作函数,如读写寄存器。就是这些打擦边球的剌激行为保护了硬件厂商的利益,让各硬件厂商乐意为Android系统建立硬件驱动。
系统运行库层(AndroidRuntime,ART):多数是C/C++实现,简单地叫“C库层”都可以长春linux培训,包含了许多成熟的开源项目: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,这么建议瞧瞧《progit》这本书,有英文版,但是上面的内容挺简单实用的,有了git的基础再来实用repo会容易好多,下边简单瞧瞧怎样使用repo。
上述命令已然基本够用了,甚至倘若只是用于个人学习基于嵌入式linux的智能手机应用系统研究,完全可以将Android源码初始化为一个单独的git项目,使用repo只是为了便捷同步获取最新的Android源码。
嵌入式物联网须要学的东西真的特别多,千万不要学错了路线和内容,引起薪水要不起来!
无偿分享你们一个资料包,差不多150多G。上面学习内容、面经、项目都比较新也比较全!某鱼上买恐怕起码要好几十。
点击这儿找小助理0元发放:加陌陌发放资料
怎么下载Android源码怎么下载原汁原味的Android源码
在国外早已很难从Google的官网上下载到Android源码了,复旦学院做了Android源码的镜像。参考:
先获取repo:
$curl-orepo
$chmod+xrepo
$mvrepo/usr/bin/
最快捷的下载Android源码包的方法是使用初始化包进行初始化,自动下载初始化包:
大概30G,下载完成后校准一下MD5:
$md5sum-caosp-latest.tar.md5
aosp-latest.tar:OK
因为所有代码都是从隐藏的.repo目录中checkout下来的,只保留了.repo目录,下载后解压再reposync一遍即可得到完整的目录,参考下述命令:
怎样确定当前是那个版本的Android
$cat.repo/manifest.xml|greprevision
manifests里跟踪的是android-7.0.0_r1,sync下来的就是android-7.0.0_r1,也可以通过查看源码来确定:
$catbuild/core/version_defaults.mk|grep"PLATFORM_SDK_VERSION:="
PLATFORM_SDK_VERSION:=24
参考:
24就是Android7.0。
怎么切换出某个版本的Android
怎么下载基于真实开发板的Android源码
假如你不想用原生的Android源码来模拟运行Android,而是想在开发板上体验Android系统,可以参考这篇文章:
文章里描述的开发板为NanoPCT4(基于RK3399芯片),对应的Android7源码是保存在gitlab上的,没有使用repo,而是将Android7初始化为了一个git项目,置于gitlab上是为了提升下载的速率。对了,对应的编译步骤也在WiKi里,假若你是一个开发板爱好者,可以关注一下该WiKi网站里的开发板,品种诸多,性价比和文档资料都还不错。
怎么编译Android搭建环境
只考虑在64bitUbuntu14.04LTS以上的版本里编译Android7,编译其他版本的Android须要打算的环境是雷同的。
硬碟安装的64BitUbuntu14.04LTS或则以上版本。PC机硬件性能越高越好,建议使用8G显存+256GSSD的以上配置,Android源码很庞大,不要用虚拟机编译Android系统。
$sudoapt-getinstallbisong++-multilibgitgperflibxml2-utilsmakepython-networkxzip
$sudoapt-getinstallflexcurllibncurses5-devlibssl-devzlib1g-devgawkminicom
$sudoapt-getinstallopenjdk-8-jdk
$sudoapt-getinstallexfat-fuseexfat-utilsdevice-tree-compilerliblz4-tool
不同版本的Android须要不同版本的JDK,Android7要求open-JDK-8.0,选择JDK版本:
$update-alternatives--configjava
$update-alternatives--configjavac
怎么编译原生Android7
$cdaosp
$source./build/envsetup.sh#导入环境变量
$lunch#查看可选择的编译目标
$lunchaosp_arm64-eng#选择编译目标,arm64构架,eng工程师版本
$make-j4#开始编译,先去吃个饭,大多数机器编译Android都要等几个小时。
编译出错:
Android7.0上默认使用JACK编译器,在显存较小的机器编译时可能会出现上述问题,解决办法:
$exportJACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8-XX:+TieredCompilation-Xmx4g"
$./prebuilts/sdk/tools/jack-adminkill-server
$./prebuilts/sdk/tools/jack-adminstart-server
之后重新执行source/lunch/make命令,编译完成的提示信息如下:
####makecompletedsuccessfully(03:54(mm:ss))####
假如没有再度source/lunch,而是直接make,会没有makecompletedsuccessfully的提示,但毕竟也是编译成功了。
怎样模拟运行原生Android7
使用Android的模拟器Emulator来模拟运行。Emulator是Google基于开源项目qemu订制开发的,它用到核心技术是虚拟化,对于我们来说可以简单地理解为通过虚拟化技术在X86构架的PC机上虚拟了一台ARM构架的手机。我们完全没必要去剖析Emulator的源码,只要会用它来启动Android系统就可以了。在编译完系统后,执行下述命令启动Android:
疗效如下:
用到的核心文件包括:
这5个文件就可以构成一个完整的Android系统。
第二章的内容未完,待续...
文章链接: