记录Mac编译Android源码踩过的坑

学习Android源码,如果电脑配置还不错,最好还是下载一套源码,经过编译后导入到Android Studio中来学习,这样会更加的直观,代码之间的跳转查看会更加方便。因此,笔者决定下载并编译一套源码,以利于源码的探索和学习。本文不介绍怎么下载的源码,主要是记录编译源码时踩过的坑,为自己同时也便于读者少走弯路。

为了方便读者做对比,这里简单介绍一下笔者的硬件和软件配置:

  1. 硬件:MAcBook Pro
    1. 处理器:2.6GHz 六核 Intel Core i7
    2. 内存:16GB 2667 MHz DDR4
    3. macOS:Sonoma 14.6.1
    4. 存储:外接 1T 的移动固态硬盘(希捷Seagate)
  2. 软件:
    1. XCode 16.0(16A242D)
    2. Mac sdk 15.0

1.不能找到一个支持的 mac sdk 错误

报错提示如下所示:

internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12" "10.13" "10.14"]
internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12" "10.13" "10.14"]

找不到支持的 mac sdk
在执行编译过程中,如果出现不能找到一个支持的mac sdk错误(XCodesdk),可以通过下面的命令行编辑以下文件:

vim build/soong/cc/config/x86_darwin_host.go

添加已安装且支持的 mac sdk
添加已安装的mac sdk版本号即可,笔者这里安装 XCode 自带的是:15和15.0,就都给添加上了
在这里插入图片描述
然后,重新编译,解决了该问题!!!

在继续编译的过程中,又出现了新的问题…

2.VNDK library list has been changed

报错提示如下所示:

error: VNDK library list has been changed.Changing the VNDK library list is not allowed in API locked branches.

在这里插入图片描述
错误原因是:out/target/product/generic/obj/PACKAGING/vndk_intermediates/libs.txt 和 build/make/target/product/gsi/29.txt 文件内容不一致所导致,根据提示的差异内容和文本对比工具进行差异对比,笔者查到的解决方案有如下几种:

  1. libs.txt 的内容完全复制到 29.txt 即可解决;(笔者试了几次并没有解决)
  2. 删除 libs.txt 文本文件;(笔者试了几次也没有解决)
  3. 29.txt 文本文件以及其所在同目录下的 current.txt 文本文件,与 libs.txt 的内容保持一致(即用 libs.txt 的内容覆盖其它两个文件的内容);(笔者试了几次依然没有解决)
  4. 使用下面的命令进行编译:
make target-files-package

使用上述命令解决了该问题!!!
在继续编译的过程中,又出现了新的问题,编译源码真的是不断摸索前进…

3.sprintf is deprecated

报错提示如下所示:

external/protobuf/src/google/protobuf/io/strtod.cc:62:14: error: 'sprintf' is deprecated: This function is provided 
for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly
recommended that you use snprintf(3) instead. [-Werror,-Wdeprecated-declarations]int size = sprintf(temp, "%.1f", 1.5);^

在这里插入图片描述

sprintf 函数在某些版本的 CC++ 标准库中已被标记为过时(deprecated)。这意味着,虽然在当前代码中它仍然可以使用,但是在未来的库版本中,它可能会被移除。使用这个函数可能会产生警告,并且建议使用其他更现代、更安全的函数。

报错的原因是:sprintf 函数被弃用,编译器认为使用 sprintf 函数不安全,按照提示将对应语法替换为 snprintf 函数即可:
下图为报错提示的 strtod.cc 文件的全路径,便于读者快速查找并修改:
在这里插入图片描述
strtod.cc 文件中将对应语法替换为 snprintf 函数:
在这里插入图片描述
解决方法:使用 snprintfsprintf_s(取决于你使用的是 C 还是 C++ 以及你的编译器)来代替 sprintf。这两个函数是当前标准库中的替代函数,它们提供了类似的功能,但是更加安全,不会有过时的问题。代码修改后的前后对比如下:

// 旧的使用 sprintf 的代码
char temp[16];
int size = snprintf(temp, "%.1f", 1.5);// 替换后新的使用 snprintf 的代码
char temp[16];
int size = snprintf(temp, sizeof(temp), "%.1f", 1.5);

替换后解决该问题,在继续编译的过程中,又出现了新的问题,编译源码真的是要有不断与报错抗争的耐心…

4.use of undeclared identifier ‘PAGE_SIZE’

报错提示如下所示:

system/core/base/cmsg.cpp:36:21: error: use of undeclared identifier 'PAGE_SIZE'if (cmsg_space >= PAGE_SIZE) {^
system/core/base/cmsg.cpp:78:21: error: use of undeclared identifier 'PAGE_SIZE'if (cmsg_space >= PAGE_SIZE) {^
2 errors generated.
17:46:11 ninja failed with: exit status 1

在这里插入图片描述
报错的原因是:使用未声明的标识符**‘PAGE_SIZE’**,即 PAGE_SIZE 这个变量未定义。

解决方法
satckoverflow 上有人碰到类似的问题,看到下面有回复说是配置mac os sdk版本的问题,这里采用回答所给的第二个方案改了一下:
~/system/core/base/include/android-base/cmsg.h 头文件中添加如下内容:

#ifndef PAGE_SIZE
#define PAGE_SIZE (size_t)(sysconf(_SC_PAGESIZE))
#endif

添加声明后该问题解决,继续编译…

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

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

相关文章

生活中重大决定,除了你自己,谁也帮不了你!

随着年龄增长,越来越发现:生活是非常现实,更现实的社会,自己除了自己,谁也帮不了你。 因此,一个人的生活是好是坏,往往取决于我们自己的努力程度,越努力才会越幸运。没有伞的孩子&am…

力扣(leetcode)每日一题 2516 每种字符至少取 K 个 | 滑动窗口

2516. 每种字符至少取 K 个 给你一个由字符 a、b、c 组成的字符串 s 和一个非负整数 k 。每分钟,你可以选择取走 s 最左侧 还是 最右侧 的那个字符。 你必须取走每种字符 至少 k 个,返回需要的 最少 分钟数;如果无法取到,则返回…

Win10系统插入带有麦克风的耳机_麦克风不起作用_解决方法_亲测成功---Windows运维工作笔记054

今天我在使用讯飞输入法的时候,想通过讯飞的语音输入法来提高自己的输入效率。 但是这个时候发现一个问题就是我插入我的台式机的是一个带有麦克风的耳机。 但是发现我这个耳机没有办法被电脑识别出麦克风来,所以说就没办法使用讯飞输入法的语音输入功能来直接输入文字了。…

你知道AI模型是如何学习的吗???零基础入门到精通,收藏这一篇就够了

在人工智能的广阔天地中,AI模型的学习方式不仅决定了其智能行为的深度和广度,更是推动技术进步和应用创新的关键动力。随着AI技术的飞速发展,我们越来越意识到,深入了解AI的学习机制对于把握其潜能至关重要。 这篇文章将从基础概…

从物流员到月薪12K:他如何成功转行人工智能大模型,逆袭人生!

苑同学,21岁,江苏人 专科学历,物流管理专业 入行后:嵌入式开发,12K 工作地点:苏州 苑同学,来自江苏苏州,是一名普通的大专毕业生,今天我们来听听他的故事。。。 我的…

蓝桥杯—STM32G431RBT6(TIM定时器输入捕获频率和占空比)

一、什么是输入捕获?对比输出捕获区别? 输入捕获是指对输入信号的特定事件进行检测和记录它主要用于测量输入信号的时间间隔、频率等参数。而输出捕获则是对输出信号的特定事件进行控制和监测。两者的主要区别在于作用对象不同,输入捕获关注的…

【Threejs进阶教程-着色器篇】8. Shadertoy如何使用到Threejs-基础版

【Threejs进阶教程-着色器篇】8. Shadertoy如何使用到Threejs - 基础版 前七篇地址,建议按顺序学习致谢带我入门的[X01动力装甲]大佬本文适用范围怎么样在Shadertoy中画出正圆形shadertoy中的坐标系比例转换理解Shadertoy的fragCoord理解Shadertoy中的iResolution 转移Shaderto…

【YOLO目标检测输电线路异物数据集】共4516张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式:YOLO格式 图片数量:4516 标注数量(txt文件个数):4516 标注类别数:4 标注类别名称:nest、kite、balloon、trash 数据集下载:输电线路异物数据集 图片示例 数据集…

react 状态管理

Redux Redux是React中常用的状态管理组件,类似于Vue中的Pinia(Vuex),可以独立于框架运行 作用: 通过集中管理的方式管理应用的状态 配套工具 在react中使用redux,官方要求按照两个插件,Redux Toolkit 和 react-red…

c++(AVL树及其实现)

一、AVL树的概念 AVL树是最先发明的自平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的 左右子树都是AV树,且左右子树的高度差的绝对值不超过1。AVL树是⼀颗高度平衡搜索⼆叉树, 通过控制高度差去控…

星辰计划04-深入理解kafka的消息存储和索引设计

消息存储 提到存储不得不说消息的读写,那么kafka他是如何读写数据的呢? 读取消息 1.通过debug(如何debug) 我们可以得到下面的调用栈,最终通过FileRecords来读取保存的数据 写入消息 1.通过debug(如何debug) 我们可以得到下面的调用栈&am…

在LLMs模型中发现人类的记忆特征

论文地址:https://arxiv.org/abs/2311.03839 介绍 大型语言模型(LLM),如 ChatGPT,为语言建模和生成人类水平的文本输出带来了质的飞跃。 这些模型在庞大的文本库中进行训练,有效地建立了高度复杂和准确的…

标准 I/O

标准 I/O 引言 I/O 是一切实现的基础,其分为标准 I/O 和文件 I/O。 文件 I/O 依赖操作系统,因系统的实现方式而定,对于程序员来说会造成很大困扰。如打开文件,Linux 系统调用为 open() 函数,而 Windows 的系统调用为…

【锁住精华】MySQL锁机制全攻略:从行锁到表锁,共享锁到排他锁,悲观锁到乐观锁

MySQL有哪些锁 1、按照锁的粒度划分 行锁 是最低粒度的的锁,锁住指定行的数据,加锁的开销较大,加锁较慢,可能会出现死锁的情况,锁的竞争度会较低,并发度相对较高。但是如果where条件里的字段没有加索引&…

OpenCV 形态学相关函数详解及用法示例

OpenCV形态学相关的运算包含腐蚀(MORPH_ERODE),膨胀(MORPH_DILATE),开运算(MORPH_OPEN),闭运算(MORPH_CLOSE),梯度运算(MORPH_GRADIENT),顶帽运算(MORPH_TOPHAT),黑帽运算(MORPH_BLACKHAT),击中…

AI产品经理:基于大模型Agent的客服实践,更低的成本与更大的收益

现在AI客服已经在各行业普遍使用了,但是实际效果并不如意——用户宁愿等人工客服,也不愿意找AI客服解决问题。如果给当前的AI客服换成大模型,效果会不会更好一些?这篇文章,我们来看看作者的思考。 一、为什么要用大模型…

Python 从入门到实战30(高级文件的操作)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们讨论了操作目录的相关知识。今天我们将学习一下高级文…

一文学会 Java 8 的Predicates

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 在这份详细的指南中,您将了解 Java Predicates,这是 Java 8 中一个新颖且有用的特性。本文解释了 Java Predicates 是什么以及如何在各种情况下使用它们。 在这份详尽的指南中…

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么? 原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。 限…

信安 实验1 用Wireshark分析典型TCP/IP体系中的协议

我发现了有些人喜欢静静看博客不聊天呐, 但是ta会点赞。 这样的人呢帅气低调有内涵, 美丽大方很优雅。 说的就是你, 不用再怀疑哦 实验1 用Wireshark分析典型TCP/IP体系中的协议 实验目的 通过Wireshark软件分析典型网络协议数据包&a…