news 2026/9/13 9:44:40

SonarQube代码质量管理平台落地实践:从安装到质量门禁与CI/CD集成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SonarQube代码质量管理平台落地实践:从安装到质量门禁与CI/CD集成

1. 为什么团队代码质量总失控?先看懂SonarQube的价值

先聊一个几乎所有团队都会踩的坑:代码能跑、功能上线、Bug 靠用户发现。项目一迭代,代码量上去了,风格越来越飘,重复代码满天飞,安全隐患藏在角落里,等到某个深夜接到线上告警,你才开始后悔当初没有做代码审查。

我在带团队的时候,最头疼的还真不是业务复杂度,而是代码质量没有一个客观的、自动化的抓手。Code Review 靠人盯,盯不了一个几十万行的老项目;静态检查靠 IDE 插件,每个人装的插件不一样,规则配置也不一样,出来的结果完全没法统一。后来我把 SonarQube 引入到团队的研发流程里,用一个中心化的平台去承接所有代码质量的检查和门禁控制,效果立竿见影。

SonarQube 是一个开源的代码质量管理平台,支持超过 30 种编程语言,从 Java、Python、JavaScript、Go,到 C#、C/C++、TypeScript、Kotlin,基本覆盖了主流技术栈。它的核心能力是静态代码分析,也就是不运行你的程序,纯粹通过扫描源码和编译产物,把代码里的Bug隐患、安全漏洞、坏味道、重复代码、复杂度超标等等问题全部揪出来,并且给出详细的规则说明和修复建议。

这篇文章,我会把 SonarQube 从零到一的完整落地过程给你串一遍,包含安装部署、项目接入、规则配置、质量门禁、CI/CD 集成,以及我在实际使用中踩过的坑和解决方法。无论你是刚接触代码质量的开发者,还是准备在团队里推行规范化研发流程的技术负责人,这篇文章都能给你一个可直接复制的方案。

提示:本文所有操作基于 SonarQube 社区版(免费开源),涉及的功能均为社区版可用能力。商业版的一些高级功能我会在相应位置提示,但不作为核心内容。

2. 核心概念拆解:Server、Scanner、Quality Gate 到底怎么协同

2.1 SonarQube 的整体架构:一个中心化服务端加多个扫描器

SonarQube 采用典型的 C/S 架构,严格来说是服务端加客户端的模式。

服务端就是 SonarQube Server,它负责三件大事:存储代码分析的结果、提供 Web 管理界面、执行质量门禁的判断。所有的项目配置、规则启用状态、历史趋势数据,都存放在服务端的数据库里。

客户端则是 SonarQube Scanner,它可以在你本地开发机、CI 服务器或者任何一台构建机器上运行。Scanner 的作用是分析代码,把分析结果上报给 Server,由 Server 汇总和展示。

打个比方,Server 就像医院的检验科,Scanner 就是抽血的护士。护士负责采集样本,检验科负责出报告和诊断结论。没有检验科,护士采了血也没地方处理;没有护士,检验科也拿不到样本。

这种架构设计最大的好处是,扫描动作和结果存储完全解耦。你可以在本地跑一次扫描看看效果,也可以在 Jenkins 里每天定时扫描,然后在统一的 Web 界面上查看所有历史数据。分析历史趋势、对比版本间的缺陷数量变化,就不需要翻各种 CI 日志了。

2.2 分析一个项目会产出哪些指标

当 Scanner 完成一次代码分析并上传到 Server 后,SonarQube 会生成一套全面的质量报告,核心指标包括下面几类:

  • Bug 类:代码中可能导致程序出错、崩溃、资源泄露的缺陷。例如空指针解引用、未关闭的连接、数组越界等。
  • 漏洞类:安全相关的风险点,比如 SQL 注入、XSS 跨站脚本、硬编码的密码、不安全的加密算法等。社区版主要检测代码本身的安全问题,商业版还会做更深入的安全分析。
  • 坏味道类:影响代码可维护性的问题,比如过长的方法、过深的嵌套、重复代码、命名不规范等。这类问题短期不会导致 Bug,但长期会显著增加维护成本。
  • 重复度:代码中重复片段的比例。SonarQube 会识别出完全相同的代码块和近似重复的代码块。
  • 复杂度:圈复杂度指标,衡量代码中独立路径的数量。复杂度越高,测试覆盖率需要越高,代码越难维护。
  • 覆盖率:配合 JaCoCo、coverage.py 等工具,SonarQube 可以展示行覆盖率、分支覆盖率,以及哪些代码没有被测试覆盖到。

