【Android源码】编译源码,错误解决

news2024/11/26 3:56:26

Android源码需求

  1. 定制Android系统
  2. 将最新版本的Android系统刷入到自己的Android设备中
  3. 将整个系统源码导入到AndroidStudiozhong
  4. 动态调试Android系统源码

命令介绍

cd aosp
source build/envsetup.sh
lunch
lunch aosp_x86_64-eng
make -j16 2>&1 | tee build.log

版本介绍

运行lunch,查看可以编译的版本信息
选择编译目标

hman@ubuntu:~/aosp$ 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_bonito-userdebug
     5. aosp_car_arm-userdebug
     6. aosp_car_arm64-userdebug
     7. aosp_car_x86-userdebug
     8. aosp_car_x86_64-userdebug
     9. aosp_cf_arm64_phone-userdebug
     10. aosp_cf_x86_64_phone-userdebug
    ...

Which would you like? [aosp_arm-eng] aosp_x86_64-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=10
TARGET_PRODUCT=aosp_x86_64
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=x86_64
TARGET_2ND_ARCH=x86
TARGET_2ND_ARCH_VARIANT=x86_64
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.15.0-142-generic-x86_64-Ubuntu-16.04.7-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=QQ3A.200805.001
OUT_DIR=out
BUILD TYPE备注
user编译出的系统有权限限制,适用于生产环境
userdebug编译出的系统有 root 权限,调试首选
eng优先考虑开发生产力,带有附加调试工具并关闭了优化

执行编译命令

编译指令根据使用场景不同有好几种,下表中列出了这些编译指令:

编译指令备注
m在源码树的根目录执行编译
mm编译当前路径下所有模块,但不包含依赖
mmm [module_path]编译指定路径下所有模块,但不包含依赖
mma编译当前路径下所有模块,并包含依赖
mmma [module_path]编译指定路径下所有模块,并包含依赖
make [module_name]当不指定参数时则表示编译整个 Android 源码(包含依赖)
make -j16 2>&1 | tee build.log

这个命令会编译源码,同时会把错误日志全打印到build.log文件中。

  • -j16 表示指定线程数,这里要取ubuntu系统创建的时候,设置的大小,不能超。

编译成功后,终端会显示 build completed successfully。同时,在源码根目录下的 /home/airsaid/aosp/out/target/product/<product_name>目录中会出现编译后的产物。其中比较重要的有以下三个镜像文件

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

成功

编译输出结果:

Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
Setting name!
partNum is 1
REALLY setting name!
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
output_filename: out/target/product/generic_x86_64/system-qemu.img
Command: dd if=/dev/zero of=out/target/product/generic_x86_64/system-qemu.img ibs=1M count=1
output_filename0: out/target/product/generic_x86_64/system-qemu.img
seek: 1.0 and 1
output_filename0: out/target/product/generic_x86_64/system-qemu.img
seek: 2.0 and 2
output_filename2: out/target/product/generic_x86_64/system-qemu.img
Command2: dd if=/dev/zero of=out/target/product/generic_x86_64/system-qemu.img ibs=1M count=1 seek=3082

#### build completed successfully (02:26:15 (hh:mm:ss)) ####

启动虚拟机

cd aosp
source build/envsetup.sh
lunch aosp_x86_64-eng
emulator
// 或 使用详细模式输出更多调试信息
emulator -verbose -cores 4 -show-kernel

虚拟机启动起来了,但是黑屏。
(真的是,一波三折啊)

报错

  1. python的运行环境不对
FAILED: out/target/product/generic/system-qemu.img
/bin/bash -c "(export SGDISK=out/host/linux-x86/bin/sgdisk SIMG2IMG=out/host/linux-x86/bin/simg2img;      device/generic/goldfish/tools/mk_combined_img.py -i out/target/product/generic/system-qemu-config.txt -o out/target/product/generic/system-qemu.img)"
  File "device/generic/goldfish/tools/mk_combined_img.py", line 50
    print "'%s' cannot be converted to int" % (line[2])
                                          ^
SyntaxError: invalid syntax
ninja: build stopped: subcommand failed.
03:13:59 ninja failed with: exit status 1

从错误信息上看,是mk_combined_img.py中的打印print出错。原来执行mk_combined_img.py文件的时候,用的python版本是python2。但有些python需要用的python3,即3.几的版本。所以需要建立python指向python2才行。

