基于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
  • 安装AS : https://developer.android.google.cn/studio/install?hl=zh-cn

4.2 repo 下载源码中途中断

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

4.3 参考

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

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

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

相关文章

鸿蒙网络编程系列28-服务端证书锁定防范中间人攻击示例

1. TLS通讯中间人攻击及防范简介 TLS安全通讯的基础是基于对操作系统或者浏览器根证书的信任&#xff0c;如果CA证书签发机构被入侵&#xff0c;或者设备内置证书被篡改&#xff0c;都会导致TLS握手环节面临中间人攻击的风险。其实&#xff0c;这种风险被善意利用的情况还是很…

PHP企业门店订货通进销存系统小程序源码

订货通进销存系统&#xff0c;企业运营好帮手&#xff01; &#x1f4e6; 开篇&#xff1a;告别繁琐&#xff0c;企业运营新选择 嘿&#xff0c;各位企业主和创业者们&#xff01;今天我要给大家介绍一款超实用的企业运营神器——“订货通进销存系统”。在这个数字化时代&…

Docker入门之构建

Docker构建概述 Docker Build 实现了客户端-服务器架构&#xff0c;其中&#xff1a; 客户端&#xff1a;Buildx 是用于运行和管理构建的客户端和用户界面。服务器&#xff1a;BuildKit 是处理构建执行的服务器或构建器。 当您调用构建时&#xff0c;Buildx 客户端会向 Bui…

Element UI

Element ui 就是基于vue的一个ui框架,该框架基于vue开发了很多相关组件,方便我们快速开发页面。 官网: https://element.eleme.io/#/zh-CN 安装Element UI vue init webpack element(项目名)确认项目是否构建成功&#xff1a;进入到项目的根路径 执行 npm start 访问 h…

NSSCTF

