当前位置: 首页 > news >正文

Android13源码下载和编译过程详解

前言

作为Android开发者人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解

一 源码下载

1.1 配置要求

官方推荐配置请参考:AOSP使用入门文档,重点有如下几项:

1.1.1 硬件配置要求

  1. 至少需要 250 GB 可用磁盘空间;如果要进行构建,则还需要 150 GB。如果要进行多次构建,则需要更多空间。
  2. 磁盘至少 250GB,实测建议至少 512G。

1.1.2 软件要求

推荐使用 Ubuntu 18.04 (Bionic Beaver)、 Docker、Linux。
2021年6月22日起,不再支持 Windows 或 MacOS 上构建。
2020年1月1日起,不再支持 python2,请使用 python3。

1.2 下载环境搭建

1.2.1 依赖安装

请使用如下命令安装相关依赖:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

执行结果如下

longzhiye@longzhiye-laptop:~$ sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
......
升级了 0 个软件包,新安装了 114 个软件包,要卸载 0 个软件包,有 5 个软件包未被升级。
需要下载 58.6 MB 的归档。
解压缩后会消耗 262 MB 的额外空间。
您希望继续执行吗? [Y/n] y
......
python3 已经是最新版 (3.6.7-1~18.04)。
python3 已设置为手动安装。
下列软件包是自动安装的并且现在不需要了:gir1.2-goa-1.0 gir1.2-snapd-1
使用'sudo apt autoremove'来卸载它(它们)。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 5 个软件包未被升级。

1.2.2 git配置

请使用如下命令对git进行配置:

git config --global user.name 'xxx'
git config --global user.email 'xxx@xxx.com'

执行结果如下

longzhiye@longzhiye-laptop:~$ git config --global user.name 'longzhiye' 
longzhiye@longzhiye-laptop:~$ git config --global user.email 'longzhiye163@163.com'

1.2.3 repo配置

由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源),请使用如下命令更新repo并进行配置:

mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod +x ~/bin/repo

执行结果如下

longzhiye@longzhiye-laptop:~$ mkdir ~/bin
longzhiye@longzhiye-laptop:~$ PATH=~/bin:$PATH
longzhiye@longzhiye-laptop:~$ curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100 45805  100 45805    0     0   117k      0 --:--:-- --:--:-- --:--:--  117k
longzhiye@longzhiye-laptop:~$ chmod +x ~/bin/repo

1.3 源码下载

1.3.1 明确下载版本

请通过浏览器访问:分支列表,来选取需要的版本。
网页显示如下:

1.3.2 替换为清华源

请使用如下命令将源替换为清华源:

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

执行结果如下

longzhiye@longzhiye-laptop:~$ export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

1.3.3 初始化仓库并指定分支

请使用如下命令初始化仓库并指定分支,此处以android-13.0.0_r40分支为例。

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r40

执行结果如下:

longzhiye@longzhiye-laptop:~/mount/project$ mkdir androidt    // 建立下载位置
longzhiye@longzhiye-laptop:~/mount/project$ cd androidt/
longzhiye@longzhiye-laptop:~/mount/project/androidt$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r40
Downloading Repo source from https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/
remote: Enumerating objects: 4495, done.
remote: Counting objects: 100% (4495/4495), done.
remote: Compressing objects: 100% (2144/2144), done.
remote: Total 8060 (delta 3993), reused 2351 (delta 2351), pack-reused 3565
接收对象中: 100% (8060/8060), 3.81 MiB | 1016.00 KiB/s, 完成.
处理 delta 中: 100% (5177/5177), 完成.
repo: Updating release signing keys to keyset ver 2.3Your identity is: longzhiye <longzhiye163@163.com>
If you want to change this, please re-run 'repo init' with --config-nameTesting colorized output (for 'repo diff', 'repo status'):black    red      green    yellow   blue     magenta   cyan     white bold     dim      ul       reverse 
Enable color display in this user account (y/N)? yrepo has been initialized in /home/longzhiye/mount/project/androidt
longzhiye@longzhiye-laptop:~/mount/project/androidt$ ls -al
总用量 12
drwxrwxr-x 3 longzhiye longzhiye 4096 5月  20 00:48 .
drwxrwxrwx 3 root      root      4096 5月  20 00:44 ..
drwxrwxr-x 5 longzhiye longzhiye 4096 5月  20 00:48 .repo

1.3.4 同步全部源码

初始化仓库之后,就可以开始正式同步代码到本地了,命令如下:

repo sync -c -j8

此处为了加快速度使用了-c参数,表示只同步当前分支,-j8表示使用8个线程今天同步代码,使用多少个线程请根据自己的机器配置自行修改。
(提示:一定要确定代码完全同步了,不然在下面编译过程出现的错误会让你痛不欲生,不确定的童鞋可以多用repo sync同步几次)

