news 2026/10/6 3:16:36

Android Studio入门教程:从环境配置到构建第一个App

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android Studio入门教程:从环境配置到构建第一个App

如果你决定做安卓App,不管是为了交课程作业、验证一个点子,还是认认真真想入门移动开发,Android Studio这套工具链迟早要过一遍。很多新手真正卡住的往往不是代码逻辑本身,而是环境那一堆事:下载装哪个版本、首次启动怎么配置、Gradle同步怎么这么慢、模拟器怎么起不来。这篇教程就把“从零到第一个能跑的App”整条路完整走一遍,按我平时带新人时最常踩坑的顺序来讲,尽量让你少走弯路。适合刚接触编程、或者有点Java/Python基础但没碰过安卓的同学参考。

1. 环境准备:装好工具链,再谈写代码

1.1 版本选择:最新稳定版优先,别碰 Canary

打开 Android Studio 官网(developer.android.com/studio)就能看到下载页,这里有 Windows、macOS、Linux 三个平台的安装包,Windows 用户直接下载 .exe。我建议第一次接触的直接选最新稳定版,别碰 Canary 或 Beta,那些版本是给喜欢尝鲜的人准备的,功能不完整还容易出现莫名其妙的问题,新手完全没必要凑热闹。

电脑配置方面,官方要求的底线很低(4GB内存),但实际体验下来,8GB内存是舒服的底线,16GB更稳。Android Studio 本身吃内存,再加上模拟器、浏览器开个文档,4GB机器开个工程风扇就起飞了。硬盘建议预留至少20GB,SDK、系统镜像、Gradle缓存都是吃硬盘的大户。

如果遇到旧项目打不开、需要历史版本的情况,官网页面左侧有“Previous releases / 历史版本”入口,或者去 JetBrains 的存档页面翻。我个人经验是:新项目用新版本,老项目用老版本,别强行用最新版打开老工程,Gradle 和 AGP 的兼容性问题能把人折腾到怀疑人生。

1.2 下载安装与中文界面设置

安装过程没什么技术含量,一直 Next 就行。唯一要注意的是安装路径不要带中文和空格,比如别装到C:\Program Files (x86)这种默认路径其实可以,但要避免C:\下载软件\这种中文目录。同理,工程文件路径也尽量不要中文,编码问题都是在这种细节上埋雷的。

首次启动会进入 Setup Wizard(安装向导),会让你选 Standard 还是 Custom,建议直接选 Standard,它会自动帮你装好 SDK 基础组件。这里有一个容易忽略的知识点:Android Studio 自带 JDK(叫 JBR,JetBrains Runtime),所以你不需要单独装 Java 环境,网上很多老教程让你先配 JDK,那都是老黄历了。

关于中文界面,现在比以前方便太多了。新版 Android Studio 在File -> Settings -> Plugins里搜Chinese Language Pack,安装后重启就是中文界面。另外部分新版本在Settings -> Appearance & Behavior -> System Settings -> Language and Region里能直接切换语言。建议老手用英文,新手用中文会顺很多,至少按钮位置不会找错。

1.3 第一道坎:Gradle 同步到底在干嘛

装好之后你随便新建一个项目,打开过程会卡在一个叫Gradle Sync的步骤上,第一次可能转圈几分钟甚至更久。这个阶段劝退了无数新手,所以提前说一下它是什么。

Gradle 是一个构建工具,负责帮你下载依赖库、编译代码、打包资源。你的项目里写了很多“我要用XXX库”,Gradle 就去网络仓库把这些库下载下来再关联到工程里。第一次同步之所以慢,是因为它要下载两样东西:一是 Gradle 本体(几十一百多MB),二是项目声明的所有依赖库。国内市场访问默认仓库速度不稳定,这时候配置国内镜像就能大幅提速。

具体操作是在settings.gradle.kts文件里加上阿里云镜像,位置在仓库配置段,类似这样:

pluginManagement { repositories { maven("https://maven.aliyun.com/repository/public") maven("https://maven.aliyun.com/repository/google") google() mavenCentral() gradlePluginPortal() } }

配置完记得点一下Sync Now。我试过很多次,加了镜像后同步时间能从十分钟级别降到一两分钟。还有一个建议:保持网络环境稳定,别频繁打断同步,半途取消再来更容易出问题。如果同步报错,先看底部 Build 窗口里的具体日志,不要直接百度报错关键词,很多情况看完整错误信息自己就能判断。

