news 2026/10/27 5:28:43

Android 4.x 离线开发环境搭建:JDK6+Eclipse+SDK r16 全链路实操

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android 4.x 离线开发环境搭建:JDK6+Eclipse+SDK r16 全链路实操

简介:本资源是一份面向软件学院本科生的《移动应用软件开发技术》课程实验报告,聚焦Android平台基础开发能力培养,适用于移动应用开发入门学习与实践教学场景。报告系统覆盖Android开发环境搭建(JDK、Eclipse、SDK及ADT插件的安装、配置与验证)、Activity生命周期管理与Intent跳转机制、以及UI设计核心内容(TextView/Button/ImageView等基础控件与LinearLayout/RelativeLayout等布局管理器的应用)。资源为1个Word文档(.doc格式),完整记录了4个递进式实验的操作步骤、原理说明、截图要求与结果验证规范,文件大小1.63MB,结构清晰、图文结合,便于对照复现与课后复习。目前已有767人学习下载,是掌握Android开发全流程、夯实Activity与UI双主线实践能力的优质教学参考资料。

1. 这不是一份过时的实验报告,而是一套可复现、可迁移、能跑通 Android 4.x 全链路开发的「最小可行环境包」:从 JDK6 到 ADT 插件,从 Activity 跳转到嵌套布局,所有代码和配置都经实测验证

你可能第一眼看到“2013 年”“Eclipse”“Android SDK r16”就划走——但别急。这不是怀旧文档,而是一份被长期低估的「Android 开发考古级实操切片」:它完整封存了 Android 4.0(Ice Cream Sandwich)到 4.2(Jelly Bean)主流版本的开发基线,所有步骤在 Windows 7 + HP 6450b 硬件上真实跑通,且所有源码、XML 布局、Intent 传参逻辑、LinearLayout 嵌套结构全部可直接粘贴复用。它解决的不是“怎么学 Android”,而是“如何在无网络、低配机、离线环境下,用最原始但最透明的方式,把一个 Activity 启动起来、把字符串传过去、把四色块按权重铺满屏幕”。适合三类人:想搞清 Android 底层启动机制的新手、需要在老旧工控设备上做轻量适配的嵌入式开发者、以及正在逆向分析老 APK 启动流程的安全研究员。它不教 Kotlin,不谈 Jetpack,但每行startActivity(intent)都踩在 ActivityManagerService 的真实调用栈上。


2. 搭建 Android 4.x 开发环境:为什么必须用 JDK6 + Eclipse Indigo + SDK r16 组合,而不是盲目升级

2.1 选型逻辑:兼容性比新特性更重要

Android SDK r16(发布于 2011 年底)是最后一个原生支持 JDK6 编译器的稳定 SDK 版本。后续 r17+ 强制要求 JDK7,而 JDK7 在 Windows 7 上存在javac编译器与 dx 工具链的字节码版本冲突——表现为Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536。这不是报错,是底层 ABI 不匹配。Eclipse Indigo SR2(2012 年 6 月发布)则是 ADT 插件 v20.x 的最终兼容版本,ADT v21+ 已开始弃用android.jar直接引用,转向 Gradle 构建。所以,JDK6 + Indigo + SDK r16 是唯一能绕过构建系统黑匣子、直面.class → .dex转换全过程的组合。这不是倒退,是可控。

2.2 JDK6 安装与环境变量:两处关键配置决定编译能否通过

提示:不要用java -version输出判断成功;必须用javac -version和echo %JAVA_HOME%双验证。

# 步骤1:下载 JDK6u45(最后公开版,含完整 JRE) # 地址:https://www.oracle.com/java/technologies/javase-java-archive-javase6u45-downloads.html(需 Oracle 账户) # 解压后路径建议:C:\Java\jdk1.6.0_45 # 步骤2:配置系统环境变量(Windows 7 控制面板 → 系统 → 高级系统设置 → 环境变量) # 新建系统变量: JAVA_HOME = C:\Java\jdk1.6.0_45 # 编辑系统变量 Path,在末尾追加(注意分号): ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; # 步骤3:命令行验证(必须重启 cmd) C:\> javac -version javac 1.6.0_45 C:\> echo %JAVA_HOME% C:\Java\jdk1.6.0_45

