跳转至

12 调试与常见问题

开发路上报错是常态,本章把新手最容易踩的坑集中排一遍。

12.1 看日志:Logcat

AS 底部 Logcat 窗口输出所有日志。Java 里打日志:

Log.d("MainActivity", "调试信息:变量值 = " + value);  // debug
Log.e("MainActivity", "错误信息", exception);           // error,红色
Log.i("MainActivity", "普通信息");                      // info

Logcat 顶部搜索框按标签过滤(输入 MainActivity),下拉选 Show only selected application 只看自己 App 的日志。

崩溃怎么看:崩溃时 Logcat 出现红色 FATAL EXCEPTION,往下翻到 Caused by: 那行就是根因(英文不好就复制去搜/问 AI)。

12.2 高频报错对照表

报错 原因与解法
R 变红 / cannot find symbol R 资源文件有错(XML 语法/命名非法)。先 Build → Clean Project
findViewById(...) 返回 null 导致 NPE id 写错 / 控件不在当前 setContentView 的布局里
ActivityNotFoundException 目标 Activity 没在 AndroidManifest.xml 注册
ClassNotFoundException(某 Activity) 同上,manifest 漏注册
NetworkOnMainThreadException 网络请求没放子线程
安装失败 INSTALL_FAILED_UPDATE_INCOMPATIBLE 旧包签名不一致:先卸载旧 App 再装
安装失败 INSTALL_FAILED_VERSION_DOWNGRADE 新包 versionCode 比已装的小:调大 versionCode
Gradle 同步卡住/下载慢 换镜像仓库(阿里云 maven),或开代理后 Sync
Manifest merger failed 依赖库要求的 SDK 版本比项目高:把 compileSdk 调高
布局预览一片红 XML 缺 xmlns 或引用了不存在的资源
中文乱码 Java 文件编码用 UTF-8;strings.xml 里写中文最稳

12.3 adb 常用命令

adb devices                    # 查看连接的设备
adb install app-release.apk    # 安装
adb uninstall com.example.xxx  # 卸载(包名)
adb logcat -s MainActivity     # 只看指定标签的日志
adb shell am force-stop com.example.xxx  # 强制停止 App
adb shell dumpsys activity activities | grep -i top  # 看当前前台页面

adb 在 platform-tools 目录下,把它加进系统 PATH 更方便。

12.4 经典疑难

Q:模拟器很卡怎么办? A:AS 的 Device Manager 里编辑设备,把分辨率调低(如 1080p→720p)、开硬件加速;或者直接用真机。

Q:改了代码运行没变化? A:确认点的是 Run 而不是装了旧包;真机没覆盖成功就先卸载再 Run。

Q:Activity 旋转一下数据丢了? A:参考第 4 章用 onSaveInstanceState,或 Manifest 里给该 Activity 配 android:configChanges="orientation|screenSize"(临时方案)。

Q:怎么让 App 图标/名字变成自己的? A:名字在 res/values/strings.xml 的 app_name;图标右键 res/mipmap → New → Image Asset 生成。

Q:发布版和调试版行为不一样? A:多半是混淆(minifyEnabled)把反射用的类干掉了,去 proguard-rules.pro 加 -keep 规则。

Q:想学 Compose(新 UI 框架)? A:本教程是经典 XML + Java 路线,原理通用;Compose 是 Kotlin 的声明式 UI,建议先学完本教程再迁移。


本章练习:故意在代码里制造一个空指针崩溃,用 Logcat 找到 Caused by 并读懂它,然后修复。

🏠 返回总站