注意:定位 Gradle 问题的核心原则是“看第一条红色错误”,不是看最后一堆失败信息。Gradle 报错经常是连环炸,最后那个错误往往只是“被连累”的,真正的根因通常在第一行。

2. 创建第一个App:新建工程与目录拆解

2.1 新建项目的正确姿势

打开 Android Studio,选择New Project,会看到一堆模板。新手别被“Empty Activity”和“Empty Views Activity”搞晕了。简单说,新版本默认推荐Empty Views Activity,它给你一个最简单的单页面应用,适合做入门起点。如果你看到 Compose 模板,那是另一套声明式UI写法,我建议第一次接触安卓还是先学传统 View 体系,也就是 XML 布局这一套,生态和教程资料都更成熟。

创建时需要填三个关键信息:

  • Name:应用显示名称,比如“我的第一个App”
  • Package name:包名,应用唯一ID,规范写法是反域名格式,比如com.example.myfirstapp,全小写,不要用中文和大写字母
  • Language:选 Kotlin 还是 Java。我的建议是直接选 Kotlin,这是当前安卓开发的主流语言,新工程模板也都是 Kotlin,学起来并不比 Java 更难

保存位置注意不要中文路径,Minimum SDK 保持默认即可,那只是“最低支持安卓版本”的意思,默认值足够大多数场景使用。

2.2 工程目录逐项拆解

项目创建成功后,默认展示的是 Android 视图。这个视图帮你把文件分类整理好了,但很多新手点进去一脸懵。我建议你先在左上角切换到Project 视图(下拉框选 Project),看清楚真实的目录结构:

  • app/manifests/AndroidManifest.xml:应用的“户口本”,声明应用包名、组件、权限等核心信息
  • app/java/包名路径/:你的 Kotlin 源码所在目录,MainActivity.kt就在这里
  • app/res/layout/:XML布局文件,界面长什么样由这里决定
  • app/res/values/:字符串、颜色、主题等资源,相当于把“文字和颜色集中管理”
  • app/build.gradle.kts:App级别的构建配置,依赖库都在这里声明
  • Gradle Scripts/:整个工程用的 Gradle 配置文件

新手最常见的错误是搞不清哪些文件是“代码”、哪些是“布局”。记住一条简单规则:界面长什么样看 res/layout,界面做什么事看 java 里的 Kotlin 文件。两者通过setContentView(R.layout.activity_main)关联起来,这个方法接收布局ID,作用是“把这套布局加载成当前Activity的界面”。

2.3 资源体系与命名规范

res 目录是个很有设计感的东西,它把界面、文字、颜色、图片都抽成“资源”,运行时按需加载。常用的几个子目录:

资源类型存放位置作用
布局res/layout/界面结构
字符串res/values/strings.xml文本集中管理,支持多语言
颜色res/values/colors.xml配色统一
尺寸res/values/dimens.xmldp/sp 尺寸统一管理
图片res/drawable/普通图、选择器等
应用图标res/mipmap/各分辨率图标

命名规范建议全小写、下划线分隔,比如activity_login.xml、btn_login、tv_info。这里有一个常见的坑,也是很多人搜“android studio 资源重复错误”的原因:res 目录下的所有文件默认按文件名去重,比如layout/login.xml和drawable/login.xml虽然类型不同,但资源名容易混淆会报编译错误,更明显的错误是在同目录下放了两个同名不同后缀的文件。解决方法是名字里加上类型前缀,比如布局用activity_login、图片用bg_login,不要都叫login了事。

3. 写界面、写逻辑、跑起来:从空白到可交互

3.1 用XML搭一个登录页:认识三种基本控件

新手第一次写界面,不用急着学很复杂的布局。以登录页为例,只需要三个控件:EditText输入框、Button按钮、TextView文本。布局容器我建议先用最直观的LinearLayout,它按垂直或水平方向排列子控件,比约束布局(ConstraintLayout)好理解得多。

打开app/res/layout/activity_main.xml,粘贴如下内容:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal" android:padding="24dp"> <EditText android:id="@+id/etUsername" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入用户名" android:inputType="text" /> <EditText android:id="@+id/etPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入密码(至少6位)" android:inputType="textPassword" /> <Button android:id="@+id/btnLogin" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/login" /> </LinearLayout>

