基于Ubuntu24.04,下载并编译Android12系统源码 (二)

1. 前言

上篇文章,我们基于Ubuntu24.04,已经成功下载下来了Android12的源码,这篇文章我们会接着上文,基于Ubuntu24.04来编译Android源码。

2. 编译源码

2.1 了解源码编译的名词

  • Makefile : Android平台的一个编译系统,其实就是用Makefile写出来的一个独立的项目,定义了编译的规则,实现了自动化编译。不仅要把分散在数百个git库中的代码整合起来,统一编译,而且把产物分门别类地输出到一个目录。打包成手机的Room,还可以生成应用开发时所使用的SDK,NDK等等,因此采用Makefile编写的编译系统, 也可以称之为Makefile编译系统。
  • Android.mk : 是Makefile编译系统的一部分,Android.mk是Android编译环境下的一个特殊的makefile文件,他是经过Android编译系统处理的,Android.mk中定义了一个模块必要的参数,使模块随着平台编译。通俗来讲,就是告诉编译系统,以什么样的规则编译源代码,并生成对应的目标文件。
  • Ninja : 致力于速度的小型编译系统,如果把其他编译系统看做是高级编程语言,那么Ninja就是汇编,使用Ninja的主要目的就是因为其编译速度非常快。
  • Soong : 谷歌用来替代Makefile编译系统,负责解析Android.bp文件,并将其转化为Ninja文件。
  • Blueprint : 用来解析Android.bp文件,翻译成Ninja语法的一个文件
  • kati : google专门为Android开发的一个小型的项目,基于Golang和C++,目的是把Android.makefile转化为Ninja文件。
  • Android.bp : 用来替换Android.mk的一个配置文件
2.1.1 Android.mk / Ninja / Soong / Blueprint / kati /Android.bp 的概念之间的联系

在这里插入图片描述

2.2 准备编译环境

使用build目录中的envsetup.sh脚本来初始化环境,这个脚本会引入其他的一些执行脚本。

source build/envsetup.sh

完成初始化环境的一个操作

make clobber

选择编译的目标,是envsetup.sh中定义的一个命令,用来让用户选择编译的目标

lunch

比如会显示出,这些可选的编译项

You're building on LinuxLunch menu... pick a combo:1. aosp_arm-eng2. aosp_arm64-eng3. aosp_blueline-userdebug4. aosp_blueline_car-userdebug5. aosp_bonito-userdebug6. aosp_bonito_car-userdebug7. aosp_car_arm-userdebug8. aosp_car_arm64-userdebug9. aosp_car_x86-userdebug10. aosp_car_x86_64-userdebug11. aosp_cf_arm64_auto-userdebug12. aosp_cf_arm64_phone-userdebug13. aosp_cf_x86_64_phone-userdebug14. aosp_cf_x86_auto-userdebug15. aosp_cf_x86_phone-userdebug16. aosp_cf_x86_tv-userdebug17. aosp_coral-userdebug18. aosp_coral_car-userdebug19. aosp_crosshatch-userdebug20. aosp_crosshatch_car-userdebug21. aosp_flame-userdebug22. aosp_flame_car-userdebug23. aosp_sargo-userdebug24. aosp_sunfish-userdebug25. aosp_taimen-userdebug26. aosp_trout_arm64-userdebug27. aosp_trout_x86-userdebug28. aosp_walleye-userdebug29. aosp_walleye_test-userdebug30. aosp_x86-eng31. aosp_x86_64-eng32. arm_krait-eng33. arm_v7_v8-eng34. armv8-eng35. armv8_kryo385-eng36. beagle_x15-userdebug37. beagle_x15_auto-userdebug38. car_x86_64-userdebug39. db845c-userdebug40. fuchsia_arm64-eng41. fuchsia_x86_64-eng42. hikey-userdebug43. hikey64_only-userdebug44. hikey960-userdebug45. hikey960_tv-userdebug46. hikey_tv-userdebug47. pixel3_mainline-userdebug48. poplar-eng49. poplar-user50. poplar-userdebug51. qemu_trusty_arm64-userdebug52. silvermont-eng53. uml-userdebug54. yukawa-userdebug55. yukawa_sei510-userdebug

