基于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 Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_blueline-userdebug
     4. aosp_blueline_car-userdebug
     5. aosp_bonito-userdebug
     6. aosp_bonito_car-userdebug
     7. aosp_car_arm-userdebug
     8. aosp_car_arm64-userdebug
     9. aosp_car_x86-userdebug
     10. aosp_car_x86_64-userdebug
     11. aosp_cf_arm64_auto-userdebug
     12. aosp_cf_arm64_phone-userdebug
     13. aosp_cf_x86_64_phone-userdebug
     14. aosp_cf_x86_auto-userdebug
     15. aosp_cf_x86_phone-userdebug
     16. aosp_cf_x86_tv-userdebug
     17. aosp_coral-userdebug
     18. aosp_coral_car-userdebug
     19. aosp_crosshatch-userdebug
     20. aosp_crosshatch_car-userdebug
     21. aosp_flame-userdebug
     22. aosp_flame_car-userdebug
     23. aosp_sargo-userdebug
     24. aosp_sunfish-userdebug
     25. aosp_taimen-userdebug
     26. aosp_trout_arm64-userdebug
     27. aosp_trout_x86-userdebug
     28. aosp_walleye-userdebug
     29. aosp_walleye_test-userdebug
     30. aosp_x86-eng
     31. aosp_x86_64-eng
     32. arm_krait-eng
     33. arm_v7_v8-eng
     34. armv8-eng
     35. armv8_kryo385-eng
     36. beagle_x15-userdebug
     37. beagle_x15_auto-userdebug
     38. car_x86_64-userdebug
     39. db845c-userdebug
     40. fuchsia_arm64-eng
     41. fuchsia_x86_64-eng
     42. hikey-userdebug
     43. hikey64_only-userdebug
     44. hikey960-userdebug
     45. hikey960_tv-userdebug
     46. hikey_tv-userdebug
     47. pixel3_mainline-userdebug
     48. poplar-eng
     49. poplar-user
     50. poplar-userdebug
     51. qemu_trusty_arm64-userdebug
     52. silvermont-eng
     53. uml-userdebug
     54. yukawa-userdebug
     55. 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系统源码!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Diffusion Probabilistic Models for 3D Point Cloud Generation——点云论文阅读(8)

此内容是论文总结&#xff0c;重点看思路&#xff01;&#xff01; 文章概述 该文献介绍了一种用于3D点云生成的概率模型。点云是表示3D物体和场景的常用方式&#xff0c;但由于其不规则的采样模式&#xff0c;与图像相比&#xff0c;点云生成更具挑战性。现有方法如GANs、流…

Flutter通过showDialog实现下拉筛选菜单效果

