Flesh 中文教程:从安装到看懂 Kotlin 爬虫缓存实现
2026-08-31发表于
数据库与存储一、速览:Flesh 是什么
入门
Flesh(果肉)是一个 Android 图片浏览应用,用 Kotlin 和 Java 混合写成。它的数据不是自己生成的,而是从一个公开图片网站抓取页面、解析出图片链接再展示出来。
你可以把它理解成一个“图片版快递站”:应用去网站取货(网络请求)、分拣包裹(解析网页)、放进仓库(SQLite 数据库)、需要时快速打包取出(缓存)。对初学者来说,它很适合用来学习 Kotlin 怎么做网络请求、怎么存数据、怎么优化读取速度。
这个项目发布于 2018 年,界面是 Material Design 风格,最低支持 Android 4.1。当前代码已经不再积极更新,但作为练手项目仍有参考价值。
注意:图片内容来自第三方公开网页,具体内容由数据源决定。请仅在遵守当地法律法规的前提下使用。
二、安装/获取:把 APK 装到手机上
入门
要运行 Flesh,你需要一台 Android 4.1 或更高版本的手机。因为项目没有上架 Google Play,只能通过侧面加载(手动安装 APK 文件)的方式安装。
最简单的获取方式是下载官方 Release 包。项目提供过 1.1 版本的 APK 文件,地址如下:
https://github.com/Kerr1Gan/Flesh/releases/download/1222/flesh-release.apk
手机下载后点击 APK 文件,系统会提示“未知来源应用”。这是因为该 APK 不是从应用商店下载,Android 需要你手动授权才能继续安装。
如果你想从源码自行编译,需要准备 Android Studio、JDK 8 以上版本以及 Android SDK。项目使用 Gradle 构建,导入后同步依赖即可生成调试版 APK。不过建议先直接安装 Release 包体验,再决定是否深入源码。
常见的问题是:较新的 Android 版本(8.0 以上)对侧载 APK 的权限控制更严格,需要在系统设置里单独允许“安装未知应用”。
三、核心用法:浏览、收藏与离线缓存
入门
打开应用后,主界面会以列表形式展示图片缩略图。点击某一项可以查看完整内容,并在详情页左右滑动浏览更多图片。
应用提供几个实用功能:
- 快速跳转:可以一键回到顶部、底部,或跳到指定位置,适合长列表浏览。
- 收藏与历史记录:遇到想保留的内容可以收藏,应用也会自动记录浏览历史,方便回看。
- 设置壁纸:将当前图片设置为手机壁纸。
- 离线缓存:把图片保存到本地,断网时也能查看。

这些功能都依赖本地数据库和文件缓存。例如收藏时,应用会往 SQLite 数据库的表中插入一条记录;离线缓存则会把图片文件写入应用私有目录。
建议把 Flesh 当作技术学习工具,而不是稳定的日常图片浏览工具。数据源网站一旦改版或失效,应用内图片可能无法正常加载。
四、技术拆解:网络、解析、存储与缓存
进阶 · 推荐细读
Flesh 没有使用 RxJava、Retrofit 这类常见网络框架,而是直接使用 HttpUrlConnection。你可以把它看成 Java 自带的“打电话工具”,负责向服务器发出请求并接收返回的 HTML 文本。
收到网页文本后,应用用 Jsoup(一个 HTML 解析库)把有用的链接和描述从页面中挑出来。这就像从一大张报纸里剪下你需要的栏目,而不是把整张报纸都塞给用户。
数据库使用 Android 自带的 SQLite,所有建表和查询都直接写 SQL 语句,没有引入 ORM 框架。下面这张表是项目里用来保存列表页数据的结构:
CREATE TABLE tb_class_page_list (
_id INTEGER PRIMARY KEY ASC AUTOINCREMENT,
href STRING UNIQUE,
description STRING,
image_url STRING,
id_class_page INTEGER REFERENCES tb_class_page (_id) ON DELETE CASCADE ON UPDATE CASCADE,
[index] INTEGER);
在读写缓存上,Flesh 选择了 Parcelable 而不是 Serializable。Serializable 就像把对象慢慢写成一封长信,Parcelable 则像用标准打包盒快速装箱,读写速度能快 7 到 8 倍。项目封装了 PageListCacheHelper,把对象写入应用私有目录下的文件。
网络请求代码示例大致如下,但实际使用时应放在子线程中执行,避免阻塞主线程:
val request = AsyncNetwork()
request.request(Constants.HOST_MOBILE_URL, null)
request.setRequestCallback(object : IRequestCallback {
override fun onSuccess(httpURLConnection: HttpURLConnection?, response: String) {
// 处理成功返回的 HTML
}
})
五、踩坑:新手常见问题
进阶 · 推荐细读
首先是网络权限。应用需要访问第三方网站,AndroidManifest 中必须声明 INTERNET 权限。如果自行修改源码后忘记加权限,运行时会出现“无法连接服务器”。
其次是主线程阻塞。网络请求不能在主线程直接执行,否则 Android 4.1 以上系统会抛出 NetworkOnMainThreadException。项目中使用 AsyncNetwork 做异步处理,但建议在 Kotlin 协程或线程池中封装。
第三是数据源失效。如果目标网站改版、增加反爬机制或关闭,应用可能拿到空数据或解析失败。这种情况只能更新解析规则或更换数据源。
第四是APK 签名问题。直接下载 Release APK 通常已签名,可以正常安装;如果自己编译未签名包,需先生成签名后才能安装到真机。
建议在真机测试前先使用模拟器,并确认网络可以访问数据源域名。部分网络环境下可能因 DNS 污染或地区限制导致连接失败。
六、判断建议:这个项目适合你吗
入门
如果你的目标是学习 Kotlin 实战,这个项目值得一读。它覆盖了 Android 开发中的常见需求:网络请求、HTML 解析、SQLite 存储、文件缓存、序列化性能优化,以及 Kotlin 与 Java 互相调用。
但如果你只是想找一个长期可用的图片浏览工具,Flesh 并不是好选择。项目已停止更新多年,数据源稳定性无法保证,界面和交互也停留在 2018 年的水平。
建议把源码下载下来,按模块阅读:先看网络层如何发出请求,再看 Jsoup 如何解析列表,最后跟踪数据库写入和缓存读取。遇到不懂的类或方法,直接查 Android 官方文档或 Kotlin 语法即可。
这类爬虫型应用的核心逻辑通常是“请求页面 → 解析出图片地址 → 展示并缓存”。吃透 Flesh 后,你可以用同样的思路去写一个自己的壁纸应用或漫画阅读器。
项目信息
| 项目 | 值 |
|---|---|
| 仓库 | Kerr1Gan/Flesh |
| 语言 | Kotlin |
| Star | 427 |
| Fork | 75 |
| 主页 | 无 |
参考链接
延伸阅读
想继续探索?这些同领域的教程可能也适合你:
121
72
1
1344
文章目录
评论