一、速览: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 需要你手动授权才能继续安装。

GitHub 仓库预览图

如果你想从源码自行编译,需要准备 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
主页

参考链接

延伸阅读

想继续探索?这些同领域的教程可能也适合你: