记录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

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

5.error: unknown type name ‘AuthorizationRef’

报错提示如下所示:

/Applications/Xcode.app/Contents/Developer/.../SCPreferences.h:196:6: 
error: unknown type name 'AuthorizationRef'

报错原因:编译器遇到一个未知的类型名称时,会抛出 “unknown type name ‘XXX’” 的错误。

解决方法:根据错误提示的文件路劲,找到对应文件中的 AuthorizationRef 的定义或声明,并确保它能被正确地识别和引用。

#if	!TARGET_OS_IPHONE
#include <Security/Security.h>
#else	// !TARGET_OS_IPHONE
typedef const struct AuthorizationOpaqueRef *	AuthorizationRef;
#endif	// !TARGET_OS_IPHONE

分析这里的代码,如果目标OS不是IPhone,则引入 Security/Security.h 头文件,否者定义 AuthorizationOpaqueRef 结构体。由于我们是编译的 Android 源码,也就满足 if 条件则引入文件,但是该头文件没有包含特定的头文件来定义 AuthorizationRef

因此笔者做了如下修改,算是欺骗编译器,先让源码的编译能够正常通过,修改后的源码如下:

// #if	!TARGET_OS_IPHONE
// #include <Security/Security.h>
// #else	// !TARGET_OS_IPHONE
typedef const struct AuthorizationOpaqueRef *	AuthorizationRef;
// #endif	// !TARGET_OS_IPHONE

取消判断逻辑,直接定义所需的 AuthorizationRef,保存修改后继续编译,问题就这么被解决了,又可以愉快的编译源码了…

6.FAILED: out/target/product/generic/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests

报错提示如下所示:

FAILED: out/target/product/generic/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests
......//省略部分
FAILED: out/target/product/generic/obj/ETC/treble_sepolicy_tests_26.0_intermediates/treble_sepolicy_tests_26.0

在这里插入图片描述
报错原因:目前还未搞明白,看着是跟测试有关的…
查到的解决方案是:修改 system/sepolicy/tests/Android.bp 去掉stl: “libc++_static”

cc_library_host_shared {
    name: "libsepolwrap",
    srcs: ["sepol_wrap.cpp"],
    cflags: ["-Wall", "-Werror",],
    export_include_dirs: ["include"],

    // libsepolwrap gets loaded from the system python, which does not have the
    // ASAN runtime. So turn off sanitization for ourself, and  use static
    // libraries, since the shared libraries will use ASAN.
    static_libs: [
        "libbase",
        "libsepol",
    ],
    // stl: "libc++_static", // 删掉这一行即可
    sanitize: {
        never: true,
    },
}

保存修改后,重新编译源码,该问题得到解决,继续编译…

编译构建成功

等待编译完成后,如下图所示,则意味着构建完成啦!
在这里插入图片描述
终于大工完成了,不是编译了1个多小时哈!这是中断编译后,修改调整后重新继续编译的时间,如果没有遇到问题的情况下,依笔者的电脑配置,预估得5个小时左右吧!

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

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

相关文章

[Redis][哨兵][下]详细讲解

目录 1.安装部署(基于Docker)1.编排Redis主从节点2.编排Redis-Sentinel节点 2.重新选举1.redis-master宕机之后2.redis-master重启之后3.总结 3.选举原理4.总结 1.安装部署(基于Docker) 1.编排Redis主从节点 编写docker-compose.yml 创建/root/redis/docker-compose.yml&…

【web安全】——信息收集

一、收集域名信息 1.1域名注册信息 工具&#xff1a;站长之家 whois查询 SEO综合查询 1.2子域名收集 原理&#xff1a;字典爆破&#xff0c;通过字典中的各种字符串与主域名拼接&#xff0c;尝试访问。 站长之家 直接查询子域名 ip138.com https://phpinfo.me/domain/ …

StoryMaker 在文本到图像的生成过程中实现一致的字符

StoryMaker 是一种个性化解决方案&#xff0c;它不仅能保持多个角色场景中面部的一致性&#xff0c;还能保持服装、发型和身体的一致性&#xff0c;从而有可能制作出由一系列图像组成的故事。 StoryMaker 生成图像的可视化。 前三行讲述的是 "上班族 "一天的生活&…

创建javaWeb项目(详细版本)2021年2月

1、新建一个java项目 2、点击工程名称&#xff0c;找到add framework support&#xff0c;并点击 建好如图 3、分别在工程目录下创建resourse文件夹和web目录下创建classes和lib文件夹 建好如图 4、file找到 project structure 5、选中resourse 将其mark as sources 6、路径改…

关于frp Web界面-----frp Server Dashboard 和 frp Client Admin UI

Web 界面 官方文档&#xff1a;https://gofrp.org/zh-cn/docs/features/common/ui/ 目前 frpc 和 frps 分别内置了相应的 Web 界面方便用户使用。 客户端 Admin UI 服务端 Dashboard 服务端 Dashboard 服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信…

