AOSP即Android Open Source Project,也就是Android系统源码的相关内容。这块代码巨多,而且牵扯比较广,需要各种各样的相关知识。不过AOSP的内容模块相对清晰,仔细啃还是可以的。
AOSP的相关参考资料也是很多的,我现在一般是跟着老罗的Android系统源码情景分析的书和博客搞事情,他的讲解都有源码和例子,废话比较少,比较易懂。同时他的内容比较多的涉及framework方面的东西,底层比如bionic,ART和dalvik虚拟机的部分相对就讲的少一点,所以我又搞了刘超的《深入解析Android5.0系统》这本书,两边现在都在慢慢啃。Anyway,资料这玩意只是辅助,提供思路,最后还是自己啃代码靠谱。
除了源码部分的内容,Android系统是基于Linux系统建立的,一定程度上讲Android其实算是运行在Linux操作系统上的软件,所以Linux的相关内容也是需要了解的。这部分资料就更多了,随意就行。
Android源码目前只能在Linux上编译使用,所以要看源码请移步Linux系统。我用的是Ubuntu,算是主流了吧。然后获取和运行源码需要以下工具:
sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl valgrind
这些工具都是用来获取和编译源码的,具体作用如下:
工具 | 作用 |
---|---|
flex and bison | 用来解析各种各样格式的文件 |
gperf | 用来生成高效的hash函数,并以C或C++代码形式给出 |
libsdl-dev | SDL(Simple DirectMedia Layer)的开发库 |
libesd0-dev | ESD(Enlightened Sound Daemon)开发库 |
libwxgt-dev | wxWidgets(主要用来开发夸平台C应用的C++库)开发库 |
build-essential | 各项build工具(gcc,g++等)的meta package |
zip | 压缩工具不用多说了吧 |
curl | 利用URL语法进行文件传输的工具 |
valgrind | 用于内存调试,内存泄漏检测和性能分析的工具 |
这些工具不是必须的,有些可能也已经有了,可以按需。
这部分不复杂,但是容易崩,因为aosp很大,sync一个20来G的玩意,如果从官方往下搞因为大家都知道的原因会很慢而且容易崩,甚至卡进度。所以推荐国内镜像,比如清华的镜像就很好,上边有详细的下载教程。
拿到源码之后,到根目录下,就可以开始编译。AOSP有一套自己的build系统,用来应对源码大量的编译整合工作,基本上原则就是分模块编译然后整合,并实现增量编译,并且可以根据设置编译不同版本和平台的Android系统源码。这部分就可以看好久了。。。尤其是我这种菜鸡。
最简单的编译命令是这样的:
. build/envsetup.sh
lunch
make
基本上就是envsetup.sh
构建环境,定义一些shell命令,然后lunch
选择想要编译的版本,最后make进行编译。第一次编译时间很长而且会有各种坑,比如我遇到了jdk版本问题,AOSP要求必须是OpenJDK。然后就是漫长的等待,推荐跪着编译,效果拔群。
玩游戏,就是要赢编译代码,就是为了运行,所以编译好以后就可以常识运行。默认情况下,模拟器自身在out/host/linux-x86/bin
里边,然后需要加载四个文件,分别是一个Linux内核镜像文件zImage
,默认为out/host/linux-x86/bin/kernel-qemu
;三个Android系统镜像文件system.img
, userdata.img
,以及ramdisk.img
,这仨货是编译生成的,在`out/target/product/generic
文件夹底下。运行的时候为了方便,可以把这些路径扔到系统变量里去。于是用以下命令执行:
export PATH = $PATH:/<path-to-aosp>/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT = /<path-to-aosp>/out/target/product/generic
emulator
这里,ANDROID_PRODUCT_OUT
是默认的emulator找Andorid系统镜像的地址,需要手动设置一下。另外,AOSP默认的Linux内核是没有源码的,需要看这部分的话需要单独下载。
这部分其实跟AOSP关系不大,但是可能需要针对不同机型的话就需要相对应修改这一部分。首先这部分要用git来把代码搞下来:
git clone https://android.googlesrouce.com/kernel/goldfish.git
其中,goldfish是模拟器用的内核版本,可以根据不同的版本需求用不同的库,其余类型还有common,exynos等。
拿到源码之后,checkout
一个分支出来就可以吃了。具体checkout
哪一个,需要看你的Android源码支持适配哪个版本,也就是之前运行用的那个image是哪个版本的。比如goldfish,可以到device/generic/goldfish
文件夹下边用git log
查看最新的commit,然后根据commit来checkout
相应的branch和commit就可以了。
再来就是编译内核,新版本的内核不需要太多配置,可以使用make help
查看有哪些合适的目标,然后使用make <target>
设置配置文件,最后再使用make
进行编译就可以了,最后会提示相应的文件所在的位置,把文件扔到上边运行虚拟机的配置里替换原来的内核就可以了。内核源码这部分还比较糊,后边要用的话再说。
问题描述:服务器重启之后,启动gitlab发现redis总是超时启动命令:gitlab-ctl start失败提示:down:redis:0s,normally up,want up;run:log:(pid 1022)1302s查看production.log日志:tail -f /var/log/gitlab/gitlab-rails/production.log报错信息:Error connecting to Redis on /var/opt/gitlab/redis
海明码简介 海明码其性能是检测一位错,是在奇偶校验码的思想上发展起来的,它在K位数据位中加入r个校验位,形成一个K+r位的新码字,并且将数据的每个二进制位分配到几个不同的奇偶校验组中。这样,当其中一位发生变化时,会引起有关的几个组出现奇偶校验错。通过这些出错组的不同组合,就能够指明是哪一位出现了错误,从而进行纠错。 使用海明码进行校验,首先需要确定校验码的位数。在本实验中,海明码只要求实现一位...
本文介绍了如何使用 MATLAB 实现遗传算法。遗传算法是一种模拟自然界生物进化机制的优化算法,它通过模拟自然选择、交叉和变异等操作来寻找问题的最优解。遗传算法通常包括以下步骤:定义问题的目标函数和约束条件,以及变量的编码方式。生成初始种群,即一组随机的可行解。计算每个个体的适应度值,即目标函数的值。选择操作,根据适应度值选择一部分个体进入下一代。交叉操作,对选中的个体进行染色体的交换,产生新的个体。变异操作,对某些个体的某些基因进行随机改变,增加种群的多样性。重复3-6步,直到满足终止
文章目录软件项目案例软件质量软件质量保证软件质量保证计划及其实施CMM对软件质量保证的要求本讲小结软件项目案例软件质量软件质量保证软件质量保证计划及其实施CMM对软件质量保证的要求本讲小结...
1、 准备条件1.1 工具准备 开发软件:VisualStudio2022,EFCore6.0 .net Core版本:.Net6.0 数据库:mysql8.0 数据库管理软件:Navicat2.EFCore的使用流程通过前面的描述我们来总结下,使用EFCore(CodeFirst)的基本流程:创建 DbContext 实例 根据上下文跟踪实体实例。创建 实体模型,在DbContext 实例类中添加DbSet<实体>属性。根据业务需求进行增删改查, 调用 SaveChan
HEVC一些工具汇总
第一次写博客,记录一下自己遇到的坑微信小程序的textarea组件如果在fixed定位区域内必须要加fixed=“true”,不然就会这样这个问题web开发工具体现不出来,只有在真机上才能体现出来...
47.驱动--i2c
------------------------ Standard Tab ------------------------ mm TMainMenu pm TPopupMenu mmi TMainMenuItem pmi TPopupMenuItem lbl TLabel edt TEdit mem TMemo btn TButto...
经典排序算法——堆排序(逆序)基本步骤构建小顶堆将堆顶元素与最后一个元素交换并减小数组范围对交换完的数组进行向下调整算法复杂度整体时间复杂度O(nlog n)构建小顶堆 O(nlog n)交换与向下调整 O(nlog n)public class HeapSort(){ //堆排序 public static void sort(int[] a){ int n =...