下载和阅读Android源码

news2025/1/18 9:02:48

目录

    • 一、如何下载AOSP
      • 1.全量下载
      • 2.单个下载
      • 目录结构
    • 二、如何阅读AOSP
      • 1.要阅读哪些源码
      • 2.阅读源码的顺序和方式
        • 2.1 阅读顺序
        • 2.2 阅读方式
      • 3.用什么工具来阅读
        • 3.1 下载安装Source Insight
        • 3.2 导入AOSP源码
        • 3.3查看源码
    • 三、其他

一、如何下载AOSP

源码下载是我们分析源码的开始,Android源码可以全量下载,也可以单个下载。

1.全量下载

官方文档 https://source.android.com/source/downloading ,只要按照上面一步步做就可以了,但是由于需要翻墙,国内无法直接访问,而整个Android项目源码巨大,即便是翻墙后下载也很慢,所以还是使用国内镜像比较好。

我推荐清华大学开源镜像,地址 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ ,这上面也是有完整的教程,我就不复制粘贴了,但是有一点要注意,你一定要备一个比较大的磁盘,至少60个G吧,还不算后期编译的。

我们分析源码其实是不需要全部代码的,因为AOSP不仅包括系统源码,还有些工具代码,如aapt,adb等,这些我们根本不需要,而且即便是系统源码,也不是所有我们都需要看,如果真的全部看,你这辈子都看不完,所以我还是推荐大家单个下载。

2.单个下载

官方地址 https://android.googlesource.com/ ,比如我们要下载platform/frameworks/base/目录下的代码,我们可以git clone https://android.googlesource.com/platform/frameworks/base ,不过这个还是会遇到翻墙的问题,当然我们也可以用镜像。

镜像地址 https://aosp.tuna.tsinghua.edu.cn/ ,比如我们要下载platform/frameworks/base/目录,就用git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base ,如果你带宽够的话,一般几分钟就可以下载好你想要的单个源码了。

如果你想下载单个文件,或者搜索文件名及代码,可以访问 http://androidxref.com/ ,这里有部分Android的源码

目录结构

先上一张图,整个Android项目的架构图
在这里插入图片描述

我们都知道Android系统从上到下大致分为这四层,所以我们以这四层为基础,讲解下AOSP的目录结构:

  • 第一层:应用程序层(applications)对应根目录下platform/packages/apps
  • 第二层:应用程序框架层(application framework)对应根目录下的platform/frameworks
  • 第三层:运行库层包括运行库(libraries)和android运行时环境(android runtime)
  • libraries对应目录很多,其中libc库对应的是platform/bionic
  • android运行时环境,Core Libraries 对应根目录下的platform/libcore,Dalvik Virtual Machine 对应根目录下的platform/dalvik ,不过现在已经是ART了,所以目录是platform/art
  • 第四层:Linux内核层对应根目录下的kernel,每一个目录对应了一个kernel的版本,因为Android要兼容各种芯片,下面罗列一下:
  • goldfish 项目包含适用于所模拟的平台的内核源代码。
  • msm 项目包含适用于 ADP1、ADP2、Nexus One、Nexus 4、Nexus 5、Nexus 6、Nexus 5X、Nexus 6P、Nexus 7 (2013)、Pixel 和 Pixel XL 的源代码,可用作使用 Qualcomm MSM 芯片组的起点。
  • omap 项目用于 PandaBoard 和 Galaxy Nexus,可用作使用 TI OMAP 芯片组的起点。
  • samsung 项目用于 Nexus S,可用作使用 Samsung Hummingbird 芯片组的起点。
  • tegra 项目用于 Xoom、Nexus 7 (2012)、Nexus 9,可用作使用 NVIDIA Tegra 芯片组的起点。
  • exynos 项目包含适用于 Nexus 10 的内核源代码,可用作使用 Samsung Exynos 芯片组的起点。
  • x86_64 项目包含适用于 Nexus Player 的内核源代码,可用作使用 Intel x86_64 芯片组的起点。
  • hikey-linaro 项目用于 HiKey 参考板,可用作使用 HiSilicon 620 芯片组的起点。
  • 三、四层中间还有个硬件抽象层(HAL)对应根目录下的platform/hardware

目前我下载的目录如下:

git clone https://aosp.tuna.tsinghua.edu.cn/platform/packages/apps/Launcher2

git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base

git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/native

git clone https://aosp.tuna.tsinghua.edu.cn/platform/system/core

git clone https://aosp.tuna.tsinghua.edu.cn/platform/bionic