执行结果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ repo sync -c -j8
Fetching: 100% (1135/1135), done in 4h51m48.506s
正在检出文件: 100% (1972/1972), 完成.
正在检出文件: 100% (1787/1787), 完成.
......
正在检出文件: 100% (724/724), 完成.orm/system/keymaster正在检出文件:  73% (534/724)   
Checking out: 100% (1135/1135), done in 44m21.860s
repo sync has finished successfully.

源码同步时间比较长,此时Android13源码已经同步完成。

二 Android源码编译

2.1 编译环境搭建

使用如下命令安装JDK:

sudo apt-get install openjdk-11-jdk

安装完成后可以使用如下命令查看是否按照成功:

longzhiye@longzhiye-laptop:javac -version
javac 11.0.17

2.2 全编译

2.2.1 初始化编译环境

执行如下命令进行编译环境初始化:

source build/envsetup.sh
或者:
. build/envsetup.sh

执行结果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ source build/envsetup.sh

2.2.2 选择构建目标

执行lunch命令执行结果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ lunchYou're building on LinuxLunch menu .. Here are the common combinations:1. aosp_arm-eng2. aosp_arm64-eng3. aosp_barbet-userdebug4. aosp_bluejay-userdebug5. aosp_bluejay_car-userdebug6. aosp_bramble-userdebug7. aosp_bramble_car-userdebug8. aosp_car_arm-userdebug9. aosp_car_arm64-userdebug10. aosp_car_x86-userdebug11. aosp_car_x86_64-userdebug12. aosp_cf_arm64_auto-userdebug13. aosp_cf_arm64_phone-userdebug14. aosp_cf_x86_64_foldable-userdebug15. aosp_cf_x86_64_pc-userdebug16. aosp_cf_x86_64_phone-userdebug17. aosp_cf_x86_64_tv-userdebug18. aosp_cf_x86_auto-userdebug19. aosp_cf_x86_phone-userdebug20. aosp_cf_x86_tv-userdebug21. aosp_cheetah-userdebug22. aosp_cloudripper-userdebug23. aosp_coral-userdebug24. aosp_coral_car-userdebug25. aosp_flame-userdebug26. aosp_flame_car-userdebug27. aosp_oriole-userdebug28. aosp_oriole_car-userdebug29. aosp_panther-userdebug30. aosp_raven-userdebug31. aosp_raven_car-userdebug32. aosp_ravenclaw-userdebug33. aosp_redfin-userdebug34. aosp_redfin_car-userdebug35. aosp_redfin_vf-userdebug36. aosp_slider-userdebug37. aosp_sunfish-userdebug38. aosp_sunfish_car-userdebug39. aosp_trout_arm64-userdebug40. aosp_trout_x86-userdebug41. aosp_whitefin-userdebug42. aosp_x86-eng43. aosp_x86_64-eng44. arm_krait-eng45. arm_v7_v8-eng46. armv8-eng47. armv8_cortex_a55-eng48. armv8_kryo385-eng49. beagle_x15-userdebug50. beagle_x15_auto-userdebug51. car_ui_portrait-userdebug52. car_x86_64-userdebug53. db845c-userdebug54. gsi_car_arm64-userdebug55. gsi_car_x86_64-userdebug56. hikey-userdebug57. hikey64_only-userdebug58. hikey960-userdebug59. hikey960_tv-userdebug60. hikey_tv-userdebug61. poplar-eng62. poplar-user63. poplar-userdebug64. qemu_trusty_arm64-userdebug65. rb5-userdebug66. sdk_car_arm-userdebug67. sdk_car_arm64-userdebug68. sdk_car_portrait_x86_64-userdebug69. sdk_car_x86-userdebug70. sdk_car_x86_64-userdebug71. sdk_pc_x86_64-userdebug72. silvermont-eng73. uml-userdebug74. yukawa-userdebug75. yukawa_sei510-userdebugWhich would you like? [aosp_arm-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng): aosp_arm64-engHint: next time you can simply run 'lunch aosp_arm64-eng'============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=13
TARGET_PRODUCT=aosp_arm64
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-a
TARGET_2ND_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.4.0-148-generic-x86_64-Ubuntu-18.04.6-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=TQ2A.230405.003.B2
OUT_DIR=out
PRODUCT_SOONG_NAMESPACES=device/generic/goldfish device/generic/goldfish-opengl hardware/google/camera hardware/google/camera/devices/EmulatedCamera
============================================

中间会有选择需要构建的目标,此处以aosp_arm64-eng为例

2.2.3 编译固件

通过make指令进行代码编译,该指令通过-j参数来设置参与编译的线程数量,以提高编译速度.比如这里我们设置8个线程同时编译。需要注意的是,参与编译的线程并不是越多越好,通常是根据你机器cup的核心来确定:core*2,即当前cpu的核心的2倍.比如,我现在的笔记本是双核四线程的,因此根据公式,最快速的编译可以make -j8.
(通过cat /proc/cpuinfo查看相关cpu信息)

