
Android 基础补强 B01读懂工程、资源与 Gradle建立有顺序的排错方法摘要Android 入门经常卡在代码之外。本篇从《第一行代码》第 1 章出发区分工程配置、资源、应用入口和运行日志用三个故障案例建立能复用的排查顺序。标签Android工程、Gradle、资源系统、Logcat、第一行代码工程目录不是需要背下来的地图打开 Android 工程后新手很容易在 build.gradle.kts、Manifest、res 和源码之间迷失。理解目录最有效的方法是追踪一个实际变化修改应用名称应该改哪里增加依赖影响哪一步按钮崩溃应该看哪种输出。本篇是书籍基础补强重点对应《第一行代码》第 1 章的工程与工具认识。书中的截图和当前 Android Studio 界面可能不同但构建输入、应用组件、资源引用、设备运行这条主线仍然可用。D01 关注做出卡片本篇关注卡片跑不起来时如何定位责任边界。四类文件各自回答什么问题源码表达行为res 存放由资源系统管理的文本、图片和布局等内容Manifest 声明应用组件与所需能力Gradle 配置告诉构建工具如何组织模块、编译、解析依赖并生成产物。一个报错应该先归类到对应阶段再寻找文件。settings.gradle.kts 通常描述参与构建的模块与仓库配置模块级构建文件描述应用模块的插件、Android 配置和依赖。若项目使用版本目录libs.versions.toml 提供别名与版本集中管理。它改善一致性和可读性但并不自动证明版本兼容。Gradle Wrapper 固定工程使用的 Gradle 发行版Android Gradle Plugin 提供 Android 构建能力运行 Gradle 的 JDK 又是另一项环境输入。终端和 IDE 选择不同 JDK 时可能出现一个能构建、一个失败的现象。排查要记录两端实际使用的配置。构建配置、Android 构建中的 JDK资源为什么值得单独理解把“收藏”文字放进 strings.xml不只是为了避免硬编码。资源系统允许不同语言、屏幕与配置选择对应资源默认资源则是必要兜底。应用代码引用的是资源标识不需要自己拼接所有配置目录。应用资源概览在已有工程的默认 values 资源文件中加入下面内容Compose 中使用 stringResource 读取。这是局部示例需要 compose-ui 的资源 APIR 使用自己模块生成的类本次写稿未编译。resourcesstringnamebookmark_article收藏文章/stringstringnamearticle_count当前共 %1$d 篇文章/string/resourcesimportandroidx.compose.material3.Textimportandroidx.compose.runtime.Composableimportandroidx.compose.ui.res.stringResourceComposablefunArticleCount(count:Int){Text(stringResource(R.string.article_count,count))}参数占位符让文案结构和数值分离。真正的复数语言需求应进一步使用数量资源不能以中文“篇”不变推断所有语言都只需要字符串拼接。资源文件名也有命名限制出现资源链接错误时应先定位文件和行号而非怀疑 Kotlin 状态管理。按失败阶段缩小范围第一类是同步与依赖解析失败检查仓库可访问性、坐标拼写、插件和构建环境关系。第二类是编译或资源处理失败找到首个具体错误区分 Kotlin 类型、缺少导入、XML 格式或资源引用。第三类是安装和启动失败确认目标设备、应用入口及实际安装包。第四类是运行后崩溃读取 Logcat 异常堆栈。末尾的“构建失败”只说明结果真正原因经常在前面的具体错误中。不要只复制最后一行搜索更不要看到失败就清理全部缓存。清缓存是有成本的工具动作需要有证据说明缓存不一致而不应替代阅读错误。命令行验证可以在工程目录执行 Gradle Wrapper 的版本查询与 assembleDebug。这里描述的是本地检查步骤不代表写稿时已运行项目构建。记录完整任务名和失败阶段别把编辑器红线、Gradle 同步失败与设备崩溃混称为“报错”。日志需要围绕问题组织对收藏切换日志可以只包含事件类型、文章 ID、前后状态和必要的请求标识。标签应稳定筛选当前应用进程避免把其他应用日志误认为自己的异常。异常堆栈先找异常类型和消息再沿调用链定位自己的源码入口同时检查嵌套原因。Logcat 能按应用、级别和查询条件过滤过滤太严格也可能把需要的异常隐藏。排查时先证明自己能看到一条明确发出的调试日志再缩小条件。Logcat 官方说明不应为了“日志全面”输出令牌、完整个人信息或全部响应数据。对当前学习项目而言受控假数据和明确 ID 足以解释多数状态问题。写博客时保留与根因有关的片段删掉本机路径和无关账户信息。三个小故障各验证一种判断实验一把字符串资源名称写错预期构建阶段就失败。修复后先确认编译通过不需要进入设备上反复点击。实验二在调试入口构造明确的非法状态检查失败预期运行日志指向抛出位置恢复代码后重新走原操作确认崩溃消失。实验三让点击只记录日志而不修改状态预期点击已发生但文案不变化这说明事件分发和状态修改应分开验证。实验时一次只引入一个缺陷并保存正常版本。修复记录包含复现步骤、失败阶段、直接证据和回归动作即可。没有运行的实验保留“预期”措辞不能把示例异常当作真实工程故障发表。三道原创面试问答1. Gradle 和 AGP 是同一个东西吗不是前者是构建工具后者提供 Android 构建任务与规则。追问升级其中一个是否足够要检查两者和 JDK 的兼容关系不能只看单个版本号。2. 资源替代目录有什么价值它让系统按设备配置选择内容代码可使用统一资源引用。追问为什么还要默认资源不能假设所有运行配置都匹配某个特定替代目录兜底资源保证适用范围。3. Logcat 没有异常是否证明功能正确不证明逻辑错误可能不抛异常过滤条件也可能隐藏输出。追问如何检查收藏错误记录目标 ID 与前后状态并用可复现操作验证业务结果。以上为课程自拟题。完成本篇后应该能把“跑不起来”改写为明确的问题描述并指出下一条证据从哪里获得。这种能力会持续用于后面的网络、数据库和迁移课程。