which python2 # 先检查是否安装了python2,没有则安装
sudo apt install python2
sudo ln -s /usr/bin/python2 /usr/bin/python

我尝试修改,但并不能解决我的问题,我就屏蔽掉错误。
2. "dd: invalid number: ‘1.0’"报错

FAILED: out/target/product/generic_x86_64/system-qemu.img
/bin/bash -c "(export SGDISK=out/host/linux-x86/bin/sgdisk SIMG2IMG=out/host/linux-x86/bin/simg2img;      device/generic/goldfish/tools/mk_combined_img.py -i out/target/product/generic_x86_64/system-qemu-config.txt -o out/target/product/generic_x86_64/system-qemu.img)"
1+0 records in
2048+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0460221 s, 22.8 MB/s
dd: invalid number: ‘1.0’
ninja: build stopped: subcommand failed.
03:48:54 ninja failed with: exit status 1

从日志上看,是在运动"dd"命令的是,遇到错误无法识别"1.0",打开“device/generic/goldfish/tools/mk_combined_img.py”,找到关于“dd”相关的代码,如下

print(f"seek: {str(offset)} and {int(offset}")
dd_comm = ['dd', 'if='+partition["path"], 'of='+output_file,'conv=notrunc,sync',
                'ibs=1M','obs=1M', 'seek='+str(offset)]

当我直接运行

dd if=/dev/zero of=out/target/product/generic_x86_64/system-qemu.img ibs=1M obs=1M seek=1.0

都能正常输出结果。

hman@ubuntu:~/aosp$ dd if=/dev/zero of=out/target/product/generic/system-qemu.img ibs=1M obs=1M count=1 seek=1.0
dd: invalid number: ‘1.0’

所以原因应该是seek=1.0导致的,修改成str(int(offset))。
有两次都要修改,如下:

dd_comm = ['dd', 'if='+partition["path"], 'of='+output_file,'conv=notrunc,sync',
                'ibs=1M','obs=1M', 'seek='+str(int(offset))]
...
shell_command(['dd', 'if=/dev/zero', 'of='+output_filename,
                'conv=notrunc', 'bs=1M', 'count=1', 'seek='+str(int(offset))])                
  1. 内存
The sum of sizes of [system vendor] is within BOARD_SUPER_PARTITION_SIZE:
1468014592+119820288 == 1587834880 <=  3229614080 == 3229614080
The sum of sizes of [system vendor] is within BOARD_EMULATOR_DYNAMIC_PARTITIONS_SIZE:
1468014592+119820288 == 1587834880 <= 3221225472 == 3221225472
The sum of sizes of [emulator_dynamic_partitions] is within BOARD_SUPER_PARTITION_SIZE:
3221225472 == 3221225472 <= 3229614080 == 3229614080
ninja: build stopped: subcommand failed.
18:43:52 ninja failed with: exit status 1

我下载的源码是Android11,通过找资料,我查到,
/aosp/device/generic/arm64/BoardConfig.mk

  1. x86_64 emulation currently requires hardware acceleration!
运行:emulator
emulator: WARNING: Couldn't find crash service executable /home/hman/aosp/prebuilts/android-emulator/linux-x86_64/emulator64-crash-service

emulator: ERROR: x86_64 emulation currently requires hardware acceleration!
Please ensure KVM is properly installed and usable.
CPU acceleration status: KVM requires a CPU that supports vmx or svm

是有关硬件加速和 KVM(Kernel-based Virtual Machine)的问题,需要进行一些配置和检查

检查 KVM 是否支持和启用

  • 先 检查 CPU 是否支持虚拟化技术(VT-x 或 AMD-V):
egrep -c '(vmx|svm)' /proc/cpuinfo
0

输出结果 > 0 表示支持虚拟化。结果为 0 表示不支持,或者虚拟化功能在 BIOS 中未启用。

  • 检查 Ubuntu 版本
hman@ubuntu:~/aosp$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.7 LTS
Release:	16.04
Codename:	xenial
  • 检查 KVM 模块是否加载
lsmod | grep kvm

应该看到 kvm 和 kvm_intel 或 kvm_amd 模块加载的情况。如果没有,说明 KVM 没有启用。

  • 安装和启用 KVM
-- 在 Ubuntu/Debian 上
sudo apt-get update
sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-bin bridge-utils

