尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

第一行代码第3版随书源码详解:Kotlin与Jetpack工程实践

第一行代码第3版随书源码详解:Kotlin与Jetpack工程实践 简介《第一行代码——Android第3版》随书源代码是面向Android开发初学者与转岗程序员的实践配套资源精准解决“学理论难上手、看代码缺上下文”的核心痛点助力读者通过可运行项目快速掌握从界面布局、数据存储到网络通信、定位服务等全链路开发技能。压缩包共2082个文件涵盖800余个XML布局与资源定义文件、242张UI适配PNG图、222个Flat编译中间文件、139个JSON配置及61个Kotlin源码.kt辅以Gradle构建脚本、ProGuard混淆配置等工程必需文件总大小36.2MB结构严格对应书中章节便于边学边调、逐模块验证。已有243人下载学习源码含详尽注释、标准Android四大组件Activity/Service/BroadcastReceiver/ContentProvider完整示例以及library-debug.aar等模块化产物直观呈现现代Android项目分层架构与依赖管理实践是构建扎实开发认知不可替代的实操基底。 但凡干过两年以上Android开发的人应该都绕不开郭霖那本《第一行代码》。这本书从第1版一路出到第3版在国内几乎是Android开发者的共同启蒙教材。到了第3版最明显的变化就是所有示例代码从Java切换成了Kotlin而且新增了Jetpack、Compose和协程这些近年来的主流技术。我建议所有正在啃这本书的同学一定要把随书源代码下载下来配合着看因为书里为了控制篇幅经常会把代码省略成一句话只靠眼睛看是看不出门道的代码在IDE里真正跑起来你才会有那种“原来如此”的感觉。这套随书源代码是什么简单说它是作者郭霖为《第一行代码 Android第3版》整理发布的全套示例工程覆盖书里从Activity、Fragment到网络、持久化、Material Design、Jetpack、Compose、协程的每一个章节每章对应一个可以独立运行的Android项目。它能帮你解决的最大痛点是书上看不懂的代码直接打开工程改两行就能跑省去了逐个字符手敲的麻烦也能避免因为版本不一致导致的“明明照着写的就是编译不过”。如果你是正在读第3版的学生、刚转行做Android的初学者或者想系统补一遍Kotlin和Jetpack栈的后端/前端同学这套源码是你学习路径上最值得精读的参考材料之一。接下来我会从代码组织方式、设计思路、导入实操、章节精读、问题排查和进阶用法几个角度把这份资源彻底讲透。1. 先说清楚这套随书源代码到底是什么、怎么组织1.1 章节分布和工程命名规律作者郭霖在GitHub上维护了一个叫FirstLineCode的仓库书的前言和封底也提供了下载入口。下载解压之后你会发现它并不是一个塞满所有示例的大项目而是按章节拆成的一个个小工程每一章对应一个可独立运行的Android项目。比如早期章节的工程名基本都是Chapter2、Chapter3这种编号后面章节则会根据主题命名基本在目录上一眼就能对上书里的章节顺序。每个小工程都是一个完整的Android项目里面有标准的gradle配置文件、AndroidManifest.xml、Kotlin源代码目录和res资源目录。这意味着你可以单独打开任意一章不需要把整本书十几章的代码全都塞进同一个IDE窗口。从工程组织上讲这是非常聪明的做法因为Android的Gradle工程本身就很重依赖下载、构建、索引都会消耗不少时间拆开之后互相之间零干扰加载速度也能快很多。1.2 为什么第3版全部换成Kotlin如果你看过第2版应该还记得里面的示例全是Java。第3版之所以全部改成Kotlin背后是Android官方在2017年IO大会上宣布“Kotlin first”之后的一系列生态变化。到了第3版写作的时间点Google官方文档、Jetpack库、第三方开源项目的示例代码都已经大量迁移到Kotlin新语言特性空安全、扩展函数、协程逐渐成为Android开发者的标配。对初学者来说Kotlin相比Java确实更能减少样板代码。比如声明一个点击事件Java里要写一大串匿名内部类Kotlin一行setOnClickListener { }就完了。代码量少了读起来负担自然就轻这对刚入门的人来说是很友好的。而且学了第3版的Kotlin写法之后你基本可以直接适应现在绝大多数公司的Android技术栈不用再经历“Java学完发现外面都在用Kotlin”的尴尬。2. 这套代码的设计思路理解作者为什么这么安排2.1 每一章一个独立工程是为了降低干扰很多初学者拿到源码后第一反应是“为什么不是一个完整App”这是因为作者刻意把每个知识点拆成了独立的小工程。如果一个项目里堆了十几个Demo一旦编译报错一大堆模块互相引用新手根本分不清问题出在哪一层。独立工程的好处是学第2章就跑第2章学第8章就跑第8章代码量小、日志短定位问题非常直接。更重要的是这种组织方式天然对应了“最小可复现案例”的理念。Android开发里排查问题最有效的方式就是抽一个最小工程把无关逻辑全部甩掉只留触发问题的代码。书里每个章节的工程就是一个被精心裁剪过的最小案例你不仅能用它来学知识点也可以把它当成日常实验的沙盒往里加代码验证各种想法。2.2 从最简单的Activity到完整的项目架构整套代码的学习路径是有明显递进关系的。前面几章从Activity、Fragment、UI控件讲起属于“看到一个界面就有一个结果”的阶段正反馈来得很快中间章节进入持久化、ContentProvider、多媒体、网络、Service这些东西更接近一个真实App的中枢骨架需要前后串联理解后面章节则进入Material Design、Jetpack架构组件、Compose、协程最后还有一个综合实战项目把前面所有知识串起来。这条路径和大多数公司里Android开发的实际演进是一致的。新人入职先从UI开始然后写业务逻辑慢慢接触数据层、架构层最后沉淀出对整体项目的掌控力。所以如果你把书中每个章节的工程都按顺序跑一遍其实就相当于模拟了一整条从零到一成长为合格Android开发者的路线。2.3 源码版本和书里保持一致省去很多坑网上搜到的Android代码碎片最大的问题就是版本混乱。有人用OkHttp 3有人用OkHttp 4有人还在用HttpURLConnection你复制过来很可能因为API不一致编译失败。而《第一行代码》的随书源码是作者在写作时完整验证过的gradle插件版本、依赖库版本、Kotlin版本都是配套的理论上你把对应工程打开同步完依赖就能直接跑。当然书出版到现在已经有一段时间了Android Studio和SDK版本都在升级所以新版本下打开老工程偶尔会有兼容性提示这个我们在第3章和第5章会单独讲怎么处理。但至少代码本身的逻辑和书里是完全对齐的这一点比网上东拼西凑的教程靠谱太多。3. 实操流程把第一个工程在Android Studio里跑起来3.1 环境准备与版本锁定在导入源码之前先把环境准备好。你至少需要安装Android Studio版本建议用官方最新稳定版。如果电脑上还没有SDK第一次安装AS的时候会引导你下载Android SDK Platform这一步不要跳过。另外AS通常自带JetBrains RuntimeJBRJDK这一项一般不用单独配置直接用默认就行。有一个点需要留意源码里的Gradle插件版本是书出版年代的配套版本如果你用的是全新版Android Studio第一次打开时可能会提示Gradle版本不兼容。最常见的情况是AGPAndroid Gradle Plugin版本太老而新版AS要求的插件版本更高。遇到这种提示别慌可以直接在build.gradle里把AGP版本改成你当前AS对应支持的版本然后同步一次就行。下面这张表是AGP、Gradle和JDK的常见搭配供你参考AGP版本对应Gradle版本推荐JDK4.2.x6.7.1及以上JDK 117.0.x7.0.2及以上JDK 117.4.x7.5及以上JDK 118.1.x8.0及以上JDK 173.2 下载源码与导入步骤我实际操作过多次这里把完整流程写出来你照着走基本不会出大问题从GitHub下载源码压缩包或者直接git clone。下载后解压注意工程路径不要有中文和空格最好放在一个纯英文目录下比如D:\AndroidProjects\FirstLineCode。这一步对后面Gradle构建很有帮助。打开Android Studio点击欢迎页的Open选择你要学习的章节目录比如Chapter2点OK。AS开始加载工程右下角会显示Gradle Sync进度。第一次同步需要下载Gradle发行版和大量依赖时间长短取决于你的网络情况。如果同步失败先检查网络。国内网络环境下载Google仓库的依赖比较慢可以在工程的settings.gradle或顶层的build.gradle里加上阿里云镜像仓库。同步成功后点击工具栏的Run按钮。如果是第一次运行AS会提示你选择设备可以创建一个模拟器AVD也可以用USB连接真机。模拟器需要在SDK Manager里下载对应的系统镜像真机则需要打开开发者选项和USB调试。应用安装到设备上之后你能看到界面同时在Logcat窗口里能看到运行日志。3.3 第一次编译会遇到的情况实操记录我第一次跑这本书源码的时候是在新版AS上打开的结果是老工程的AndroidManifest.xml里没有显式声明android:exported直接报了manifest merger错误。这是因为Android 12API 31开始系统要求所有带intent-filter的组件必须显式声明exported属性。解决方式很简单在对应Activity的标签里加一行android:exportedtrue如果你的应用本身不需要被外部应用唤起也可以写false具体按代码逻辑判断。还有一次是Gradle同步卡在依赖下载上后来在build.gradle里加了阿里云镜像并改用本地已有的Gradle发行版问题就解决了。关于这些问题的系统性排查第5章会单独展开。4. 核心章节代码精读挑三个有代表性的工程4.1 Activity与生命周期新手最容易忽略的底层机制第2章的工程是最适合新手的起点。代码里通常包含一个MainActivity和几个跳转目标页面核心就是Activity的生命周期方法onCreate、onStart、onResume、onPause、onStop、onDestroy。我刚入行时觉得这些方法不就是“回调一下”吗后来被生产环境的问题毒打之后才深刻理解理解生命周期是做任何业务的基础。看这段代码的时候我强烈建议你亲手在每个生命周期方法里加一行Log.d(MainActivity, onCreate called)然后把App切到后台再切回来观察Logcat里的输出顺序。你会发现冷启动、按Home键、切到别的App、再返回这四个场景的生命周期调用是完全不同的。理解了这个后面做数据保存、网络请求恢复、页面刷新就不会走弯路。源码里这些方法可能只是简单地打印个日志你不要觉得它太简单这个日志恰恰是理解系统运行逻辑的钥匙。4.2 网络与数据持久化真实App的骨架就在这里到了网络和持久化部分代码的“App味”就出来了。书里的网络请求章节会带着你用OkHttp等库发起HTTP请求然后解析返回的数据。持久化章节则会介绍SharedPreferences、SQLite数据库、以及结合Jetpack的Room框架。这些内容串在一起本质上就是一个极简的“客户端-服务端”应用骨架你从网络拿数据存进本地再展示到界面上。我看这套代码时最大的体会是它把“数据层”和“UI层”做了很好的分离演示。虽然这一阶段还没有引入ViewModel但代码里网络请求结果如何回调、数据如何从异步线程切回主线程更新UI这些基础写法都是有迹可循的。你在精读的时候重点留意Async、回调接口、以及后面版本里协程写法之间的差异就知道Android异步编程是怎么一步步演进过来的。4.3 Jetpack与Compose现代Android开发的思维方式书后面章节的工程里你会看到ViewModel、LiveData、Room、Compose这些现代Android开发的主角。ViewModel的职责是保存界面相关的数据Activity被重建时数据不会丢LiveData让数据变化能自动通知界面更新Compose更是直接放弃XML布局用Kotlin代码声明UI。这一部分和前面章节的代码风格差异会非常大很多初学者看到Compose的声明式UI会一头雾水。我的建议是不要着急看懂每一个细节先在源码里找到界面长什么样再找到对应的状态数据是怎么定义的最后看状态变了界面如何刷新。Compose的核心思维是“UI是状态的一种投影”状态变了界面就自动重绘这和传统的findViewById加setText完全不同。一旦转过这个弯后续学习就会顺畅很多。5. 问题排查照着源码跑不通时先查这张表5.1 高频报错速查表这条表是我反复跑书里源码时整理出来的高频问题覆盖面很广值得直接收藏。错误现象可能原因解决思路Gradle sync failed: Could not find com.android.tools.build:gradle:x.x.x网络仓库访问失败或AGP版本不存在检查网络配置国内镜像仓库或把AGP版本改成AS支持的版本SDK location not found没配置SDK路径在工程根目录的local.properties里写sdk.dirC:\\Users\\xxx\\AppData\\Local\\Android\\SdkCould not resolve com.android.support:appcompat-v7老工程使用support库新环境不支持将support库依赖替换成对应的AndroidX依赖或升级到源码自带的gradle版本Manifest merger failed with multiple errors, see logsAndroid 12要求声明exported在AndroidManifest.xml给带intent-filter的组件加android:exportedtrueINSTALL_FAILED_USER_RESTRICTED真机USB安装被限制在手机开发者选项打开“USB安装”部分机型还要打开“USB调试安全设置”Unresolved reference: xxxKotlin版本或依赖版本不一致在build.gradle里统一kotlin版本和各类依赖版本Clean之后重新同步AAPT2 error: failed linking file resources资源文件异常或缓存损坏执行Build Clean Project然后重新Build5.2 环境类问题的底层排查思路遇到编译问题很多人一上来就百度报错信息结果越搜越乱。我的习惯是先分层定位问题出在工程配置、构建工具、SDK/设备还是代码本身。工程配置层面的问题看gradle文件里有没有低级错误构建工具层面看Gradle和AGP版本是否匹配SDK层面的问题看local.properties和SDK Manager里面的Platform版本设备层面的问题则用adb命令直接跟设备通信很容易判断。这里给一个很实用的命令组合。同步报错时别光看AS界面右上角的红色提示直接在工程根目录开终端执行./gradlew assembleDebug --stacktrace这个命令会把完整的错误堆栈打印出来定位在哪里失败一目了然。App在设备上崩溃时用adb logcat -s AndroidRuntime能看到详细的崩溃日志这一步对排查空指针、类找不到这类问题非常高效。5.3 我踩过的几个坑说几个真实的教训。第一个是Windows用户名是中文导致SDK路径有问题最后把整个AS和SDK全部挪到了D:\Android下去解决。第二个是我不小心把Gradle的distributionUrl改成了不存在的版本结果同步直接卡死后来在gradle/wrapper/gradle-wrapper.properties里改回正确的版本URL才恢复。第三个是升级AS版本之后老工程缓存经常出幺蛾子后来学会了“先Clean Project再File Invalidate Caches / Restart”这一招能解决很多莫名其妙的资源异常、代码跳转失效问题。6. 把源码变成自己的技能进阶用法6.1 跑通只是起点关键是动手改造源码最忌讳的用法就是“只下载、不打开”或者“打开跑通就算完成”。想要把这本书真吃透我的建议是每学完一个章节就动手改造一下那个章节的工程。比如第2章学了Activity跳转你就把跳转的目标页改成显示一段你自己写的内容第5章学了数据持久化你就做一个简单的记事本把输入的内容存到数据库里重启App还能看到。当你把章节Demo“改坏”几次又通过读代码把它修好之后你对这个知识点的记忆会非常深刻。这个过程本质上就是把别人的代码变成自己的代码比单纯看十遍书都管用。我见过很多学得很快的人不是因为他们天赋高而是因为他们下手去改了。6.2 用升级targetSdk来做适配训练书中源码的targetSdk版本停留在写作年代如果你把它在最新系统上跑一遍很可能会遇到一些“现代Android”的适配问题。比如targetSdk升到33以上之后App要弹通知必须动态申请POST_NOTIFICATIONS权限升到30之后访问外部存储的逻辑也变了。这些变化看似麻烦实际上是非常好的训练素材。你可以专门开一个分支把某个章节工程的targetSdk改到最新版本然后尝试解决所有编译报错和运行时权限问题。这个过程让你把Android系统的权限演变、隐私限制这些面试高频问题挨个过一遍比死记硬背八股文强得多。等你能把老代码顺利适配到新版本你的工程能力就已经超过大部分只写过新工程的初级开发了。6.3 结合官方文档做精读最后推荐一种学习方式读源码的同时打开Android官方文档对照着看。比如看到Room相关的代码就去developer.android.com查Room的架构说明看到Compose部分就去查状态管理的官方文档。官方文档虽然枯燥但它的完整性是任何教程都比不了的而书里源码恰好是一座桥把抽象文档和具体实现连在了一起。我给自己定的学习方法是“三遍法”第一遍跑通源码理解代码做了什么事第二遍把工程里的核心代码删掉靠回忆重新写一遍写不出来就再读一遍源码第三遍找个小需求用这个章节的技术点独立实现一个小功能。三遍下来这个知识点基本就焊在你脑子里了。最后说一点我自己的体会。源码这种东西最怕的就是囤着不看。我见过不少人电脑里装了一堆教程资源结果连一个最基本的HelloWorld都没跑起来。其实你只要按着这本书的章节一周跑通两三个工程然后动手改几行代码效果远比你收藏一堆文章要好。郭霖这套随书源代码的最大价值不在于代码本身写得有多玄妙而在于它给你铺了一条从零到一的完整路线关键是你愿不愿意静下心来走一遍。本文还有配套的精品资源点击获取
返回列表