一、效果图 二、 实现方式 获取固定在顶部筛选头部Widget在屏幕上的位置和它的高度在弹窗中通过获取到的高度进行内容显示区域定位巧用AnimatedContainer组件实现下拉动画效果最后在底部加上黑色蒙层 unawaited(showDialog(context: context,useSafeArea: false,barrierColor…

Golang | Leetcode Golang题解之第503题下一个更大元素II

题目&#xff1a; 题解&#xff1a; func nextGreaterElements(nums []int) []int {n : len(nums)ans : make([]int, n)for i : range ans {ans[i] -1}stack : []int{}for i : 0; i < n*2-1; i {for len(stack) > 0 && nums[stack[len(stack)-1]] < nums[i%…

vue2-render:vue2项目使用render / 基础使用

一、本文内容 本文内容记录render常用的一些属性和方法的配置&#xff0c;以作参考 export default { data() {return { modelValue: ,key: 0,}; }, render(h) { return h(div, [ h(input, {class: input,attrs: { type: text }, key: this.key,props: { value: thi…

【MATLAB代码】EKF和CDKF的对比

目录 主要特点 应用场景 运行结果展示 本MATLAB程序实现了扩展卡尔曼滤波&#xff08;EKF&#xff09;与协方差差分卡尔曼滤波&#xff08;CDKF&#xff09;在三维状态估计中的效果对比&#xff0c;为需要高精度定位与动态系统分析的用户提供了一种实用工具。通过直观的结果…

CenterTrack算法详解

背景&#xff1a; 早期追踪器在缺乏强的低水平线索下&#xff0c;容易失败检测后跟踪的模型依赖于检测器&#xff0c;且需要一个单独的阶段匹配关联策略的时间长 简介&#xff1a; 基于点的跟踪思想&#xff0c;通过预测目标的中心点来进行跟踪&#xff0c;同时实现检测与跟…

【开源免费】基于SpringBoot+Vue.JS蜗牛兼职平台 (JAVA毕业设计)

本文项目编号 T 034 &#xff0c;文末自助获取源码 \color{red}{T034&#xff0c;文末自助获取源码} T034&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 平台架构1.2 管理后台1.3 用户网页端1.4 技术特点 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景…

SSCI/SCI/EI/Scopus/期刊合集,周期短,快速发表,见刊快!

【期刊合集专场】本期为计算机、材料、工程技术、医学、社科经管、农林科学类领域的SCI&SSCI、Scopus、EI&#xff0c;涵盖&#xff1a;人工智能、纳米材料、工程材料、肿瘤学、管理学、农作物保护等征稿方向&#xff01; 期刊推荐一、Intelligence & Robotics 学科领域…

【C++篇】继承之巅:超越法则束缚,领略面向对象的至臻智慧

文章目录 C 继承详解&#xff1a;虚拟继承与进阶实战前言第一章&#xff1a;继承与友元、静态成员1.1 继承与友元1.1.1 友元函数的定义 1.2 继承与静态成员1.2.1 静态成员的继承与访问 第二章&#xff1a;复杂的菱形继承及虚拟继承2.1 菱形继承问题2.1.1 菱形继承的基本结构 2.…

「漏洞复现」东胜物流软件 GetProParentModuTreeList SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

数据结构——树——二叉树——大小堆

目录 1>>导言 2>>树 2.1>>树的相关术语 2.2>>树的表示和应用场景 3>>二叉树 3.1>>完全二叉树 3.2>>大小根堆 4>>结语 1>>导言 上篇小编将队列的内容给大家讲完了&#xff0c;这篇要步入新的篇章&#xff0c;请宝…

基于Spark的共享单车数据存储系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

ML 系列:机器学习和深度学习的深层次总结(17)从样本空间到概率规则概率

一、说明 概率是支撑大部分统计分析的基本概念。从本质上讲&#xff0c;概率提供了一个框架&#xff0c;用于量化不确定性并对未来事件做出明智的预测。无论您是在掷骰子、预测天气还是评估金融市场的风险&#xff0c;概率都是帮助您驾驭不确定性的工具。本篇将讲授概率的原理和…

Linux使用Dockerfile部署Tomcat以及jdk

资源准备 首先提供本教程所有资源包。 当然也可以根据自己需求去官网下载。 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;f31y #我们开始吧 首先我们需要一台linux操作系统的机器&#xff0c;当然windows也是可以的&#xff0c;本系列教程是基于Linux的&#…

【网络】H3C交换机配置

1. 网关配置&#xff08;web管理界面&#xff09; 默认S5048PV2_EI交换机 第一步&#xff1a;若是首次配置&#xff0c;通过Console口配置以太网交换机管理VLAN的IP地址&#xff0c;默认的网关是192.168.0.253。 system-view [H3C] interface Vlan-interface 1&#xff08;进入…

[mysql]聚合函数GROUP BY和HAVING的使用和sql查询语句的底层执行逻辑

#GROUP BY的使用 还是先从需求出发,我们现在想求员工表里各个部门的平均工资,最高工资 SELECT department_id,AVG(salary) FROM employees GROUP BY department_id 我们就会知道它会把一样的id分组,没有部门的就会分为一组,我们也可以用其他字段来分组,我们想查询不同jb_id…

ArcGIS计算多个面要素范围内栅格数据各数值的面积

本文介绍在ArcMap软件中&#xff0c;基于面积制表工具&#xff08;也就是Tabulate Area工具&#xff09;&#xff0c;基于1个面要素数据集与1个栅格数据&#xff0c;计算每一个面要素中各栅格数据分布面积的方法。 首先&#xff0c;来看一下本文的需求。现有一个矢量面的要素集…

水陆两栖车应对应急事件发挥的作用_鼎跃安全

随着气候变化&#xff0c;城市内涝等问题日益严重。为了应对可能出现的洪水灾害&#xff0c;许多城市开始将水陆两栖车纳入应急救援装备体系。在暴雨引发城市积水时&#xff0c;水陆两栖车可以作为一种高效的救援和运输工具&#xff0c;及时疏散被困群众&#xff0c;运送应急物…

Hallo2 长视频和高分辨率的音频驱动的肖像图像动画 (数字人技术)

HALLO2: LONG-DURATION AND HIGH-RESOLUTION AUDIO-DRIVEN PORTRAIT IMAGE ANIMATION 论文&#xff1a;https://arxiv.org/abs/2410.07718 代码&#xff1a;https://github.com/fudan-generative-vision/hallo2 模型&#xff1a;https://huggingface.co/fudan-generative-ai/h…

执行Django项目的数据库迁移命令时报错:(1050, “Table ‘django_session‘ already exists“);如何破?

一、问题描述&#xff1a; 当我们写Django时&#xff0c;由于自己的操作不当&#xff0c;导致执行数据库迁移命令时报错&#xff0c;报错的种类有很多&#xff0c;例如&#xff1a; 迁移文件冲突&#xff1a;可能你有多个迁移文件试图创建同一个表。数据库状态与迁移文件不同…