Favorites 安卓书签导航器 开发文档
这个项目是什么
Favorites(安卓书签导航器)是一个轻量的 Android 书签管理 + 多标签浏览器应用:首页是可折叠分类的书签导航页,点开书签在内置多标签 WebView 里浏览,支持从浏览器 HTML 书签文件导入、WebDAV 备份恢复。定位是「自建导航页的手机端」——把你在电脑浏览器里收藏的一堆网址搬到手机上,分类清楚、打开即用。
技术栈与架构
| 项 | 值 |
|---|---|
| 语言 | Kotlin |
| 最低 API | 24(Android 7.0),target/compile SDK 35 |
| 构建 | Gradle 8.5(仓库带 gradlew),Java 17 |
| UI | 原生 View + 自定义 Drawable,Material Design 卡片风格,ViewBinding 开启 |
| 存储 | SharedPreferences,书签以 JSON 序列化存本地 |
| 浏览 | 多实例独立 WebView(每标签页一个实例,切换不刷新) |
依赖只有官方库:androidx.core:core-ktx、androidx.appcompat、com.google.android.material、androidx.constraintlayout、androidx.webkit,无第三方网络/图片库,包很小。
架构上是单 Activity:所有逻辑集中在 app/src/main/java/com/hermes/app/MainActivity.kt(约 54KB 一个文件),布局只有一个 res/layout/activity_main.xml,书签分类、导入解析、WebDAV 同步、WebView 标签管理都在这一个类里完成。应用 applicationId 为 com.hermes.app。
仓库结构
├── app/
│ ├── build.gradle.kts # 应用模块构建配置(SDK、签名、混淆、依赖)
│ └── src/main/
│ ├── java/com/hermes/app/MainActivity.kt # 全部业务逻辑
│ ├── res/layout/activity_main.xml # 唯一布局
│ ├── res/drawable|values|mipmap-* # 图标、颜色、样式
│ └── AndroidManifest.xml # 权限与 Activity 声明
├── build.gradle.kts / settings.gradle.kts / gradle.properties # 工程级构建配置
├── gradle/ / gradlew # Gradle Wrapper
├── build-apk.sh # 一键构建脚本(自动升版本号)
├── VERSION # 版本计数文件(当前 46)
├── favorites.apk # 预构建 APK(可直接安装)
└── README.md
权限说明
AndroidManifest.xml 声明的权限:INTERNET、ACCESS_NETWORK_STATE、RECORD_AUDIO、MODIFY_AUDIO_SETTINGS(后两项与 WebView 内网页的音视频能力相关),并开启 usesCleartextTraffic(允许 http 站点)。应用只有一个导出的 launcher Activity。
本地开发环境
标准 Android 工程,用 Android Studio 直接打开根目录即可同步、运行。命令行构建需要本机有 Android SDK 与 JDK 17:
git clone <仓库地址>
cd android-favorites
./gradlew :app:assembleDebug # 调试包
构建与发布
仓库自带一键脚本 build-apk.sh,它做的事:
- 读根目录
VERSION(当前46),算出下一版本号; - 用
sed把app/build.gradle.kts里的versionCode改成下一号、versionName改成1.0.<N>; - 调
/opt/gradle-8.5/bin/gradle --no-daemon :app:assembleRelease构建 release 包; - 把
app/build/outputs/apk/release/app-release.apk复制为输出目录里的favorites_v<N>.apk,并把新版本号写回VERSION。
bash build-apk.sh
换机器构建要改脚本里的三处硬编码:ANDROID_HOME/ANDROID_SDK_ROOT(脚本写的 /opt/android-sdk)、JAVA_HOME(脚本写的 /usr/lib/jvm/java-17-openjdk-amd64)、OUTPUT_DIR(脚本写的 /vol2/1000/HD2/APK,README 也注明需按自己的环境修改),以及 Gradle 可执行路径 /opt/gradle-8.5/bin/gradle。
配置项说明
工程没有运行时配置文件,可调项都在 app/build.gradle.kts:
| 键 | 含义 | 当前值 |
|---|---|---|
applicationId / namespace |
包名 | com.hermes.app |
minSdk / targetSdk / compileSdk |
API 范围 | 24 / 35 / 35 |
versionCode / versionName |
版本(由 build-apk.sh 自动递增) | 46 / 1.0.46 |
signingConfigs.release |
release 签名,引用工程根目录的 keystore 文件 | 构建 release 需自备 keystore |
isMinifyEnabled / isShrinkResources |
release 混淆与资源压缩 | 均为 true |
| debug 包 | applicationIdSuffix = ".debug",可与正式版共存 |
— |
注意:release 签名配置引用工程根目录下的 keystore(hermes.keystore),仓库里若没有该文件需自行生成一份并替换 storeFile/alias/密码配置,不要把真实签名口令提交进仓库。
二次开发要点
- 单文件架构:
MainActivity.kt54KB 承载全部功能(书签 CRUD、两级分类、折叠状态记忆、多标签 WebView 池、三种导入、WebDAV 同步、返回手势),二次开发前先通读并善用搜索定位;拆分 UI 层是最大的改造空间。 - 书签存储:JSON 序列化进 SharedPreferences,数据量大时注意读写在主线程的开销;WebDAV 备份文件名固定
favorites_bookmarks.json,改动结构时要考虑旧备份的兼容导入。 - HTML 书签导入:解析 Edge/Chrome 导出的 HTML,保留文件夹层级作两级分类(如
收藏夹栏/科技/AI工具),改动解析逻辑时留意嵌套层级的截断规则。 - WebView 内存:每标签独立实例,关闭标签要彻底销毁释放内存;新增标签上限/回收策略需在 MainActivity 里改。
- 版本号自动化:对外发布沿用
build-apk.sh+VERSION计数的方式,别手动改versionCode(脚本用 sed 精确匹配当前格式,格式改了 sed 会失效)。
相关链接
- Gitea 仓库:http://127.0.0.1:3200/jinghui/android-favorites
- 许可证:MIT