godot4.2入门项目 dodge_the_creep学习记录

前言 在学习博客Godot4 你的第一个2d游戏中的项目时&#xff0c;遇到了点小问题&#xff0c;记录一下。 官方项目 传送门 问题 怪兽直接从屏幕中间部分冒出来&#xff0c;以及角色出现时位于屏幕外角色被设置的背景图遮挡 解决方法 1.节点的位置没有对齐&#xff0c;正确示例…

Apache APISIX学习(2):安装Grafana、prometheus

一、Grafana安装 1、介绍 Grafana 是一个监控仪表系统&#xff0c;它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度&#xff0c;你只需要提供你需要监控的数据&#xff0c;它就可以帮你生成各种可视化仪表。同时它…

Vue-Bag-Admin 采用漂亮的 Naive UI 构建的开源中后台系统,基于 Vue3 / Vite / TypeScript 等最新的前端技术栈

这是一款完成度很高、实用性很强的 admin 前端框架&#xff0c;颜值不错&#xff0c;推荐给大家。 Vue-Bag-Admin 在官网上也直接称为 Bag-Admin&#xff0c;这是一款专门为企业项目搭建中后台管理平台的前端框架&#xff0c;基于目前最新的前端技术栈 Vue3、Vite、TypeScript…

程序设计题(65—72)

第六十五题 题目 请编写函数fun&#xff0c;它的功能是&#xff1a;计算下列级数和&#xff0c;和值由函数值返回。 例如&#xff0c;当n10&#xff0c;x0.3时&#xff0c;函数值为1.349859。 #include <conio.h> #include <stdio.h> #include <math.h> #…

5.使用 VSCode 过程中的英语积累 - Go 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

react:React Hook函数

使用规则 只能在组件中或者其他自定义的Hook函数中调用 只能在组件的顶层调用&#xff0c;不能嵌套在if、for、 其他函数中 基础Hook 函数 useState useState是一个hook函数&#xff0c;它允许我们向组件中添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 示例1…

人生苦短,我用Python✌

面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么&#xff0c;翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit&#xff08;&#xff09; 新建文本文档后缀改成py 编写 运行 安装编写代码…

开放词汇全景分割

开放词汇全景分割是一种先进的计算机视觉任务&#xff0c;它旨在将图像中的每个像素分割并分类到预先定义或未定义的类别中。这与传统的图像分割不同&#xff0c;后者通常仅限于识别有限的、预先定义的对象类别。开放词汇全景分割的目标是识别和处理图像中的任何可能的对象&…

Fastadmin 前台任意文件读取漏洞

漏洞描述 FastAdmin是一个基于ThinkPHP5和Bootstrap的后台开发框架&#xff0c;支持权限管理、响应式开发、多语言、模块化开发、CRUD和自由可扩展等功能。 漏洞复现 FOFA body"fastadmin.net" || body"<h1>fastadmin</h1>" && tit…

SpringMVC源码-SpringMVC框架中Spring父容器和SpringMVC子容器加载的流程以及SpringMVC九大内置组件的初始

一、Spring父容器启动 SpringMVC 的项目结构如下: applicationContext.xml spring的配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.o…

微调大模型(Finetuning Large Language Models)—Evaluation(六)

1. 微调后对模型进行评估 模型的评估目前没有统一的标准&#xff0c;有从正向角度&#xff0c;核对是否命中&#xff0c;当然也有从反向角度&#xff0c;考虑未命中的错误分析。 常见的评估方式如图所示&#xff1a; 本节学习资料地址&#xff1a;传送门 2. 代码测试 2.1 …

【Python】多个dataframe存入excel的不同的sheet表里,而不会被覆盖的方法

我发现&#xff0c;我原来用的多个工作簿存入的方法&#xff0c;发现不太可行&#xff0c;如果我用原来的方法&#xff0c;然后for循环&#xff0c;新的dataframe会把原来的覆盖掉&#xff0c;然后只剩下一个工作薄。原先的代码&#xff1a; with pd.ExcelWriter(file_name ) …

XSS闯关小游戏(前13关)

挖掘思路 1.存在可控参数 2.页面存在回显 3.使用带有特殊字符的语句去测试&#xff0c;网站是否进行了实例化 ( 例如 ">123 ) 4.构造闭合&#xff0c;实现payload的逃逸 1 name处参数可控&#xff0c;直接打即可 2 这里知道<>被实体编码了 再测试">1…

想做个WPS的自动化代码,参考如下:

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

大碗娱乐发布业务调整说明 取消艺人经纪业务

大碗娱乐今日发布业务调整说明&#xff1a;不再负责艺人业务&#xff0c;而贾玲导演将专注内容创作。据悉&#xff0c;其公司旗下艺人张小斐、许君聪、卜钰、何欢、张泰维、朱天福、曹贺军、刘宏禄的经纪合约均已到期&#xff0c;双方不再续约&#xff0c;但未来会共同寻求以其…