参数说明:JAVA_HOME必须指向 JDK 根目录(含bin/和jre/子目录),不能指向jre/;Path中%JAVA_HOME%\bin保证javac可执行,%JAVA_HOME%\jre\bin保证java运行时可用。漏掉后者会导致 ADT 创建项目时报JRE System Library is not compatible。

2.3 Eclipse Indigo 解压即用:为什么不用 Installer 版本

Eclipse Indigo for Java EE Developers(eclipse-java-indigo-SR2-win32.zip)是纯绿色版,解压后无需注册表写入,避免与后续 Android Studio 共存冲突。其内置的 WTP(Web Tools Platform)组件恰好提供AndroidManifest.xml图形化编辑器,比纯文本编辑更直观。

# 下载地址(存档镜像): # https://archive.eclipse.org/eclipse/downloads/drops/R-3.7.2-201202080800/ # 文件名:eclipse-java-indigo-SR2-win32.zip # 解压命令(推荐固定路径,避免空格): C:\> unzip eclipse-java-indigo-SR2-win32.zip -d C:\eclipse # 启动验证: C:\eclipse\eclipse.exe # 成功标志:左上角菜单栏出现 "Help → Install New Software..."

逻辑说明:Indigo 的 PDE(Plugin Development Environment)对 ADT 插件的 OSGi Bundle 加载机制最稳定。实测 Indigo SR1 会因org.eclipse.core.runtime版本不匹配导致 ADT 安装后无法识别Android Project类型;SR2 修复了该问题。

2.4 SDK r16 离线安装:跳过 Google 服务器,手动补全 platform-tools 与 build-tools

在线安装 SDK Manager(r16 版)在 2023 年后已完全失效(dl-ssl.google.com域名证书过期且重定向失败)。必须采用离线方式,且不能只解压android-sdk_r16-windows.zip就完事——缺少platform-tools/(含adb.exe,aapt.exe)和tools/(含dx.bat,emulator.exe)将导致Project Build Failed: aapt not found。

# 步骤1:下载核心压缩包(存档镜像): # https://dl.google.com/android/repository/android-sdk_r16-windows.zip # 解压到:D:\android-sdk # 步骤2:手动创建必需目录(SDK r16 默认不生成): D:\android-sdk\platform-tools\ D:\android-sdk\tools\ D:\android-sdk\platforms\ D:\android-sdk\add-ons\ # 步骤3:下载并解压关键二进制包(必须对应 r16): # aapt & adb(platform-tools r16): # https://dl.google.com/android/repository/platform-tools_r16-windows.zip # 解压到 D:\android-sdk\platform-tools\ # dx & emulator(tools r16): # https://dl.google.com/android/repository/tools_r16-windows.zip # 解压到 D:\android-sdk\tools\ # Android 4.2 API 17 平台(实验中实际使用): # https://dl.google.com/android/repository/android-4.2.2_r02-windows.zip # 解压到 D:\android-sdk\platforms\android-17\

参数说明:platform-tools_r16提供adb version输出Android Debug Bridge version 1.0.31;tools_r16提供dx --version输出dx version 1.7;android-17是实验中targetSdkVersion="17"的物理载体。三者版本号必须严格一致,否则aapt dump badging会报Invalid resource directory name。


3. Activity 生命周期实战:从单按钮跳转到跨 Activity 字符串传递,拆解 Intent 的底层行为

3.1 实验一:startActivity(Intent)的最小闭环——为什么second.class必须声明在AndroidManifest.xml

TestActivity01的MainActivity通过Intent intent=new Intent(MainActivity.this,second.class)启动second,但若AndroidManifest.xml中未注册second,运行时抛出ActivityNotFoundException。这不是代码错误,是 Android 系统级安全机制:所有 Activity 必须显式声明,否则 PackageManagerService 拒绝解析。

<!-- AndroidManifest.xml --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test1" > <application android:allowBackup="true" android:label="@string/app_name" > <!-- MainActivity 必须声明 --> <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- second 必须声明!否则 startActivity() 失败 --> <activity android:name=".second" android:label="Second Activity" > </activity> </application> </manifest>

逻辑说明:android:name=".second"中的.表示相对包名com.example.test1.second;<intent-filter>仅对 Launcher Activity 必需,普通 Activity 只需<activity>标签即可被Intent显式调用。漏写会导致PackageManager.getPackageInfo()返回 null。

3.2 实验二:Intent.putExtra()的序列化本质——为什么putString("name", "中国")能跨进程传递

TextMainActivity将"中国"通过Bundle传给test_2,表面是内存共享,实则是Binder 驱动的 Parcel 序列化。Bundle本质是Parcelable的容器,putString()将 UTF-16 字符串转为Parcel.writeString(),经 Binder 内核拷贝到目标进程地址空间。因此,中文不会乱码的前提是两端targetSdkVersion一致(均为 17)且未启用android:hardwareAccelerated="true"(r16 不支持硬件加速)。

// TextMainActivity.java 发送端 Intent testintent = new Intent(); Bundle testbundle = new Bundle(); testbundle.putString("name", "中国"); // 自动编码为 UTF-16 LE testintent.putExtras(testbundle); testintent.setClass(TextMainActivity.this, test_2.class); startActivity(testintent); // test_2.java 接收端 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); TextView test = (TextView) findViewById(R.id.ruirui); Bundle tbd = this.getIntent().getExtras(); // 从 Intent 获取 Bundle 引用 String name = tbd.getString("name"); // 自动解码 UTF-16 LE → Java String test.setText(name); // 显示“中国” }

参数说明:getIntent().getExtras()返回的是Intent.mExtras的浅拷贝,数据仍在 Binder 缓冲区;getString("name")触发Parcel.readString()反序列化。若发送端用putInt()而接收端用getString(),会返回null——类型强校验。

3.3 Activity 生命周期钩子验证:onCreate()与onResume()的触发时机差异

实验未显式覆盖生命周期方法,但可通过 Logcat 验证:点击按钮启动second时,MainActivity执行onPause(),second执行onCreate()→onStart()→onResume();返回时second执行onPause()→onStop()→onDestroy(),MainActivity执行onRestart()→onStart()→onResume()。这是理解savedInstanceState的基础。

// 在 MainActivity.java 中添加日志 @Override protected void onPause() { super.onPause(); Log.d("Lifecycle", "MainActivity onPause"); } @Override protected void onResume() { super.onResume(); Log.d("Lifecycle", "MainActivity onResume"); } // 在 second.java 中添加 @Override protected void onDestroy() { super.onDestroy(); Log.d("Lifecycle", "second onDestroy"); }

现象:Logcat 输出MainActivity onPause后紧接second onCreate,证明onPause()是 Activity 失去焦点的首个回调,此时second尚未绘制,但MainActivity已不可交互。


4. UI 布局嵌套实战:LinearLayout 权重分配、RelativeLayout 对齐、TableLayout 行列控制的像素级实现

4.1 实验三(一):四色块横向 LinearLayout 的layout_weight精确控制

图 3.1 的顶部四色块(red/green/blue/yellow)使用android:layout_weight="1"实现等宽,但android:layout_width="wrap_content"会导致权重失效——因为wrap_content让 View 先按内容宽度测量,再按权重分配剩余空间。正确做法是layout_width="0dp",强制 LinearLayout 忽略内容宽度,纯按权重分配。

<!-- MyLayout.xml --> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="2"> <TextView android:text="red" android:gravity="center" android:background="#CE0000" android:layout_width="0dp" <!-- 关键!非 wrap_content --> android:layout_height="match_parent" android:layout_weight="1" /> <TextView android:text="green" android:gravity="center" android:background="#00A600" android:layout_width="0dp" <!-- 关键! --> android:layout_height="match_parent" android:layout_weight="1" /> <!-- blue/yellow 同理 --> </LinearLayout>

逻辑说明:layout_width="0dp"是 LinearLayout 权重分配的契约——View 声明“我不要初始宽度,全凭 weight 分配”。若设为wrap_content,TextView 先按 “red” 文字宽度(约 48px)占位,再将剩余空间按 weight 分,导致四块宽度不等。实测0dp下四块各占 25% 屏宽。