这里选项名称的含义

  • build : 表示编译出的镜像,可以运行在什么环境
  • aosp : 代表Android的一个开源项目
  • arm/x86等 : 表示运行在ARM/X86处理器的架构上

BUILDTYPE 指的是编译类型,有以下三种:

  • user : 用来正式发布到市场的版本,权限受限,如没有root权限,不能 dedug,adb默认处于停用状态。
  • userdebug : 在user版本的基础上开放了root权限和debug权限,adb默认处于启用状态。一般用于调试真机。
  • eng :开发工程师的版本,拥有最大的权限(root等),具有额外调试工具的开发配置。一般用于模拟器。

这里我们要运行在模拟器上,所以可以选30

2.3 进行编译

然后进行编译

 make -j 6

如果设备的内存不足或性能不足,同时执行的任务数,即-j可以设置的小一下,比如设置为12,只不过编译的时间会变久。

最终会在 out/target/product/generic_x86/日录生成了三个重要的镜像文件:system.img、userdata.img、ramdisk.img

  • system.img:系统镜像,里面包含了Android系统主要的目录和文件,通过init.c进行解析并mount挂载到/system目录下。
  • userdata.img:用户镜像,是Android系统中存放用户数据的通过init.c进行解析并mount挂载到/data目录下。
  • ramdisk.img:根文件系统镜像,包含一些启动Android系统的重要文件,比如init.rc。

显示出如下信息,就表明编译成功了 : Build completed successfully
在这里插入图片描述

2.4 运行虚拟机

编译完成后,执行emulator命令运行虚拟机

emulator

在这里插入图片描述

遇到的问题 : ubuntu emulator 第一次启动起来了,第二次却提示找不到命令
解决办法 : ubuntu 打开Android模拟器(Android源码编译)提示:emulator:未找到命令

3. 单编

mm指的是只编译当前目录的模块,不编译所有模块。
当我们只修改了指定目录下的模块时,就可以使用这个命令,从而加快编译速度。

3.1 进入指定目录,执行mm命令

//进入指定目录
cd packages/apps/settings
//执行mm命令
mm

在这里插入图片描述

3.2 编译成功

显示出如下信息,就表明编译成功了 : Build completed successfully
在这里插入图片描述
除了Settings.odex文件,还会在out/target/product/generic_x86/system/priv-app/Settings日录下生生成Settings.apk

3.3 其他单编命令

此外还有以下命令可以进行单编 :

  • mmm : 编译指定目录下的模块,不编译它所依赖的其它模块。
  • mma : 编译当前目录下的模块及其依赖项。
  • mmma : 编译指定路径下所有模块,并且包含依赖,

3.4 单编完成后,怎么查看效果 ?

  • 方式一 : 可以在编译完成后,借助 adb install -r apk 路径直接将⽣成的 apk ⽂件安装到设备上,如果不是 APK,直接 push 对应的⽂件。

  • 方式二 : 可以编译好完成后,再使⽤ make systemimage ,重新⽣成 system.img,再运⾏模拟器也可。

详见 : 单编完成后,怎么查看效果 ?

3.4.1 如何查找文件

查找文件 -> 编译产物 out/target/

find <起始目录> -name <文件名>

比如可能位于 /out/target/product/generic_x86/system/system_ext/priv-app/Settings/Settings.apk

3.5 单编显示成功后,运行安卓模拟器,并没有生效

可以带上参数-wipe-data

emulator -wipe-data

详见 : Android源码单独编译某个模块

4. 其他

4.1 工具

查看源码

  • Android Studio for Platform
  • 下载地址 : https://developer.android.google.cn/studio/platform?hl=en

4.2 repo 下载源码中途中断