花几分钟理解这段代码里的门道。layout_width和layout_height是每个控件都必须写的两个属性,match_parent表示铺满父容器,wrap_content表示跟随内容大小。dp是安卓的长度单位,sp是字体专用单位——字体一定要用 sp 而不是 dp,因为 sp 会跟随系统的字体缩放设置,对无障碍访问很重要。这也是很多人问“app字体设置怎么做”的底层答案:想在应用里设置字号,定义文本字号用 sp;想跟手写字号,可以先从 XML 里动态改 textSize,也可以引入自定义字体文件放到res/font/目录使用。

3.2 用Kotlin写交互逻辑:点击、提示与页面跳转

界面只是静态的样子,真正让它“活起来”的是代码逻辑。打开MainActivity.kt,我写一个最简单的交互:点击登录按钮,校验输入是否为空、长度是否够,然后弹一个提示;再放一个跳转按钮,点击打开第二个页面。

package com.example.myfirstapp import android.content.Intent import android.os.Bundle import android.widget.Button import android.widget.EditText import android.widget.Toast import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val etUsername = findViewById<EditText>(R.id.etUsername) val etPassword = findViewById<EditText>(R.id.etPassword) val btnLogin = findViewById<Button>(R.id.btnLogin) btnLogin.setOnClickListener { val username = etUsername.text.toString() val password = etPassword.text.toString() if (username.isNotEmpty() && password.length >= 6) { Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, "用户名不能为空,密码至少6位", Toast.LENGTH_SHORT).show() } } } }

几个关键点要理解。findViewById<T>(R.id.xxx)是“根据ID找到界面控件”的动作,然后给按钮设置点击监听器setOnClickListener,括号里放的是点击后要执行的代码。Toast.makeText就是弹出一个小提示条。这套“找控件 - 设监听 - 处理事件”的流程,是安卓开发最核心的套路,几乎每个页面都离不开。

页面跳转需要多写一步。先新建一个空页面,在app/java/包名路径/下右键选择New -> Activity -> Empty Views Activity,它会自动帮你生成SecondActivity.kt和对应的布局文件,这是一个便捷做法,不用手动建文件再注册。然后给跳转按钮加监听:

btnRegister.setOnClickListener { val intent = Intent(this, SecondActivity::class.java) startActivity(intent) }

如果你用了finish()可以关掉当前页面,比如登录成功后不想让用户返回登录页,就调用它。

3.3 把App跑起来:模拟器与真机调试

点击工具栏的Run 按钮(绿色三角形),Android Studio 会让你选择运行设备。如果没设备,就要先创建一个模拟器。打开 Device Manager(工具栏小手机图标),点Create device,选一个主流机型比如 Pixel 系列,系统镜像选 API 30 以上的 x86_64 镜像。第一次创建模拟器要下载镜像,几百MB大小,耐心等一下。

创建完成后启动模拟器,这个环节有几个常见体验问题:首次启动极慢、冷启动能转一分钟;启动后屏幕显示小、卡顿。慢是正常的,模拟器本质是一个完整操作系统跑在虚拟机里,吃CPU和内存。内存足够的机器建议给模拟器至少2GB内存。

真机调试其实更推荐,安装测试比模拟器快且真实。步骤很简单:手机打开设置 -> 关于手机,连点“版本号”7次开启开发者模式,然后到开发者选项里打开USB调试,插上数据线,手机弹窗问“允许USB调试”就点允许。之后在 Android Studio 的 Run 设备列表里就能看到你的手机,直接运行就行。

命令行爱好者可以用 adb 工具查看和管理设备,这在排查问题时会救你命:

adb devices adb install app-debug.apk adb logcat

adb logcat是查看应用运行日志的方式,App 崩溃时红色的FATAL EXCEPTION就是我们需要盯住的线索。

经验:不要在第一次运行时就追求看懂所有代码。第一遍只要做到“能跑起来、能点击、能跳转”这个目标,就算成功了。很多细节是在后续使用里慢慢理解的,先跑通再深入,是学安卓最快的路径。

3.4 一学完就想做的进阶功能:列表、底部导航与WebView

很多新手做完第一个页面,立刻想做一个“App的主界面”,最常见的需求就是底部一级导航栏。这个需求背后的学名叫BottomNavigationView + Fragment 架构。

思路是这样:底部放3个或4个 Tab,每个 Tab 对应一个 Fragment(页面片段),点击 Tab 时动态切换 Fragment 显示区的内容。Fragment 可以理解成“页面里的区块”,能独立管理自己的布局和生命周期,比直接用三个 Activity 管理起来更简洁。布局大致的结构是:

<LinearLayout> <FragmentContainerView android:id="@+id/fragment_container" /> <BottomNavigationView android:id="@+id/bottom_nav" /> </LinearLayout>

代码侧用FragmentManager做切换,这个模板在 Android Studio 里都有现成例子,搜Bottom Navigation模板就能生成骨架。先看懂这个结构,以后看任何主流App的首页都不懵。

还有一个被反复问到的方向是“Android Studio 怎么打包HTML成App”。这个需求通常是想把网页包进壳子里,做法是用WebView控件加载本地 HTML 文件或者远程网址。关键代码就几行:

val webView = findViewById<WebView>(R.id.webView) webView.settings.javaScriptEnabled = true webView.loadUrl("file:///android_asset/index.html")

把 HTML 放到app/src/main/assets/目录下,就能在 App 里展示。这样做的应用本质是一个“浏览器壳”,适合展示型页面,但涉及登录、支付等复杂交互还是写原生页面更稳。

4. 新手高频报错与排查实录

4.1 Gradle版本与SDK版本不匹配

“Gradle sync failed”是新手遇到最多的报错。常见原因有三类:

  • 网络问题:依赖仓库下载慢或失败。对策是配置国内镜像仓库,参考上文1.3节。
  • 插件版本不匹配:项目的build.gradle.kts里声明了 Android Gradle Plugin(AGP)版本,比如8.1.0,但 Gradle 本体版本太低,会报“requires Gradle X.Y”之类的错误。对策是打开File -> Project Structure -> Project调整 Gradle 版本,或者在gradle-wrapper.properties里修改distributionUrl指向正确版本。
  • 打开别人的工程:从网上下载的教程项目或同事的代码,SDK 版本和 Gradle 版本经常和你的环境不一致。我的建议是先别乱改,让它同步一次,如果同步不成功再看具体是哪一步失败,然后针对性调整。

解决这类问题的通用套路是:先看Build窗口的完整日志,把第一条红色错误复制到搜索引擎。不要只看“BUILD FAILED”就觉得完了,那个大标题下面往往藏着具体到某个文件甚至某一行的错误位置。

4.2 资源重复错误与 R 文件消失

资源重复错误,英文出现在构建日志里大概是Duplicate resources或Resource ... is already defined。这通常由两种原因引起:一是不同目录下出现同名资源文件,二是某些文件移动后旧引用还在。解决方法是检查 res 下所有目录,确认没有同文件名的文件,然后Build -> Clean Project,再重新构建。

还有一种更让人抓狂的情况:写代码时R类突然变红报错。这个 R 类是资源和代码间的“翻译官”,它不是手写的,而是构建时自动生成的。当你的资源文件有错误、XML 语法不对、或者字符串资源里混入了中文字符,R 类就可能生成失败,导致所有R.id.xxx一起报错。遇到这种情况不要一个一个改 R 引用,第一件事是检查res 目录下有没有红点报错的地方,改掉后再重新构建。

4.3 Android 6.0+ 运行时权限:模拟器上行,真机上不行

很多新手会经历这个诡异场景:代码在模拟器跑得好好的,换到真机就闪退;或者打电话、拍照的功能明明写了权限,却无法申请成功。

原因在安卓的安全模型。早期版本安装App时一次性授权所有权限;从 Android 6.0(API 23)开始,涉及隐私的权限(摄像头、麦克风、定位、通讯录等)必须在运行到那一刻动态申请,用户可以选择拒绝或“仅在使用时允许”。

正确写法是先检查是否已授权,没有授权就发起申请,在回调里判断结果:

if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(arrayOf(Manifest.permission.CAMERA), 100) }

同时别忘了在AndroidManifest.xml中声明权限:

<uses-permission android:name="android.permission.CAMERA" />

这两个地方缺一不可:Manifest 声明是“告诉系统我需要”,运行时申请是“征得用户同意”。新手最容易漏掉的是前者,或者两者都写了但忘了处理拒绝回调,导致用户点了拒绝后App没活路可走。好一点的交互是拒绝后再弹一次说明引导,甚至引导用户去系统设置里手动开启。

4.4 数据存储与一个安全提醒:别在本地存明文密码

新手做登录功能,经常顺手把用户名密码放进SharedPreferences。这个类用起来确实简单,两三行就能存取值:

val sp = getSharedPreferences("user", MODE_PRIVATE) sp.edit().putString("password", password).apply()