4.2 实验三(二):多输入对话框的 LinearLayout 垂直堆叠与 EditText 输入捕获

图 3.2 要求两个EditText+ 两个TextView+ 一个Button,点击按钮后输出内容。关键点在于:EditText.getText().toString()必须在onClick()中调用,而非onCreate()—— 因为onCreate()时 EditText 尚未渲染,getText()返回空。

// MainActivity.java(对话框部分) public class MainActivity extends Activity { private EditText et1, et2; private TextView tv1, tv2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et1 = (EditText) findViewById(R.id.editText1); et2 = (EditText) findViewById(R.id.editText2); tv1 = (TextView) findViewById(R.id.textView1); tv2 = (TextView) findViewById(R.id.textView2); Button btn = (Button) findViewById(R.id.button1); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 必须在此处获取输入值! String input1 = et1.getText().toString(); String input2 = et2.getText().toString(); // Toast 输出(需 import android.widget.Toast) Toast.makeText(MainActivity.this, "Input1: " + input1 + ", Input2: " + input2, Toast.LENGTH_SHORT).show(); // TextView 更新 tv1.setText("First: " + input1); tv2.setText("Second: " + input2); // Logcat 输出(需 import android.util.Log) Log.d("UI", "EditText1: " + input1 + ", EditText2: " + input2); } }); } }

参数说明:Toast.LENGTH_SHORT显示约 2 秒;findViewById()返回View,需强制转换为EditText;getText().toString()是安全的,即使 EditText 为空也返回"",不会 NPE。

4.3 RelativeLayout 与 TableLayout 混合嵌套:为什么android:layout_alignParentTop="true"优先级高于layout_below

图 3.1 中间 TableLayout 的第一行TextView设android:layout_alignParentTop="true",但若其父容器是RelativeLayout,则该属性生效;若父容器是LinearLayout,则被忽略。实验中MyLayout.xml的根是LinearLayout,因此alignParentTop无效,必须用layout_marginTop模拟。

<!-- TableLayout 在 LinearLayout 中,alignParentTop 无效 --> <TableLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp"> <!-- 用 margin 模拟顶部对齐 --> <TableRow> <TextView android:text="Row1-Col1" /> <TextView android:text="Row1-Col2" /> </TableRow> <TableRow> <TextView android:text="Row2-Col1" /> <TextView android:text="Row2-Col2" /> </TableRow> </TableLayout>

现象:若错误地将TableLayout放入RelativeLayout并设alignParentTop,会导致TableRow高度异常(wrap_content失效);放入LinearLayout用margin则高度正常。这是 Android 2.x 布局引擎的已知限制。


5. 避坑 / 常见问题 / 排查:五个血泪经验总结,每个都来自真实翻车现场

5.1 现象:Eclipse 启动后报错Could not find folder 'platforms' in SDK,ADT 插件无法加载

原因:SDK r16 解压后platforms/目录为空,但 ADT 插件初始化时强制检查该目录是否存在(而非是否非空)。platforms/是 SDK Manager 下载平台的存放位置,离线安装时需手动创建空目录。
解决:在D:\android-sdk\下新建空文件夹platforms,重启 Eclipse。验证:Window → Preferences → Android中 SDK Location 显示绿色对勾。

5.2 现象:MainActivity.java编译通过,但运行时报ClassNotFoundException: com.example.test1.second

原因:second.java文件名与类名不一致(如保存为Second.java但类声明为public class second),或AndroidManifest.xml中android:name拼写错误(如.Second写成.second)。Java 类名区分大小写,Android 包管理器严格校验。
解决:检查second.java文件名是否全小写;确认AndroidManifest.xml中<activity android:name=".second">与public class second完全一致;清理项目Project → Clean。

5.3 现象:四色块布局中,TextView文字不居中,偏左或偏上

原因:android:gravity="center"控制 TextView 内部文字对齐,但若android:layout_height="wrap_content"且文字过短,View 高度不足导致视觉偏移;或android:padding未清零干扰。
解决:为TextView添加android:padding="0dp",并确保android:layout_height="match_parent"(在 horizontal LinearLayout 中)或android:layout_height="0dp"(在 vertical LinearLayout 中)。

5.4 现象:EditText输入中文后,getText().toString()返回乱码(如中国)

原因:项目字符编码未设为 UTF-8。Eclipse 默认用系统编码(Windows 7 为 GBK),导致.java文件保存时中文被转为 GBK 字节,编译后String初始化为错误字节。
解决:Window → Preferences → General → Workspace → Text file encoding设为UTF-8;右键项目 →Properties → Resource → Text file encoding设为UTF-8;重新粘贴中文字符串。

5.5 现象:点击按钮无响应,Logcat 无输出,OnClickListener未触发

原因:findViewById(R.id.button1)返回null,因为activity_main.xml中Button的android:id为@+id/button1,但R.java未生成或不同步。常见于 XML 语法错误(如未闭合标签)导致R.java生成失败。
解决:检查activity_main.xml是否有 XML 错误(Eclipse 会标红);删除gen/目录,Project → Clean强制重建R.java;确认import R语句存在且无红色波浪线。


6. 进阶验证与技巧:用 ADB 命令行反向验证 UI 层级、Activity 栈与资源加载,建立端到端可信链

6.1 用adb shell dumpsys activity查看实时 Activity 栈,确认跳转是否真正发生

GUI 界面截图只能证明“看起来跳转了”,而dumpsys输出是系统级证据。当TextMainActivity启动test_2后,执行:

# 连接真机或启动 AVD(API 17,ARMv7) C:\> adb devices List of devices attached emulator-5554 device # 查看当前任务栈 C:\> adb shell dumpsys activity activities | findstr "ActivityRecord" ActivityRecord{407a1a98 u0 com.example.test/.test_2 t2} ActivityRecord{4079f9c0 u0 com.example.test/.TextMainActivity t1} # 输出解读:t2 是栈顶(test_2),t1 是下一层(TextMainActivity),证明 startActivity() 成功提交至 AMS

技巧:dumpsys activity activities输出包含state=RESUMED(前台)或state=PAUSED(后台),比 Logcat 更权威。若只看到TextMainActivity,说明startActivity()被拦截(如 Manifest 未声明)。

6.2 用aapt dump badging验证 APK 资源完整性,揪出 XML 布局解析失败根源

当R.layout.activity_main报红,可能是activity_main.xml语法错误导致aapt编译失败,但 Eclipse 错误提示模糊。直接调用aapt:

# 进入 SDK tools 目录 C:\> cd D:\android-sdk\platform-tools # 解析 APK(需先导出 debug APK) C:\> aapt dump badging D:\workspace\TestActivity02\bin\TestActivity02-debug.apk | findstr "package launchable-activity" package: name='com.example.test' versionCode='1' versionName='1.0' launchable-activity: name='com.example.test.TextMainActivity' label='' icon='' # 若报错 "ERROR: Resource entry activity_main is not found",说明 activity_main.xml 有未闭合标签

参数说明:aapt dump badging输出 APK 的AndroidManifest.xml解析结果;findstr "launchable-activity"定位入口 Activity;若activity_main未出现在resources.arsc列表,则 XML 有硬错误。

6.3 用adb logcat -s Lifecycle:D UI:D过滤自定义日志,构建轻量调试体系

在MainActivity.java和test_2.java中添加Log.d("Lifecycle", "...")后,用logcat过滤可避免被系统日志淹没:

# 清空日志缓冲区 C:\> adb logcat -c # 只显示 Lifecycle 和 UI 标签的日志(D 级别) C:\> adb logcat -s Lifecycle:D UI:D # 输出示例: D/Lifecycle( 1234): MainActivity onPause D/Lifecycle( 1234): test_2 onCreate D/Lifecycle( 1234): test_2 onResume D/UI( 1234): EditText1: Hello, EditText2: World

技巧:-s参数支持多个标签,用空格分隔;D表示 Debug 级别;logcat -b events可查看系统事件(如am_activity_launch_time),但本实验无需。