git clone https://aosp.tuna.tsinghua.edu.cn/platform/libcore

git clone https://aosp.tuna.tsinghua.edu.cn/platform/art

git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm

二、如何阅读AOSP

当我们把源码下载下来之后,会感到茫然无措,因为AOSP的源码实在是太多了,这里我们需要明确一些问题:

  • 要阅读哪些源码
  • 阅读源码的顺序和方式
  • 用什么工具来阅读

下面我将从这三个问题一一展开

1.要阅读哪些源码

这个问题是比较个性化的,因为不同的人从事着不同的工作,有的人从事应用开发,可能对Java层东西感兴趣;有的人从事Framework开发,可能对Framework层感兴趣;有的从事硬件开发,可能对底层实现感兴趣。

这个都因人而异,但是有一点,不能盲目地毫无目的地看源码,因为这样的话最终你会淹没在AOSP的大海里,看了一年半截啥都看了,却又感觉都没看透,别人问你源码的东西,都能说个一二,但是一往深了说,就不知所以了。

所以对于AOSP源码,不在于多,而在于精,你不要试图把所有的源码都看懂,你只要对自己感兴趣的那部分深入研究就可以,因为即便是Google工程师也不可能把AOSP全部读完。

对于我而言,我是从事应用层开发的,我主要会了解以下几个方面的源码:

  • Android系统启动流程,应用启动流程,四大组件启动流程,这将列入系统启动篇
  • 系统常用服务ActivityManagerService,WindowManagerService等,这将列入系统服务篇
  • 通信机制,主要是Binder和Handler,这将列入通信篇
  • 进程和线程的创建,运行,销毁,这将列入进程篇
  • View的绘制和显示流程,事件分发机制,这将列入图形绘制篇
  • Android虚拟机ART运行机制,类加载机制,Java注解,Java反射,这将列入虚拟机篇
  • Android对于Java集合的优化算法,这将列入Java基础篇

2.阅读源码的顺序和方式

2.1 阅读顺序

读源码是一个日积月累的过程,不可能一蹴而就,当我们列出自己感兴趣的源码后,我们需要制定一个阅读计划,先读什么再读什么。这个也是因人而异,根据自己的兴趣来就是,你最想读什么,那就排前面。

我一直在说兴趣,因为兴趣是最好的老师,只有你对一样东西感兴趣了,才会有动力去学,去研究,才会不觉得累,如果一开始就去啃一些你不感兴趣的东西,到头来也是乏味不专注的,理解的程度也是不深,而且很有可能失去信心,最后放弃阅读。

当然,如果你对好几样东西都感兴趣,那就有一些原则了:

  • 事物都讲究先后,就像树木扎根大地一样,先有大地,才有树木,基础的东西先看
  • 相互有关联的东西一起看,不要一会儿看系统启动,突然又去看事件分发什么的

2.2 阅读方式

Android系统涵盖的范围很广,从上层的应用程序,到Framework,再到Libraries以至硬件,从Java层到C++,就像一座几十层的大厦一样,每层都有楼梯,也有电梯,我们需要做的就是在大厦里上下穿梭。

当我们阅读某一个知识点源码的时候,不同的知识点有不同的阅读方式,有些适合从下往上读,比如系统启动流程,我是从事件开始的地方开始读,从init.cpp开始,然后到zygote进程,到Java虚拟机,最后到Luncher;

有些适合从上往下读,比如Activity的启动,我是从startActivity方法开始读,然后到ActivityThread,然后到ActivityManagerService;

有些适合两头从中间读,比如Binder,我是从Java层看到C++层,但是看到驱动那儿看不动了,然后就从接收Binder的地方往回看,最后在两端集中在驱动的地方前后对比,才将Binder看通。

这里还是有个好的方式,就是从事件触发的地方开始看是比较合适的。

3.用什么工具来阅读

Android 源码阅读神器当然是Source Insight
在这里插入图片描述

Source Insight的好处:

  • 支持方法跳转,类跳转,并且对C++支持很好
  • 支持文件搜索,java,c++,xml都支持,并且支持内容搜索
  • 支持一键导入,随时配置路径
  • 而且最重要的,导入文件数多的时候不卡

下面我讲讲如何使用Source Insight

3.1 下载安装Source Insight

自行百度,另外Source Insight还可配置跟Android Studio一样的Darcula主题,需另外下载。

3.2 导入AOSP源码

我目前还没有下载完整的AOSP源码,只是先下载了几个重要的源码。打开Source Insight,选择Project -> New Project,取个名字比如叫AOSP,点击OK