使用git fetch命令:‌如果repo sync命令在下载过程中中断,‌可以尝试进入.repo/projects/prebuild目录,‌并执行git fetch命令来继续同步未完成的源码。‌这种方法适用于在下载过程中遇到网络问题或其他原因导致下载中断的情况。‌

4.3 参考

手把手教你编译和调试AOSP源码
带你玩转编译Android系统源码!

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

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

相关文章

CMake 生成器表达式介绍

【写在前面】 生成器表达式在构建系统生成期间进行评估&#xff0c;以生成特定于每个构建配置的信息。它们的形式为 $<...>。例如&#xff1a; target_include_directories(tgt PRIVATE /opt/include/$<CXX_COMPILER_ID>) 这将扩展为 “/opt/include/GNU”、“/opt…

CV项目整理

1. 爬取+展示的实时项目 1.1 核心技术 myqls + maxwell + redis+django 实现读写分离,实时项目,主从复制,读写分离,顺写日志。 maxwell将自己伪装成为slave,就可以从Mysql的集群中获取顺写日志Binlog maxwell取得的数据格式json 1.2 流程 1.3优化查询 下面的查询,笛卡尔…

如何通过sip信令以及抓包文件分析媒体发到哪个地方

前言 问题描述&#xff1a;A的媒体没转发到B&#xff0c;B只能听到回铃音&#xff0c;没有A的说话声音&#xff0c;并且fs这边按正常的信令发送了. 分析流程 分析早期媒体发送到哪一个IP 10.19.0.1发送了一个请求给10.19.0.157这个IP&#xff0c;然而这里的SDP媒体地址&am…

Flink(一)

目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用&#xff1f; 典型的事件驱动示例 数据分析应用流式分析应用的优势&#xff1f;Flink 如…

RabbitMQ 安装(Windows版本)和使用

安装 安装包获取 可以自己找资源&#xff0c;我这里也有百度云的资源&#xff0c;如果没失效的话可以直接用。 通过百度网盘分享的文件&#xff1a;RabbitMQ 链接&#xff1a;https://pan.baidu.com/s/1rzcdeTIYQ4BqzHLDSwCgyw?pwdfj79 提取码&#xff1a;fj79 安装教程…

Pr 视频效果:闪光灯

视频效果/风格化/闪光灯 Stylize/Strobe Light 闪光灯 Strobe Light效果可用于在视频中创建闪烁或频闪的效果&#xff0c;类似于舞台上的频闪灯或摄影中的闪光灯。 ◆ ◆ ◆ 效果选项说明 通过调整各种参数&#xff0c;可以自定义闪光的颜色、频率、持续时间和混合模式&#…

深入理解ThreadLocal底层原理

ThreadLocal是线程私有的&#xff0c;各个线程之间是隔离的。可以想象一下每次线程创建的时候在堆上预先分配一个内存空间用于存储ThreadLocal的数据。 &#xff08;1&#xff09;当线程被创建时&#xff0c;线程都会有一个成员变量ThreadLocalMap。 //每个线程定义一个成员变…

构建自然灾害预警决策一体化平台,筑牢工程安全数字防线

近年来&#xff0c;国家和部委也强调了要切实加强地质灾害监测预警。作为国内智慧应急领域的先行者&#xff0c;Mapmost持续探索利用数字孪生技术&#xff0c;推进自然灾害风险预警精细化&#xff0c;强化对监测数据的综合分析和异常信息研判处置。建立健全区域风险预警与隐患点…

使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南

使用 Qt GRPC 构建高效的 Trojan-Go 客户端&#xff1a;详细指南 初识 Qt 和 gRPC 什么是 Qt&#xff1f;什么是 gRPC&#xff1f; 项目结构概述创建 proto 文件定义 API 下载 api.proto 文件解析 proto 文件 1. package 与 option 语句2. 消息类型定义 TrafficSpeedUserUserSt…

CI/CD 的原理

一、CI/CD 的概念 CI/CD是一种软件开发流程&#xff0c;旨在通过自动化和持续的集成、测试和交付实现高质量的软件产品。 CI(Continuous Integration)持续集成 目前主流的开发方式是协同开发&#xff0c;即多位开发人员同事处理同意应用不同模块或功能。 如果企业在同一时间将…