[NSSRound#1 Basic]basic_check nikto扫描 nikto -h url PUT请求&#xff0c;如果不存在这个路径下的文件&#xff0c;将会创建&#xff0c;如果存在&#xff0c;会执行覆盖操作。 [NSSRound#8 Basic]MyDoor if (isset($_GET[N_S.S])) {eval($_GET[N_S.S]); } php特性&#…

形式架构定义语言(ADL)

简介 形式规范 多年来&#xff0c;学术界一直在试图通过使用与测试截然不同且更加主动的方法来确保程序语义的正确执行&#xff1a;形式化方法。研究者们认为这种方法通过更加精确、无二义性的描述来达到让程序绝对地按照设计者的思想执行的目的。这种思想早期体现在Floyd在1…

STM32之OLED驱动函数

类似51单片机中的LCD1602驱动差不多&#xff0c; 1.oled驱动代码 oled.c #include "stm32f10x.h" #include "OLED_Font.h"/*引脚配置*/ #define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) #define OLED_W_SDA(x) GPIO_WriteBi…

Python入门(二)编程中的“真”与“假”,单双向选择的判断

编程中的“真”与“假” 在编程中&#xff0c;这种“真”、“假”状态我们用布尔数来表示&#xff0c;“真”是True&#xff0c;“假”是False。 另一种方式&#xff0c;是通过比较运算得到。 如图&#xff0c;3赋值给a&#xff0c;1赋值给b&#xff0c;进行大小的比较。 a &g…

U9的插件开发之BE插件(1)

U9插件可分为&#xff1a;BE插件、BP插件、UI插件&#xff1b; BE(Business Entity) 简单就是指实体&#xff0c;U9的元数据。 我的案例是设置BE默认值&#xff0c;即在单据新增时&#xff0c;设置单据某一个字段的默认值&#xff0c;具体如下&#xff1a; 1.插件开发工具&a…

Linux的目录结构 常用基础命令(2)

Linux的目录结构 根目录&#xff1a; 所有分区、目录、文件等的位置起点 整个树形目录结构中&#xff0c;使用独立的一个“/”表示 常见的子目录 /root /bin /boot /dev /etc /home /var /usr /sbin 基础知识 以 . 开头的文件均为隐藏文件 路径用/分开 / 不在第一位就…

plsql 高版本用不了 expaste 插件 问题

plsql 高版本用不了 expaste 插件 问题 其实不是版本问题&#xff0c;而是高版本的咩有在用这个插件&#xff0c;在另外一个功能里面&#xff0c; 查询你要的数据&#xff0c; 选择数据&#xff0c;右键&#xff0c;点 右键 复制为表达式列表&#xff0c;即可 在空白处粘贴…

【C++】C++11基础入门

目录 一、C11发展史&#xff1a; 二、列表初始化&#xff1a; 1、初始化&#xff1a; 2、initializer_list函数&#xff1a; 三、声明&#xff1a; 1、auto自动识别类型&#xff1a; 2、decltype&#xff1a; 3、nullptr&#xff1a; 四、范围for&#xff1a; 五、STL…

vue3+vue-baidu-map-3x 实现地图定位

文档地址&#xff1a;一个是2一个是3 https://dafrok.github.io/vue-baidu-map/#/zh/index vue-baidu-map-3x 1.首先要到百度地图开放平台上建一个账号&#xff0c;如果有百度账号可以直接登录百度地图-百万开发者首选的地图服务商,提供专属的行业解决方案 2.点击控制台&am…

V2X介绍

文章目录 什么是V2XV2X的发展史早期的DSRC后起之秀C-V2XC-V2X 和DSRC 两者的对比 什么是V2X 所谓V2X&#xff0c;与流行的B2B、B2C如出一辙&#xff0c;意为vehicle to everything&#xff0c;即车对外界的信息交换。车联网通过整合全球定位系统&#xff08;GPS&#xff09;导…

C#使用log4net结合sqlite数据库记录日志

0 前言 为什么要把日志存到数据库里? 因为结构化的数据库存储的日志信息,可以写专门的软件读取历史日志信息,通过各种条件筛选,可操作性极大增强,有这方面需求的开发人员可以考虑。 为什么选择SQLite? 轻量级数据库,免安装,数据库的常用的基本功能都有,可以随程序…

如何打开/解包星露谷物语XNB文件(附软件资源)

一、什么是 XNB 文件&#xff1f; 游戏将数据、地图和纹理存储在 .xnb 这种压缩数据文件中&#xff0c;它们在游戏的 Content 文件夹中。例如&#xff0c;对话期间显示的阿比盖尔的头像来自这个文件&#xff1a; Content\Portraits\Abigail.xnb。解包这个文件&#xff0c;你会…

SIP 业务举例之 Call Forwarding - No Answer(无应答呼叫转移)

目录 1. Call Forwarding - No Answer 简介 2. RFC5359 的 Call Forwarding - No Answer 信令流程 呼转开始 呼转完成 3. Call Forwording - No Answer 过程总结 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 …

ISO21434 信息安全开发流程咨询合规内容和步骤

ISO 21434是汽车网络安全风险管理的一项国际标准&#xff0c;旨在帮助汽车制造商和供应商识别、评估和管理车辆整个生命周期中的网络安全风险。以下是ISO 21434咨询可能包含的内容以及实施咨询的方法论步骤&#xff1a; 咨询内容&#xff1a; 标准解读与培训&#xff1a;帮助…

【Unity】Unity中文本中插入超链接且可点击响应,TextMeshPro的进阶用法

一、需求和尝试 今天遇到这样一个需求&#xff1a;在文本中插入超链接&#xff0c;且这个链接可以点击跳转对应的url&#xff0c;具体形式如下图所示。 其实这个有一个简单粗暴的方法&#xff0c;就是把需要加超链接的文本单独拿出来&#xff0c;和其他文本进行拼接&#xf…

【数据结构与算法】之队列详解

队列&#xff08;Queue&#xff09;是一种重要的线性数据结构&#xff0c;遵循先进先出、后进后出的原则。本文将更详细地介绍队列的概念、特点、Java 实现以及应用场景。 模运算小复习&#xff1a; a % b 的值总是小于b 5 % 4 1 5 % 2 1 1 % 5 1 4 % 5 4 1. 队列…