选择你要查看的源码目录,点击OK

选择需要将哪些目录下的源码导入,点击Add Tree

导入成功后会有很多文件列在下方,点击Close

3.3查看源码

现在进入项目还是一片空白,需要把工具栏打开,然后就可以看源码了

左边是方法和成员变量搜索,右边Project File是搜索类名,Project Symbol是内容搜索

还有一些快捷键,比如Ctrl+左键可以方法跳转,Alt+,是后退,Alt+.是前进,Ctrl+G 是跳转到指定行,Ctrl+F 搜索内容,有时我们会遇到方法无法跳转,这时我们需要点击Project,选择Synchronize Files,全局关联一下,如图

这里要注意导入的文件不要太多,太多会导致Synchronize失败,我们可以选择性地导入一些目录

我们在导入源码的时候,有时一些汇编的源码(以.s或.S结尾)无法导入,这时我们需要点击Options,选择File Type Options,在C/C++里添加.s和.S的支持,然后Close,如图

然后我们重新追加一些目录,点击Project,选择Add and Remove Projec Files,选择对应目录Add Tree即可,同时我们也可以选择Remove Tree删除对应目录源码,操作如下

三、其他

在真正开始阅读Android源码之前,最好是去了解一些C/C++的语法知识,因为源码核心的部分都是用C/C++写的,如果你对一些基础语法不太了解,会看得云里雾里的,这里我给大家推荐两本书《C标准库 中文版》和《C++标准库 中文第2版》,另外一些学习网站也不错:

  • 微软官方
  • 菜鸟教程
  • W3Cschool

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctfshow愚人杯web复现

easy_signin 题目url base64解码是face.png&#xff0c;尝试flag.txt和flag.php&#xff0c;base64加密后传入都不对&#xff0c;用index.php加密后传入&#xff0c;看源码 将后面的base64解密得到flag 被遗忘的反序列化 源码 <?php# 当前目录中有一个txt文件哦 error_r…

Unity- 游戏结束以及重启游戏

文章目录游戏结束以及重启游戏建个游戏结束页面编写委托类 游戏主角 以及 ui管理类的脚本重启游戏游戏结束以及重启游戏 思路&#xff1a;利用Canvas创建好覆盖全屏的结束页面&#xff0c;默认关闭。游戏结束时&#xff0c;玩家控制的对象发起委托&#xff0c;ui管理收下委托&…

electron+vue3全家桶+vite项目搭建【六】集成vue-i18n 国际化

文章目录注意引入1.引入依赖2.集成vue i18n3.测试代码4.封装多语言切换组件5.测试多语言切换6.优化代码注意 已发现 9.2.2版本的vue-i18n 如果使用cnpm安装&#xff0c;打包会报错&#xff0c;使用npm或者pnpm安装依赖没有问题 引入 如果需要多语言支持&#xff0c;那么最好…

【100个 Unity实用技能】 | Lua中获取当前时间戳,时间戳和时间格式相互转换、时间戳转换为多久之前

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

【AI大比拼】文心一言 VS ChatGPT-4

摘要&#xff1a;本文将对比分析两款知名的 AI 对话引擎&#xff1a;文心一言和 OpenAI 的 ChatGPT&#xff0c;通过实际案例让大家对这两款对话引擎有更深入的了解&#xff0c;以便大家选择合适的 AI 对话引擎。 亲爱的 CSDN 朋友们&#xff0c;大家好&#xff01;近年来&…

Python自动录入ERP系统数据

大家好&#xff0c;我是毕加锁。 今天给大家带来的是用Python解决Excel问题的最佳姿势 文末送书&#xff01; 文末送书&#xff01; 文末送书&#xff01; 项目总体情况 软件&#xff1a;Pycharm 环境: Python 3.7.9(考虑到客户可能会有不同操作系统&#xff0c;为了兼容性…

【小程序】django学习笔记3

今天我们来做数据库和django的关联。 根据之前的代码应该看得出来我想做一个获取访客的ip地址并计算访问次数的app&#xff0c;所以必然会用到数据库。 这里选择用的是mysql(因为免费) 不一样的是这里我们打算用django提供的orm框架对数据库进行操作。 一. 环境准备 首先安…

SLAM面试笔记(3) - 视觉SLAM

目录 1 紧耦合、松耦合的区别 &#xff08;1&#xff09;紧耦合和松耦合的区别 &#xff08;2&#xff09;紧耦合和松耦合的分类 &#xff08;3&#xff09;为什么要使用紧耦合 2 SIFT和SUFT的区别 3 视差与深度的关系 4 闭环检测常用方法 5 描述PnP算法 6 梯度下降法…

