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 并读懂它,然后修复。