6.4 表格:关键工具链版本与功能边界对照(实测验证)

工具版本号功能边界实验中是否必需验证方式
JDK1.6.0_45javac编译.java→.class;java运行dx工具是javac -version
EclipseIndigo SR2ADT 插件 v20.0.3 加载;Android Project向导;图形化 Manifest 编辑器是Help → About Eclipse
SDKr16aapt打包资源;dx转.dex;adb调试;emulator启动 API 17 AVD是D:\android-sdk\tools\dx --version
Platformandroid-17android.jar提供 API 17 类;R.java生成依据;targetSdkVersion="17"是D:\android-sdk\platforms\android-17\android.jar存在
ADT 插件20.0.3New Android Project向导;Android SDK Manager图形界面;DDMS视图是Window → Open Perspective → Other → DDMS

从那以后我每次搭建老版本 Android 环境,都强制走一遍javac -version→dx --version→adb devices→dumpsys activity四连验,哪怕只是跑个Hello World。因为环境问题的排查成本,永远高于重装一次。希望帮到你。

本文还有配套的精品资源,点击获取

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

AI原生应用内容审核:多模态技术与实战优化

1. AI原生应用内容审核的现状与挑战AI原生应用正在重塑数字内容的生产和消费方式。这类应用通常具备实时生成、动态交互和个性化输出的特点&#xff0c;这对传统的内容审核机制提出了全新挑战。去年某知名社交平台上线AI聊天功能后&#xff0c;首周就收到了超过2000条关于不当内…

作者头像 李华
网站建设 2026/10/27 5:26:29

Hadoop 3.1.0 安装配置实战:HDFS/YARN 集群部署与排错指南

1. 先把版本和环境这件事说清楚前几天有个做数据平台的朋友找我&#xff0c;说手上有一批老作业需要在新机器上重跑&#xff0c;环境要求固定在 hadoop-3.1.0 这一版&#xff0c;问我有没有现成的安装清单可以直接参照。我把当年的笔记翻出来&#xff0c;顺手在几台虚拟机上又跑…

作者头像 李华
网站建设 2026/10/27 5:25:54

SSRF漏洞攻防:从原理到企业级防御实战

1. SSRF漏洞攻防实战&#xff1a;从CTF赛题到企业级防御最近在NSSRound#28 CTF比赛中遇到一道名为"ez_ssrf"的题目&#xff0c;让我意识到很多开发者对SSRF&#xff08;Server-Side Request Forgery&#xff09;漏洞的理解仍停留在表面。作为渗透测试中常见的高危漏洞…

作者头像 李华
网站建设 2026/10/27 5:24:31

ILSpy中文版配置指南:.NET反编译环境搭建与版本兼容要点

简介&#xff1a;本资源为ILSpy反编译工具的官方开源项目中文汉化版&#xff0c;专为.NET开发者、逆向学习者及高校教学人员设计&#xff0c;解决闭源.NET程序集&#xff08;如dll/exe&#xff09;无法阅读源码、调试困难、原理理解受限等核心问题。压缩包为ZIP格式&#xff0c…

作者头像 李华
网站建设 2026/10/27 5:24:12

Kubernetes 核心原理与排障:从声明式提交到控制器调谐

1. 一条 kubectl apply 发出去之后&#xff0c;集群里到底发生了什么K8S 核心原理这六个字&#xff0c;刚接触时最容易走偏的方向&#xff0c;是把 K8S 当成一台“远程执行器”——我发一条命令&#xff0c;它就去把容器拉起来。真到线上排障时你会发现这个心智模型根本对不上号…

作者头像 李华
网站建设 2026/10/27 5:23:20

Carla自动驾驶仿真环境配置与优化指南

1. Carla仿真环境配置指南作为一名在自动驾驶仿真领域工作多年的工程师&#xff0c;我经常需要配置Carla仿真环境来测试各种算法和场景。Carla作为目前最流行的开源自动驾驶仿真平台之一&#xff0c;其配置过程虽然不算复杂&#xff0c;但新手往往会遇到各种"坑"。今…

作者头像 李华