SQL基础

目录 1.库操作 2.表操作 3.表操作--修改 4.表操作 --删表 5.添加数据 管理数据 查询表中数据&#xff08;重点&#xff09; 判空条件 1.模糊条件查询 2.聚合查询&#xff08;函数&#xff09; 3.排序查询 4.分页查询 5.分组查询&#xff08;配合聚合函数用于统计&a…

C++模拟实现读写锁

文章目录一、读者写者问题二、读写锁1.读写锁的概念2.读写锁的设计(1)成员变量(2)构造函数和析构函数(3)readLock函数(4)readUnlock函数(5)writeLock函数(6)writeUnlock函数3.RWLock类代码三、测试读写锁一、读者写者问题 在编写多线程的时候&#xff0c;有一种情况是非常常见…

为什么黑客不黑/攻击赌博网站?如何入门黑客?

攻击了&#xff0c;只是你不知道而已&#xff01; 同样&#xff0c;对方也不会通知你&#xff0c;告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客&#xff0c;也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件&#xff1a;28岁小伙因赌博…

Linux 操作系统原理作业 - 行人与机动车问题

大三上学期操作系统原理这门课中&#xff0c;老师给了一道作业《行人与机动车问题》&#xff1b; 即Linux多线程下处理行人与机动车谁优先的问题&#xff0c;需要用到多线程和互斥量&#xff1b; 行人 - 机动 车问题 假设有一个路口&#xff0c;有很多行人和机动车需要通过&a…

1673_MIT 6.828 Homework xv6 lazy page allocation要求翻译

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 在计划表中看到了这样一份作业&#xff0c;做一个简单的翻译整理。原来的页面&#xff1a;Homework: xv6 lazy page allocation (mit.edu) 家庭作业&#xff1a;x…

代码版本M、RC、GA、Release等标识的区别

引言 最近听说spring framework有了重大版本调整&#xff0c;出了6.0的GA版本了 那GA是啥意思呢&#xff1f; 看了下spring 官网和代码仓库&#xff0c;除了GA&#xff0c;还有M、RC、Release等 Spring FrameworkLevel up your Java code and explore what Spring can do f…

[Java Web]element | 一个由饿了么公司开发的前端框架,让你快速构建现代化、美观的 Web 应用程序。

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Java Web ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一键三连&#x1f609;有写的不好的地方也欢迎指正&a…

【mybatis】mybatis的工作原理

目录一、工作流程二、说明2.1 构建SqlSessionFactory2.2 SqlSession的获取2.3 SqlSession执行语句三、源码结构3.1 接口层3.2 核心处理3.3 核心处理层四、代码示例4.1 通过inputStream构建SqlSessionFactory4.2 通过configuration构建SqlSessionFactory4.3 mybatis-config.xml示…

groovy环境搭建

什么是DSL? 领域特定语言DSL&#xff08;全称&#xff1a;domain specific language&#xff09; 常见的DSL语言有&#xff1a;UML、HTML、SQL、XML、Groovy 作用&#xff1a;解决某一特定领域的问题 什么是groovy? groovy是一种基于JVM的敏捷开发语言。 结合了Python、Ruby和…

Vite4+Vuejs3项目初步搭建,并部署多个vue项目到nginx

前提条件 1、熟悉命令行 2、已安装 16.0 或更高版本的 Node.js 参照vuejs官网的步骤&#xff0c;创建一个vue前端项目 当前vuejs的版本&#xff1a;3.2.47 npm init vuelatestVue.js - The Progressive JavaScript Framework√ Project name: ... vuejs3-project√ Add Type…

BitDock桌面美化工具 一直在后台偷偷上传东西,具体上传什么东西不知,一天耗费我几十个G的流量

通过流量防火墙监控发现bitdock一直在上传东西&#xff0c;目前截止发现已上传了40G的流量 ――――――――――――――――――――――― 程序名称&#xff1a;SystemAudioDetection.exe 程序说明&#xff1a; 路径&#xff1a;D:\BitDock\AudioEngine\SystemAudioDetecti…

【C 字符串】02 字符串函数(命令行参数)

Navigator一、strlen()函数—统计长度二、strcat()函数—拼接三、strncat()函数—strcat()的升级四、strcmp()和strncmp()—比较五、strcpy()和strncpy()—拷贝六、sprintf()函数—合并多个字符串七、其他可能用到的字符串函数八、ctype.h中的字符函数九、把字符串转换为数字十…