重启系统后,确认 kvm 已加载:

sudo modprobe kvm
sudo modprobe kvm_intel  # 对于 Intel CPU
sudo modprobe kvm_amd    # 对于 AMD CPU
  • 检查kvm报错
hman@ubuntu:~/aosp$ sudo modprobe kvm
[sudo] password for hman: 
hman@ubuntu:~/aosp$ sudo modprobe kvm_intel
modprobe: ERROR: could not insert 'kvm_intel': Operation not supported
hman@ubuntu:~/aosp$ sudo modprobe kvm_amd
modprobe: ERROR: could not insert 'kvm_amd': Operation not supported

关闭虚拟机,打开如下设置:
在这里插入图片描述
重启虚拟机后,运行命令如下:

hman@ubuntu:~/aosp$ egrep -c '(vmx|svm)' /proc/cpuinfo
28
hman@ubuntu:~/aosp$ lsmod | grep kvm
kvm_intel             217088  0
kvm                   614400  1 kvm_intel
irqbypass              16384  1 kvm

表示正常了。

  • 报错 emulator: ERROR: detected a hanging thread ‘QEMU2 CPU1 thread’
运行:emulator -verbose -cores 4 -show-kernel 
但是报错:emulator: ERROR: detected a hanging thread 'QEMU2 CPU1 thread'. No response for 15125 ms
Segmentation fault (core dumped)

通过问询GPT,做了如下修改:

emulator -verbose -cores 2 -show-kernel

大概登录十来分钟,终于是完成了。

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

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

相关文章

HarmonyOS--路由管理--组件导航 (Navigation)

文档中心 什么是组件导航 (Navigation) &#xff1f; 1、Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式 2、Navigation组件适用于模块内和跨模块的路由切换&#xff0c;一次开发&#xff0…

机器学习原理之 -- 朴素贝叶斯分类器:由来及原理详解

朴素贝叶斯&#xff08;Naive Bayes&#xff09;分类器是一类基于贝叶斯定理&#xff08;Bayes Theorem&#xff09;的简单而有效的概率分类算法。由于其假设特征之间的条件独立性&#xff0c;因此被称为“朴素”贝叶斯分类器。尽管这种独立性假设在现实中很少完全成立&#xf…

基于PHP技术的校园论坛设计的设计与实现-计算机毕业设计源码08586

摘 要 本项目旨在基于PHP技术设计与实现一个校园论坛系统&#xff0c;以提供一个功能丰富、用户友好的交流平台。该论坛系统将包括用户注册与登录、帖子发布与回复、个人信息管理等基本功能&#xff0c;并结合社交化特点&#xff0c;增强用户之间的互动性。通过利用PHP语言及其…

Pytorch实战(一):LeNet神经网络

文章目录 一、模型实现1.1数据集的下载1.2加载数据集1.3模型训练1.4模型预测 LeNet神经网络是第一个卷积神经网络&#xff08;CNN&#xff09;&#xff0c;首次采用了卷积层、池化层这两个全新的神经网络组件&#xff0c;接收灰度图像&#xff0c;并输出其中包含的手写数字&…

【吊打面试官系列-MyBatis面试题】#{}和${}的区别是什么?

大家好&#xff0c;我是锋哥。今天分享关于 【#{}和${}的区别是什么&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; #{}和${}的区别是什么&#xff1f; #{} 是预编译处理&#xff0c;${}是字符串替换。 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网…

对话贾扬清:我创业这一年所看到的 AI

引言 在这次对话中&#xff0c;前阿里巴巴人工智能专家、现LIBRINAI创始人贾扬清分享了他在AI领域创业一年的见解和经历。作为一位从科学家转型为CEO的创业者&#xff0c;他探讨了AI计算、异构计算和云原生软件的结合带来的革命性变化&#xff0c;并讨论了LIBRINAI如何在激烈的…

Redis 集群模式

一、集群模式概述 Redis 中哨兵模式虽然提高了系统的可用性&#xff0c;但是真正存储数据的还是主节点和从节点&#xff0c;并且每个节点都存储了全量的数据&#xff0c;此时&#xff0c;如果数据量过大&#xff0c;接近或超出了 主节点 / 从节点机器的物理内存&#xff0c;就…

无人机远程控制:北斗短报文技术详解