但它有个让人不安的性质:数据会以明文形式存到本地XML文件里。没有加密、没有防护,Root 过的手机或者有调试工具的环境下,读取这些数据并不困难。我自己早期做过这种功能,后来逆向分析时看到明文密码文件,感觉就是给自己埋雷。

如果只是练手项目,我的建议是密码这种敏感信息根本不落盘,登录成功后存服务端下发的 Token,用EncryptedSharedPreferences或 Keystore 加密存储。这也算是一个安全意识启蒙:功能能跑通不等于可以上线,安全是从第一行代码就要考虑的。

关于“Android Studio 有没有数据库插件”这个问题,现在官方已经内置了一个叫Database Inspector的工具,在View -> Tool Windows -> App Inspection里,可以实时查看运行中App的数据库表结构和数据。它支持 SQLite 和 Room(安卓官方的数据库框架)。如果你用 Room 建表,完全不需要安装第三方插件就能调试,这点比以前方便太多。

5. 从跑起来到上架:打包、签名与发布成本

5.1 Debug版与Release版:不只是名字不同

Android Studio 默认有一个叫 Build Variants(构建变体)的概念,新手时期只需要知道两种:debug和release。在左下角 Build Variants 面板里能切换。

  • Debug版:开发调试用,包名后缀通常是.debug,默认带调试签名,可以直接安装到手机,日志全开放,方便调试。
  • Release版:发布商店用,默认经过代码压缩和混淆(R8),体积更小,也更难被逆向。

发布应用时用的是 Release 版,而 Release 包默认不带签名,所以你没法直接安装 Release 包,必须在打包时配置签名文件。这就是引出签名的原因。

5.2 签名文件:别把密钥搞丢了

安卓应用要求每个正式包必须用签名文件(keystore)签名,签名的作用既是为了证明开发者身份,也是为了防止应用被篡改。同一个应用后续更新必须用同一个签名,否则系统会拒绝覆盖安装,提示“应用未安装”或“签名不一致”。

生成签名文件的方式,最直观的是在 Android Studio 里操作:Build -> Generate Signed Bundle / APK -> APK -> Create new...,填写路径、密码、别名。也可以直接用命令行工具生成,原理一样:

keytool -genkeypair -alias myfirstapp -keyalg RSA -validity 3650 -keystore myfirstapp.keystore

生成的.keystore文件一定要备份好,密码也要记牢。我见过不止一个人因为重装电脑、丢签名文件,导致线上应用无法更新的惨案。签名文件丢了,等于丢了应用的身份证,这是新手中少有人关注但代价极高的坑。

打包过程中还会遇到签名版本选择:V1、V2、V3。我的建议是默认全选,因为 V2 从 Android 7.0 开始支持,验证速度更快更安全;V1 兼容老版本;V3 支持密钥轮换。全选可以让你的 APK 覆盖尽量多的设备。

5.3 AAB 和 APK 的区别,以及发布成本

2021年之后,Google Play 要求新应用改用AAB(Android App Bundle)格式提交。AAB 不是一个可安装包,而是把不同设备所需的资源拆分开,再由商店根据用户设备生成对应的 APK,好处是体积更小。国内应用市场目前基本还是以 APK 为主,所以国内上架通常传 APK。

很多人关心“开发一个App并上架大概要多少钱”,我用两种视角给个参考。从工具成本看,Android Studio 免费、SDK 免费、个人练手成本几乎为零,时间才是最大的投入,一个简单App从零到能跑,认真学一个月就能做到。从商业成本看,如果你找外包团队做一个带界面的简单应用,市场行情通常两三万起步,带后端服务、管理后台、第三方支付等复杂业务的话,几万到几十万都很正常。上架平台本身,Google Play 注册开发者账号是 25美元一次性费用;国内各应用商店以企业或个人开发者身份注册,大多不收基础费用,但要求提交各类资质材料,具体以平台最新指引为准。

我的建议是:如果这是你第一个练手App,不要一上来就想着上架。先在一个自己手机上安装体验,收集使用反馈,把崩溃率压到接近零,再考虑商店审核这些事。上架只是最后一道工序,不是目的。

5.4 上线前的自检清单

我邀请朋友测试过好几个练手项目,也被人问过“为什么商店审核没过”,这类问题十有八九是下面几个细节没照顾到:

检查项具体内容
图标与名称各尺寸 mipmap 图标是否齐全、应用名称没有违规词
权限最小化有没有申请一些根本用不到的权限,商店审核非常在意这个
隐私合规涉及用户输入数据的,是否有隐私政策页面
内置日志有没有在发布版里打印敏感日志,确认 release 包日志关闭
版本与签名versionCode 是否递增、签名文件是否一致
真机测试至少考虑 Android 10 和 Android 14 两台真机各跑一遍

其中权限最小化是我最想强调的:很多人习惯在网上复制代码,把人家的权限声明也一起搬来了,比如做个计算器却申请了定位权限,审核被拒基本板上钉钉。做一个App,只申请它真正需要的权限,这是基本的专业素养。

最后再分享几句大实话

我从第一次打开 Android Studio 到现在,印象最深的不是某个框架的用法,而是“环境问题才是新手第一课”这件事。下载、安装、Gradle、SDK、模拟器,每一环都能卡住人,而且互联网上很多教程已经过时了,版本对不上反而更乱。所以我在文章里反复强调的,都是这些年真正把新人绊倒过的地方。

这个入门路径接下来的扩展方向,我简单指几个自己觉得值得走的:基础熟了可以去试试蓝牙开发,比如用 App 控制一块 ESP32 开发板,这套玩法既硬件又软件,特别有成就感;也可以认真啃一下 Jetpack Compose,那是目前界面开发的新趋势,一句话:列表、导航、网络请求这两关过了,你就从一个“能跑通教程的人”变成了“能做点小东西的人”,后面的路越走越宽。

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

SAP BTP ABAP环境集成UI Theme Designer实现Fiori品牌主题定制

接手过一个让我印象挺深的活儿&#xff1a;公司刚把核心业务搬到SAP S/4HANA上&#xff0c;销售、采购、财务每天都要开着SAP Fiori界面干活&#xff0c;浅灰蓝的Quartz主题其实挺干净&#xff0c;但和公司官网、展厅大屏上那一整套深蓝加金色的品牌形象完全不搭。直到有次客户…

作者头像 李华
网站建设 2026/10/6 3:15:30

SpringBoot+Vue+MyBatis+MySQL校园店铺系统全栈实战解析

1. 项目概述&#xff1a;一套能直接跑起来的完整前后端分离方案最近毕业设计季和课程设计扎堆&#xff0c;我身边好几个学弟学妹都在做校园电商类项目&#xff0c;但大多数卡在了同一个地方&#xff1a;代码东拼西凑能跑起来&#xff0c;但一问到“为什么这么设计”“上线部署怎…

作者头像 李华
网站建设 2026/10/6 3:15:10

从单体到微服务:读书打卡小程序架构演进实战复盘

一个读书打卡小程序&#xff0c;业务上看起来很简单&#xff1a;用户登录、书架放书、点开章节阅读、读完打卡、拿积分、看排行榜。但真要把用户量、多端、持续迭代这些因素放在一起考虑&#xff0c;单体应用很快就会让你难受。这篇就聊聊我做的"书洞"在线阅读打卡系…

作者头像 李华
网站建设 2026/10/6 3:14:40

Unity3D多人在线VR赛车开发:网络同步与物理权威实战

简介&#xff1a;这是一套基于Unity3D引擎开发的多人在线VR赛车竞速游戏完整工程&#xff0c;面向游戏开发方向的学生、独立开发者及VR/网络同步技术学习者&#xff0c;可用于课程设计、毕业项目或技术研究。资源包共3737个文件&#xff0c;约246.03MB&#xff0c;以cs脚本、me…

作者头像 李华
网站建设 2026/10/6 3:14:34

从TCP到HTTP:网络IO性能优化的分层排查与实战指南

最近我碰到一个挺典型的报错&#xff0c;同事把日志贴到群里问了一圈&#xff1a;Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http。乍一看是镜像源的问题&#xff0c;有人让他换源&#xff0c;有人让他重启Docker&#xff0c;折腾半…

作者头像 李华
网站建设 2026/10/6 3:14:18

10类水稻害虫检测数据集:VOC格式解析与YOLO训练实战指南

简介&#xff1a;面向目标检测与农业害虫识别场景&#xff0c;这份水稻害虫检测数据集采用VOC标注格式&#xff0c;涵盖10个害虫类别&#xff0c;并附类别json字典与可视化脚本&#xff0c;可直接用作目标检测数据集。压缩包共2000个文件&#xff0c;以1999个XML标注为主&#…

作者头像 李华