这些指标打包在一起,最终会汇总成一个明确的结果:Passed 或者 Failed。这个判断依据,就是质量门禁(Quality Gate)。

2.3 为什么质量门禁是团队落地的关键

很多团队装了 SonarQube,扫描也在跑,但没过多久就没人看了。原因很简单:没有强制力。分析报告放在那里,修不修全凭自觉,那等于没做。

质量门禁就是解决"强制力"问题的关键。你可以制定一套规则,例如"新增代码的 Bug 数必须为 0""新增代码的覆盖率不得低于 80%""安全漏洞等级为高危及以上的数量必须为 0",然后把这套规则绑定到项目上。之后每次扫描,SonarQube 都会根据这套规则给出通过或者不通过的结论。

这个结论可以被 CI 系统直接消费:质量门禁没通过,流水线就失败,合并请求就禁止合并。这样一来,代码质量就不再是"看心情"的事了,而是变成了开发流程里一个不可绕过的关卡。

我在实际团队中推动的时候,有一个很深的体会:质量门禁不能一开始就设得太严,否则整个团队会非常抵触。合理的做法是分三个阶段推进,第一阶段只做扫描和展示,让团队看到问题;第二阶段卡新增代码的严重问题;第三阶段再把覆盖率等硬性指标加上去。循序渐进,才能在不大规模阻碍开发效率的前提下把质量文化建立起来。

3. 安装部署实操:Server 端与 Scanner 端的完整配置

3.1 环境准备:JDK 版本与硬件要求

SonarQube 9.9 之后,服务端要求 JDK 17 或更高版本。如果你安装的是更新的大版本,比如 SonarQube 10.x 或 11.x,JDK 17 是基线,部分新版本可能已经需要 JDK 21。这个一定要在安装前确认清楚,否则启动的时候直接报错。

硬件方面,SonarQube 对资源的要求不低。官方文档的建议是:小团队(10-20 个开发者)使用 2 核 4GB 内存的服务器,中等规模团队使用 4 核 8GB,大规模使用 8 核 16GB 以上。实际使用下来,4GB 内存跑起来比较勉强,至少 6GB 才舒服。因为 SonarQube 底层是 Java 应用,内存管理需要留出足够的堆空间。

注意:千万不要用 32 位的操作系统或者 JDK 跑 SonarQube,官方早已停止支持 32 位环境。

3.2 数据库选型:从 H2 到 PostgreSQL

SonarQube 需要一个数据库来存储数据。社区版的默认配置是内置的 H2 数据库,但 H2 只适合用来快速试用,官方明确不建议在生产环境中使用。

生产环境推荐使用 PostgreSQL(9.6 及以上版本),这也是 SonarQube 优化最充分的数据库。MySQL 在旧版本中曾被支持,但新版已经不再支持了,如果你还在用 MySQL,需要先把数据迁移到 PostgreSQL 再升级。

数据库配置很简单,提前建好库和用户:

CREATE USER sonar WITH PASSWORD 'sonar_password'; CREATE DATABASE sonar OWNER sonar;

然后在 SonarQube 的配置文件conf/sonar.properties中取消注释并填写数据库连接信息:

sonar.jdbc.username=sonar sonar.jdbc.password=sonar_password sonar.jdbc.url=jdbc:postgresql://localhost/sonar

3.3 服务端安装三步走:下载、解压、启动

在官方下载页面选择对应版本的社区版压缩包,下载后解压即可用,无需编译。这正是 SonarQube 上手快的最大原因之一。

以 Linux 系统为例,操作流程如下:

# 1. 下载(以 26.9 版本示例,请以官方页面为准) wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-26.9.zip # 2. 解压 unzip sonarqube-26.9.zip # 3. 启动 cd sonarqube-26.9/bin/linux-x86-64/ ./sonar.sh start

启动后,访问http://服务器IP:9000即可打开 Web 界面。默认管理员账号是admin,初始密码是admin,首次登录后系统会强制要求修改密码。