无人机&#xff08;UAV&#xff09;技术的快速发展和应用&#xff0c;使得远程控制成为了一项关键技术。无人机远程控制涉及无线通信、数据处理等多个方面&#xff0c;其中北斗短报文技术以其独特的优势&#xff0c;在无人机远程控制领域发挥着重要作用。本文将详细解析无人机远…

【SQL】已解决:MySQL 服务无法启动

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;MySQL 服务无法启动 一、分析问题背景 MySQL是一种流行的开源关系型数据库管理系统&#xff0c;在许多应用中被广泛使用。有时在启动MySQL服务时&#xff0c;可…

Spring Boot集成jasypt快速入门Demo

1.什么是Jasypt&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个专注于简化Java加密操作的工具。 它提供了一种简单而强大的方式来处理数据的加密和解密&#xff0c;使开发者能够轻松地保护应用程序中的敏感信息&#xff0c;如数据库密码、API密…

PHP校园论坛-计算机毕业设计源码08586

摘 要 本项目旨在基于PHP技术设计与实现一个校园论坛系统&#xff0c;以提供一个功能丰富、用户友好的交流平台。该论坛系统将包括用户注册与登录、帖子发布与回复、个人信息管理等基本功能&#xff0c;并结合社交化特点&#xff0c;增强用户之间的互动性。通过利用PHP语言及其…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(二)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形 ✔️ 第一部分【第二部分】✔️第三部分&#xff08;精译中 ⏳&#xff09; 1.2.3 Canvas 与 WebGL&#x…

Linux多进程和多线程(一)

进程 进程的概念 进程&#xff08;Process&#xff09;是操作系统对一个正在运行的程序的一种抽象。它是系统运行程序的最小单位&#xff0c;是资源分配和调度的基本单位。 进程的特点如下 进程是⼀个独⽴的可调度的活动, 由操作系统进⾏统⼀调度, 相应的任务会被调度到cpu …

【鸿蒙学习笔记】尺寸设置

官方文档&#xff1a;尺寸设置 目录标题 width&#xff1a;设置组件自身的宽度&#xff0c;缺省时自适应height&#xff1a;设置组件自身的高度&#xff0c;缺省时自适应size&#xff1a;设置高宽尺寸。margin&#xff1a;设置组件的外边距padding&#xff1a;设置组件的内边距…

数据库-数据完整性-用户自定义完整性实验

NULL/NOT NULL 约束&#xff1a; 在每个字段后面可以加上 NULL 修饰符来指定该字段是否可以为空&#xff1b;或者加上 NOT NULL 修饰符来指定该字段必须填上数据。 DEFAULT约束说明 DEFAULT 约束用于向列中插入默认值。如果列中没有规定其他的值&#xff0c;那么会将默认值添加…

electron线上跨域问题

一、配置background.js win new BrowserWindow({webPreferences: {nodeIntegration: true, // 使渲染进程拥有node环境//关闭web权限检查&#xff0c;允许跨域webSecurity: false,// Use pluginOptions.nodeIntegration, leave this alone// See nklayman.github.io/vue-cli-p…

【计算机网络】HTTP——基于HTTP的功能追加协议(个人笔记)

学习日期&#xff1a;2024.6.29 内容摘要&#xff1a;基于HTTP的功能追加协议和HTTP/2.0 HTTP的瓶颈与各功能追加协议 需求的产生 在Facebook、推特、微博等平台&#xff0c;每分每秒都会有人更新内容&#xff0c;我们作为用户当然希望时刻都能收到最新的消息&#xff0c;为…

常用字符串方法<python>

导言 在python中内置了许多的字符串方法&#xff0c;使用字符串方法可以方便快捷解决很多问题&#xff0c;所以本文将要介绍一些常用的字符串方法。 目录 导言 string.center(width[,fillchar]) string.capitalize() string.count(sub[,start[,end]]) string.join(iterabl…

收银系统源码-千呼新零售【全场景收银】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

基于星火大模型的群聊对话分角色要素提取挑战赛-Lora微调与prompt构造

赛题连接 https://challenge.xfyun.cn/topic/info?typerole-element-extraction&optionphb 数据集预处理 由于赛题官方限定使用了星火大模型&#xff0c;所以只能调用星火大模型的API或者使用零代码微调 首先训练数据很少是有129条&#xff0c;其中只有chat_text和info…