make -j8

执行结果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ make -j8
07:04:26 ************************************************************
07:04:26 You are building on a machine with 15.5GB of RAM
07:04:26 
07:04:26 The minimum required amount of free memory is around 16GB,
07:04:26 and even with that, some configurations may not work.
07:04:26 
07:04:26 If you run into segfaults or other errors, try reducing your
07:04:26 -j value.
07:04:26 ************************************************************
build/make/core/soong_config.mk:209: warning: BOARD_PLAT_PUBLIC_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS instead.
build/make/core/soong_config.mk:210: warning: BOARD_PLAT_PRIVATE_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS instead.
============================================
PLATFORM_VERSION_CODENAME=REL
......
[ 99% 120038/120059] //frameworks/base/packages/SystemUI:SystemUI-core javac
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
注: 某些输入文件使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
[ 99% 120044/120059] //frameworks/base/packages/SystemUI:SystemUI r8
Warning: Missing class android.compat.annotation.UnsupportedAppUsage (referenced from: void com.android.systemui.people.widget.PeopleBackupHelper.writeNewStateDescription(android.os.ParcelFileDescriptor))
[100% 120059/120059] Target vbmeta image: out/target/product/generic/vbmeta.img#### build completed successfully (05:56:23 (hh:mm:ss)) ####

如果一切顺利的化,在几个小时之后,便可以编译完成.看到### make completed successfully (00:48:15(hh:mm:ss)) ###表示你编译成功了.。Google 使用 72 核机器,内置 RAM 为 64 GB,完整构建过程大约需要 40 分钟(增量构建只需几分钟时间,具体取决于修改了哪些文件)。相比之下,RAM 数量相近的 6 核机器执行完整构建过程需要 3 个小时。

二 运行模拟器

在编译完成之后,就可以通过以下命令运行Android虚拟机了,命令如下:

source build/envsetup.sh
lunch   // 选择刚才你设置的目标版本,比如这里了我选择的是2
emulator

执行结果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ source build/envsetup.sh
longzhiye@longzhiye-laptop:~/mount/project/androidt$ lunch
longzhiye@longzhiye-laptop:~/mount/project/androidt$ emulator

不出意外,在等待一会之后,你会看到运行界面

相关文章:

Android13源码下载和编译过程详解

前言 作为Android开发者人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解 一 源码下载 1.1 配置要求 官方推荐配置请参考&#xff1a;AOSP使用入门文档&#xff0c;重点有如下几项&#xff1a; 1.1.1 硬件配置要求 至少需要…...

C++底层学习预备:模板初阶

文章目录 1.编程范式2.函数模板2.1 函数模板概念2.2 函数模板原理2.3 函数模板实例化2.3.1 隐式实例化2.3.2 显式实例化 2.4 模板参数的匹配原则 3.类模板希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 进入STL库学习之前我们要先了解有关模板的…...

使用mybatisPlus插件生成代码步骤及注意事项

使用mybatisPlus插件可以很方便的生成与数据库对应的PO对象&#xff0c;以及对应的controller、service、ImplService、mapper代码&#xff0c;生成这种代码的方式有很多&#xff0c;包括mybatis-plus提供的代码生成器&#xff0c;以及idea提供的代码生成器&#xff0c;无论哪一…...

扩散模型(二)

相关阅读&#xff1a;扩散模型&#xff08;一&#xff09; Parameterization of L t L_t Lt​ for Training Loss 回想一下&#xff0c;我们需要训练一个神经网络来近似反向扩散过程中的条件概率分布&#xff0c;即, p θ ( x t − 1 ∣ x t ) N ( x t − 1 ; μ θ ( x t…...

java异常处理——try catch finally

单个异常处理 1.当try里的代码发生了catch里指定类型的异常之后&#xff0c;才会执行catch里的代码&#xff0c;程序正常执行到结尾 2.如果try里的代码发生了非catch指定类型的异常&#xff0c;则会强制停止程序&#xff0c;报错 3.finally修饰的代码一定会执行&#xff0c;除…...

新月军事战略分析系统使用手册

新月人物传记&#xff1a; 人物传记之新月篇-CSDN博客 相关故事链接&#xff1a;星际智慧农业系统&#xff08;SAS&#xff09;&#xff0c;智慧农业的未来篇章-CSDN博客 “新月智能武器系统”CIWS&#xff0c;开启智能武器的新纪元-CSDN博客 “新月之智”智能战术头盔系统&…...

Docker Hub 镜像 Pull 失败的解决方案