LabVIEW开发的控制阀监控与维护系统

LabVIEW开发一套自动测试软件&#xff0c;用于控制阀的实时监控、数据采集、维护管理以及报警通知。此系统的目标是通过便捷的操作界面、可靠的通信接口和高效的数据管理&#xff0c;为工厂设备管理提供全面的支持。 1. 项目需求 目标是实现一个控制阀管理系统&#xff0c;能够…

采用STM32CubeMX和HAL库的外部中断设计实例

目录 STM32F1外部中断的硬件设计 STM32F1外部中断的软件设计 通过Keil MDK实现工程 通过Keil MDK实现工程的步骤如下&#xff1a; 中断在嵌入式应用中占有非常重要的地位&#xff0c;几乎每个控制器都有中断功能。中断对保证紧急事件在第一时间处理是非常重要的。 设计使用外…

Python酷库之旅-第三方库Pandas(173)

目录 一、用法精讲 796、pandas.Float32Dtype类 796-1、语法 796-2、参数 796-3、功能 796-4、返回值 796-5、说明 796-6、用法 796-6-1、数据准备 796-6-2、代码示例 796-6-3、结果输出 797、pandas.Float64Dtype类 797-1、语法 797-2、参数 797-3、功能 797-…

Bi-LSTM-CRF实现中文命名实体识别工具(TensorFlow)

项目源码获取方式见文章末尾&#xff01; 回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【MobileNetV2实现实时口罩检测tensorflow】 2.【卫星图像道路检测DeepLabV3P…

AI 聊天机器人的兴起:GPT-3 和 BERT 如何重新定义对话体验

一、说明 当我们深入研究 AI 世界时&#xff0c;了解自然语言处理 &#xff08;NLP&#xff09; 领域取得的巨大进步非常重要。NLP 是 AI 的一个分支&#xff0c;专注于使计算机能够理解、解释和生成人类语言。GPT-3 和 BERT 等语言模型的开发是这一旅程中的一个重要里程碑&…

1FreeRTOS学习(队列、二值信号量、计数型信号量之间的相同点和不同点)

相同点&#xff1a; &#xff08;1&#xff09;传递区间 队列、二值信号量、计数型信号量均可用在任务与任务&#xff0c;任务与中断之间进行消息传递 &#xff08;2&#xff09; 传递方式 创建队列--发送队列--接受队列 创建二值信号量--发送二值信号量--接受二值信号量 创建计…

UDP(用户数据报协议)端口监控

随着网络的扩展&#xff0c;确保高效的设备通信对于优化网络功能变得越来越重要。在这个过程中&#xff0c;端口发挥着重要作用&#xff0c;它是实现外部设备集成的物理连接器。通过实现数据的无缝传输和交互&#xff0c;端口为网络基础设施的顺畅运行提供了保障。端口使数据通…

技术成神之路:设计模式(二十三)解释器模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;用于定义一种语言的文法表示&#xff0c;并提供一个解释器来处理这种文法。它用于处理具有特定语法或表达…

STM32G4 双ADC模式之同时注入模式

目录 概述 1 认识双ADC模式 2 功能实现 2.1 功能介绍 2.2 实现原理 概述 本文主要介绍STM32G4 双ADC模式之同时注入模式的相关内容&#xff0c;包括ADC模块的功能介绍&#xff0c;实现框架结构&#xff0c;以及注入模式ADC的转换的实现原理。 1 认识双ADC模式 双ADC模式可…

Python数据分析NumPy和pandas(十五、pandas 数据加载、存储和文件格式)

大多数时候&#xff0c;我们要处理分析的数据是存储在不同格式的文件中的&#xff0c;有txt、csv、excel、json、xml以及二进制等磁盘文件格式&#xff0c;还有时候是从数据库以及从Web API中交互获取要处理的数据。现在开始学习如何用pandas从以上内容中输入和输出数据。 读取…