有几个启动细节值得注意:

  • SonarQube 默认监听 9000 端口,如果端口被占用,可以去sonar.properties里修改sonar.web.port
  • 默认只监听本机地址,如果想从其他机器访问,需要修改sonar.web.host0.0.0.0,同时确保防火墙和安全组放行了 9000 端口。
  • 启动日志在logs/sonar.log,如果启动失败,先去看这个文件最后 50 行,多半是数据库连接失败、端口被占用或 JDK 版本不对导致的问题。

3.4 Scanner 安装:本地扫描器的配置

服务端启动之后,接下来就是安装扫描器。Scanner 有很多种形态,最基本的是命令行 Scanner,适用于本地扫描和 CI 集成。

下载 Scanner 压缩包后解压,添加环境变量即可:

export SONAR_SCANNER_HOME=/opt/sonar-scanner export PATH=$PATH:$SONAR_SCANNER_HOME/bin

然后编辑conf/sonar-scanner.properties,配置服务端地址:

sonar.host.url=http://你的服务器IP:9000 sonar.token=这里填写认证Token

这里的 Token 需要在 SonarQube 的 Web 界面上生成,后面会详细讲。

对于 Java 项目,通常还会用到 SonarQube 的 Maven 插件或者 Gradle 插件,而不用独立 Scanner。这个我在后面项目接入部分细聊。

4. 项目接入实操:从一条命令扫描到多语言项目配置

4.1 创建项目和生成 Token

在开始扫描之前,需要先在 SonarQube 里创建一个项目。登录 Web 界面后,点击"创建项目",填入项目名称和项目 Key。项目 Key 是项目的唯一标识符,建议使用类似com.company.projectname的格式,方便区分同名项目。

然后系统会自动提示你创建一个 Token,这个 Token 是 Scanner 访问 Server 的身份凭证,相当于一把钥匙。Token 生成后只会显示一次,一定要先复制保存好。过期或者丢失了也没关系,可以在"我的账号 -> 安全"里重新生成。

拿到 Token 之后,你就可以在项目根目录执行扫描命令了:

sonar-scanner \ -Dsonar.projectKey=my_project \ -Dsonar.sources=. \ -Dsonar.host.url=http://服务器IP:9000 \ -Dsonar.token=你的Token

扫描完成后,回到 Web 界面,你就能看到项目的分析报告了。第一次扫描建议先不加其他参数,让默认规则跑一遍,看看效果再说。

4.2 Java 项目的推荐接入方式:Maven 与 Gradle

对于 Java 项目,我更推荐直接使用构建工具集成的插件,因为这样 SonarQube 能拿到编译后的字节码和依赖信息,分析结果远比你用 Scanner 扫源码文件要准确得多。

Maven 项目的接入方式是在项目根目录的pom.xml里添加 sonar-maven-plugin,或者直接在命令行指定插件版本:

mvn clean verify sonar:sonar \ -Dsonar.projectKey=my_java_project \ -Dsonar.host.url=http://服务器IP:9000 \ -Dsonar.login=你的Token \ -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml

Gradle 项目则需要在build.gradle中应用org.sonarqube插件:

plugins { id 'org.sonarqube' version '4.4.1.3373' }

然后执行:

gradle sonar \ -Dsonar.projectKey=my_gradle_project \ -Dsonar.host.url=http://服务器IP:9000 \ -Dsonar.login=你的Token

使用构建工具集成的最大优势是,SonarQube 可以自动分析类路径与依赖库,检查出那些"源码扫描发现不了"的问题。例如一个方法调用了某个旧版本依赖里已废弃且存在漏洞的 API,这种依赖层面的安全问题,只有拿到编译信息才能检测出来。

4.3 非 Java 项目的 Scanner 参数详解

非 Java 项目(Python、JavaScript、Go、C/C++ 等)使用独立 Scanner 就够了。这里我列一份最常用的参数清单,可以作为脚手架直接套用:

sonar-scanner \ -Dsonar.projectKey=my_python_project \ -Dsonar.projectName="我的 Python 项目" \ -Dsonar.projectVersion=1.0.0 \ -Dsonar.sources=. \ -Dsonar.sourceEncoding=UTF-8 \ -Dsonar.exclusions=**/venv/**,**/node_modules/**,**/build/**,**/dist/** \ -Dsonar.python.coverage.reportPaths=coverage.xml \ -Dsonar.host.url=http://服务器IP:9000 \ -Dsonar.token=你的Token

几个关键参数的说明:

  • sonar.sources:指定要分析的源码目录,默认是当前目录。可以用逗号分隔多个目录,比如src,lib
  • sonar.exclusions:排除不需要分析的目录,这个非常关键。node_modules、venv、build 这些目录一旦被扫进去,不仅浪费时间,还会把大量第三方代码的缺陷算进你的项目里。
  • sonar.sourceEncoding:指定源码文件编码,统一设置为 UTF-8 可以避免中文注释在分析时乱码影响结果。
  • sonar.python.coverage.reportPaths:指定覆盖率报告路径,需要配合对应的覆盖率工具生成报告后,SonarQube 才能展示覆盖率数据。

4.4 分析与增量分析:PR 场景下的必知配置

如果你们团队的开发模式是分支开发 + 合并请求(PR/MR),SonarQube 可以直接在 PR 上做代码质量检查,只关注这一次改动引入的问题,不会把历史遗留问题拿出来阻挠你。

要在 PR 上做增量分析,需要在扫描命令里增加分支和合并请求参数:

sonar-scanner \ -Dsonar.projectKey=my_project \ -Dsonar.branch.name=feature/login \ -Dsonar.pullrequest.key=123 \ -Dsonar.pullrequest.branch=feature/login \ -Dsonar.pullrequest.base=master \ -Dsonar.host.url=http://服务器IP:9000 \ -Dsonar.token=你的Token

这样 SonarQube 会把当前分支与目标分支做对比,生成一份"新增代码问题"的报告。质量门禁也只针对新增代码执行判断,而不是整个项目的老问题。

这一点非常重要。我见过不少团队一开始没配置增量分析,每次扫描都把项目所有历史问题拉出来,一个 30 万行的老项目瞬间爆出几万个问题,开发者根本无从下手,士气直接被打崩。设置了增量分析之后,历史问题归历史问题,新增问题严格把关,团队才真正愿意去用。

提示:SonarQube 社区版在较新的版本中对分支和 PR 分析支持得已经比较好了。不过如果你的版本较老,分支分析可能需要商业版插件才能使用完整功能,具体以官方文档为准。

5. 质量门禁与规则体系:打造团队自己的质量标准

5.1 默认门禁与自定义门禁的取舍

SonarQube 内置了一套"Sonar way"质量门禁,开箱即用,核心指标包括:新增代码的 Bug 数为 0、漏洞数为 0、安全热点审查率为 100%、覆盖率不低于 80% 等。

这套默认门禁作为起步完全够用,但真正落地的时候,我建议你根据团队实际情况定制一套门禁。原因很简单,默认门禁是"通用标准",不一定适配你的项目阶段。一个刚启动的新项目和一个维护了十年的老项目,质量标准不应该一模一样。

自定义门禁可以在"质量门禁 -> 新建"里操作,添加你关心的条件。常见的门禁条件包括:

指标建议阈值说明
新增代码 Bug0新增代码不允许引入任何 Bug
新增代码漏洞0新增代码不允许引入任何安全漏洞
新增代码覆盖率≥ 80%新写的代码要有足够的测试覆盖
新增代码重复率≤ 3%新代码尽量避免重复逻辑
整体覆盖率≥ 60%老项目逐步提升整体覆盖率
圈复杂度≤ 20过于复杂的方法需要重构

5.2 规则定制:把团队规范注入 SonarQube

SonarQube 内置了几百条规则,覆盖常见语言。默认情况下,"Sonar way"规则集只启用了其中的一部分。你可以根据团队编码规范,启停特定规则,甚至可以自定义规则。

规则管理界面在"规则"菜单下,可以按语言、仓库、严重程度、是否启用等维度筛选。每条规则都包含:问题描述、违反示例、正确示例、修复建议。

我在实际项目里最常做的规则调整有两类:

一类是禁用不合理的规则。例如 Java 项目里,public方法必须写 Javadoc 注释这条规则,对很多业务项目来说过于严格,会导致全屏警告,我通常直接禁用。

另一类是调整严重级别。例如团队成员普遍不重视的规则,从"严重"降为"次要",减少噪音;而对团队真正关心的安全问题,比如硬编码密码、使用不安全的加密算法等,上调为"阻断",让这类问题在任何情况下都不能流到生产环境。

5.3 质量门禁如何跟 CI/CD 流程绑定

配置质量门禁的最终目标,是和 CI/CD 流程打通,让质量检查自动化。这里以最常见的两种 CI 平台举例。

在 GitLab CI 的.gitlab-ci.yml中,可以加一个sonarqube-check的 Job:

sonarqube-check: stage: test script: - sonar-scanner \ -Dsonar.projectKey=$SONAR_PROJECT_KEY \ -Dsonar.sources=. \ -Dsonar.host.url=$SONAR_HOST_URL \ -Dsonar.token=$SONAR_TOKEN allow_failure: false

如果质量门禁不通过,这个 Job 会以非零码退出,流水线失败,合并请求就会被阻塞。这就是"强制力"的来源。

在 Jenkins 中,推荐使用 SonarQube Scanner 插件。配置好 SonarQube Server 的地址和 Token 后,在流水线里这样调用:

stage('SonarQube Analysis') { steps { withSonarQubeEnv('SonarQube') { sh 'sonar-scanner \ -Dsonar.projectKey=my_project \ -Dsonar.sources=.' } } } stage('Quality Gate Check') { steps { timeout(time: 1, unit: 'MINUTES') { waitForQualityGate abortPipeline: true } } }

第二个 Stage 是关键,waitForQualityGate会等待 SonarQube 返回质量门禁结果,abortPipeline: true表示门禁失败时直接中断流水线。

5.4 实操心得:门禁定多严才合理

关于质量门禁的严格程度,我踩过不少坑,这里分享几条比较实在的经验。

第一,千万不要一上来就设 100% 覆盖率。如果项目存量代码覆盖率只有 20%,强制要求整体覆盖率 80%,那会让整个团队陷入补测试的泥沼里,正常业务迭代完全停滞。正确的做法是优先卡"新增代码",历史代码逐步偿还。

第二,安全类规则必须严格执行。硬编码密码、SQL 注入、危险的反序列化这些漏洞,一旦发布到生产环境就是事故。这类问题的门槛可以设成最严级别,没有任何商量的余地。

第三,不要频繁修改门禁规则。门禁规则的每一次调整,都会影响 CI 流程的通过率。如果三天两头改,团队会无所适从,最后干脆不看检查结果了。定好一版门禁,至少跑一个季度再评估是否调整。

6. 常见问题与排查技巧实录

6.1 扫描失败但不知道原因?先看这四类日志

SonarQube 的使用中,百分之八十的问题出在扫描阶段。遇到扫描失败,不要慌,按下述顺序排查,绝大多数问题都能解决。

首先是 Scanner 的日志。执行扫描命令后,控制台会输出大量日志,重点关注ERRORWARN级别的信息。如果日志刷得太快不好定位,可以把日志重定向到文件再查看:

sonar-scanner -Dsonar.projectKey=my_project -Dsonar.sources=. > scan.log 2>&1

其次是 SonarQube 服务端的日志。如果控制台提示"无法上传报告"或者"连接超时",去服务端的logs/sonar.log里查看是否有异常堆栈。

第三是数据库连接问题。如果启动服务端时提示数据库连接失败,检查sonar.properties里的数据库地址、端口、用户名密码是否正确,数据库版本是否满足要求。

第四是权限问题。如果提示"未经授权"或者 401 错误,多半是 Token 不正确或者 Token 所属账号权限不够。去 Web 界面的用户管理里检查一下。

6.2 覆盖率一直显示为 0?多半是报告路径没对上

这是一个非常高频的问题。你在本地跑了测试,测试工具也生成了覆盖率报告,但 SonarQube 里覆盖率始终是 0,原因十有八九是sonar.coverage.reportPaths路径配置错了。

SonarQube 本身不做覆盖率采集,它需要读取第三方覆盖率工具生成的报告文件。比如 Java 项目用 JaCoCo 生成jacoco.xml,Python 项目用 coverage.py 生成coverage.xml,前端项目用 c8 或 Istanbul 生成lcov.info

配置路径时要注意两点:一是路径必须是 Scanner 实际运行时能访问到的路径;二是报告文件的格式必须与 SonarQube 期望的格式一致。如果你用的是 Maven 的 JaCoCo 插件,默认输出路径是target/site/jacoco/jacoco.xml;如果你用的是独立 Scanner,那么路径要写相对于项目根目录的路径。

6.3 老项目问题数量爆表?三步走渐进治理

把 SonarQube 接入一个存量老项目,第一次扫描结果出来的时候,我见过不少团队直接崩溃的。几万个问题,其中高危 Bug 就有上千个,开发人员的反应基本是"这么多问题,怎么改?改不完,不改了"。

面对这种局面,我的建议是分三步走:

第一步,先止血。把所有"阻断"级别的安全漏洞和会导致线上事故的严重 Bug 修掉。这类问题通常数量有限,优先级最高。剩下的问题先放着,不阻塞发布。

第二步,启用增量分析。配置好 PR 的增量扫描后,所有新代码必须过质量门禁。这样老问题不会继续增加,新代码的质量有人把关。

第三步,逐步还债。每周或者每个迭代,固定拿出一点时间,按模块清理历史问题。SonarQube 的问题列表支持按文件、按规则、按严重程度筛选排序,可以挑出问题最集中的几个文件优先处理,收益最大。

我在一个项目上就是这么干的。一个 40 万行代码的老系统,第一次扫描出 12000 多个问题。半年之后,减到了 1500 个以内,而项目在此期间没有发生任何一次因代码质量导致的生产故障。

6.4 大项目扫描很慢?这个参数能救你

扫描速度也是很多团队的痛点。一个大型微服务项目,全量扫描经常要跑十几分钟甚至半小时,严重影响 CI 效率。

有几个优化方向可以尝试:

第一,排除无关目录。把targetbuildnode_modulesgenerated-sources这些目录从sonar.sourcessonar.exclusions中排除,扫描速度立竿见影。

第二,合理设置sonar.sourceEncoding和分析范围。对于包含大量自动生成代码的项目,可以在sonar.exclusions中把这些代码排除掉。

第三,使用增量分析。如果只改了几个文件,可以只扫描变更文件对应的模块,而不是全量项目。Java 多模块项目中,可以用-Dsonar.modules=模块A,模块B来限定扫描范围。

第四,调整 Scanner 的 JVM 内存参数。Scanner 默认的内存可能不够用,在sonar-scanner的启动脚本中增大堆内存可以明显提升大项目的扫描效率:

export SONAR_SCANNER_OPTS="-Xmx4g"

实测下来,对一个 20 万行代码的 Java 项目,排除构建产物目录并把 JVM 堆内存从默认值调到 4GB,扫描时间从 18 分钟降到了 7 分钟左右。

7. 最后再分享一个我实际使用中的小技巧

用了几年 SonarQube,我最大的感受是,工具本身并不复杂,复杂的是把工具用起来的决心和流程。很多人装上 SonarQube 跑了一两次就丢在一边,觉得它"没什么用",其实问题往往出在接入方式上:要么没有接入 CI,扫描完就没人再看;要么门禁设置不合理,团队直接不看检查结果。

如果你想在团队里推行 SonarQube,我的建议是先选一个业务相对简单、人员配合度高的项目做试点,把完整流程跑通,把规则和门禁调到一个"能卡住问题但不卡死开发"的平衡点。然后拿着这个项目的真实数据再去面向其他团队推广,比你写十页 PPT 都管用。

还有一个容易被忽略的好习惯:每周花十分钟看一次项目的质量趋势图。SonarQube 的项目主页上有缺陷数、覆盖率、重复率的历史趋势曲线,如果发现某个指标在持续恶化,大概率是新代码的质量在滑坡,趁早介入远比事后补窟窿更省力。工具再强大,也替代不了持续的跟踪和跟进,但这个持续跟进的动作,恰恰是工具能帮你变得最轻松的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 9:43:34

C++ vector底层原理与高性能使用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 9:43:25

YOLOv8在Android端的实时目标检测实践

1. 项目概述在移动端实现实时目标检测一直是计算机视觉领域的热门方向。最近我花了三周时间,从零开始完成了一个基于YOLOv8模型的Android端实时目标检测项目。这个项目完美结合了Jetpack Compose的现代化UI和CameraX的相机能力,最终实现了在普通Android设…

作者头像 李华
网站建设 2026/9/13 9:39:26

Karpathy能力图谱:数据-模型-工程三重校准方法论

1. 这不是“学Karpathy技能”,而是拆解一个顶级AI工程师的底层能力图谱最近在技术圈里,“andrej-karpathy-skills”这个短语频繁出现在GitHub仓库名、Obsidian笔记标题、甚至程序员简历的“技术栈”栏里。它不像“Python入门”或“React实战”那样指向具…

作者头像 李华
网站建设 2026/9/13 9:34:37

JMeter从入门到实战:JDK配置、接口测试与并发压测全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华