目录 引言一、问题二、原因三、解决方法四、参考文献 引言 在云原生技术火热的当下&#xff0c;Docker可谓是其基础&#xff0c;由于其简单以及方便性&#xff0c;让开发人员不必再为环境配置问题而伤脑筋&#xff0c;因为可将其看作一个虚拟机程序去理解。所以掌握好它可谓是…...

SQL进阶实战技巧:如何构建用户行为转移概率矩阵,深入洞察会话内活动流转?

目录 1 场景描述 1.1 用户行为转移概率矩阵概念 1.2 用户行为转移概率矩阵构建方法 (1) 数据收集...

DeepSeek辅助学术写作关键词选取

关键词 关键词主要从论文标题、摘要及正文中提炼出来&#xff0c;需要准确反映论文的核心主题和专业领域。关键词的选择不仅有助于标引人员进行主题词的选取、数据库的建立以及文献的检索&#xff0c;而且也便于读者高效检索和引用相关学术成果&#xff0c;从而促进学术交流的…...

后盾人JS -- 原型

没有原型的对象 也有没有原型的对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...

优选算法的灵动之章:双指针专题(一)

个人主页&#xff1a;手握风云 专栏&#xff1a;算法 目录 一、双指针算法思想 二、算法题精讲 2.1. 查找总价格为目标值的两个商品 2.2. 盛最多水的容器 ​编辑 2.3. 移动零 2.4. 有效的三角形个数 一、双指针算法思想 双指针算法主要用于处理数组、链表等线性数据结构…...

BUUCTF Pwn axb_2019_brop64 题解

这题是BROP 所以不下文件 先nc一下看看&#xff1a; 先要找到栈溢出长度&#xff1a; from pwn import * import timedef getsize():i 1while True:try:p remote("node5.buuoj.cn", 29367)p.sendafter("Please tell me:", ba * i)time.sleep(0.1)data …...

85.[1] 攻防世界 WEB easyphp

进入靶场 属于代码审计 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;常用于调试或展示代码 highlight_file(__FILE__);// 初始化两个标志变量&#xff0c;用于后续条件判断 $key1 0; $key2 0;// 从 GET 请求中获取参数 a 和 b $a $_GET[a]; $b $_GET[b];// 检…...

动态规划学习

在进行算法题练习和一些题目中发现关于动态规划的内容较多&#xff0c;觉得有必要系统的学习和练习一下 于是参照bilbilUP主 英雄哪里出来 的动态规划50题和LeetKoke网站进行学习和练习 一 概述 动态规划 是一个有限状态自动机 可以抽象为一个有向无环图 有起始节点 终止节点 …...

数据结构【链栈】

基于 C 实现链表栈&#xff1a;原理、代码与应用 一、引言 栈就是一个容器&#xff0c;可以当场一个盒子&#xff0c;只能一个一个拿&#xff0c;一个一个放&#xff0c;而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】&#xff0c;所以我们这里只…...

软件测试02----用例设计方法

今天目标 1.能对穷举场景设计测试点 2.能对限定边界规则设计测试点 3.能对多条件依赖关系进行设计测试点 4.能对项目业务进行设计测试点 一、解决穷举场景 重点&#xff1a;使用等价类划分法 1.1等价类划分法 重点&#xff1a;有效等价和单个无效等价各取1个即可。 步骤&#…...

编程AI深度实战:给vim装上AI

系列文章&#xff1a; 编程AI深度实战&#xff1a;私有模型deep seek r1&#xff0c;必会ollama-CSDN博客 编程AI深度实战&#xff1a;自己的AI&#xff0c;必会LangChain-CSDN博客 编程AI深度实战&#xff1a;给vim装上AI-CSDN博客 编程AI深度实战&#xff1a;火的编程AI&…...

《DeepSeek R1:大模型最简安装秘籍》

DeepSeek R1&#xff1a;AI 大模型界的新起之秀 在人工智能的璀璨星空中&#xff0c;大模型如繁星般闪耀&#xff0c;而 DeepSeek R1 无疑是其中一颗冉冉升起的新星&#xff0c;自问世以来便吸引了全球的目光&#xff0c;在人工智能领域占据了重要的一席之地。 从性能表现上看…...

物业管理平台系统为社区管理带来数字化转型与服务创新新机遇

内容概要 物业管理平台系统是数字化转型的利器&#xff0c;为社区管理带来了许多新机遇。想象一下&#xff0c;传统社区物业管理中繁琐的流程和低效的沟通如何被这种智能系统所替代。通过集成在线收费功能&#xff0c;我们不仅提高了费用收取的准确性&#xff0c;还减少了业主…...

红黑树的封装

一、封装思路 在 STL 中 map set 的底层就是封装了一棵红黑树。 其中连接红黑树和容器的是迭代器&#xff0c;map set 暴露出的接口都不是自己写的&#xff0c;而是红黑树写的&#xff0c;外部接口封装红黑树接口。 所以写出红黑树为 map set 写的接口&#xff0c;再在上层的…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...