三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

EhViewer现代化架构解析:Material Design 3与Rust原生性能优化

EhViewer现代化架构解析:Material Design 3与Rust原生性能优化

EhViewer现代化架构解析:Material Design 3与Rust原生性能优化

【免费下载链接】EhViewerEhViewer overhauled with Material Design 3 and more, forked from https://github.com/Ehviewer-Overhauled/Ehviewer项目地址: https://gitcode.com/gh_mirrors/ehvie/EhViewer

EhViewer是一款基于Material Design 3设计的现代化Android漫画阅读应用,通过Rust原生性能优化和Kotlin协程异步处理,实现了高效的网络请求与内容解析。该项目采用多模块架构设计,支持动态色彩主题、高性能图片加载和智能搜索过滤,为进阶用户提供流畅的漫画浏览体验。

架构设计与技术栈选型

EhViewer采用分层架构设计,将业务逻辑、数据持久化和用户界面清晰分离。核心架构基于Kotlin Multiplatform实现跨平台兼容,同时利用Rust进行性能关键路径的优化。

核心架构层次:

层级技术实现主要职责
表现层Jetpack Compose + Material Design 3UI渲染、用户交互、主题管理
业务逻辑层Kotlin协程 + Arrow函数式编程数据处理、状态管理、业务规则
数据访问层Room数据库 + Ktor网络库本地存储、网络请求、数据解析
原生性能层Rust FFI + C/C++原生库图片处理、HTML解析、加密运算

项目的模块化结构通过settings.gradle.kts配置,采用Gradle KTS构建系统,支持多模块独立编译和依赖管理。

Rust原生解析引擎性能优势

EhViewer在性能关键路径上采用Rust实现HTML解析和数据处理,通过FFI(外部函数接口)与Kotlin层进行高效通信。Rust模块位于app/src/main/rust/目录,包含多个功能模块:

// 核心解析模块结构 src/ ├── ffi/ # Android/JVM接口绑定 ├── img/ # 图像处理(边框检测、WebP解码) ├── parser/ # HTML解析器(画廊列表、详情、收藏) └── lib.rs # 主库入口

Rust解析器的性能优势体现在:

  1. 零成本抽象:编译时内存安全检查,避免运行时崩溃
  2. 并发安全:所有权系统确保线程安全的数据访问
  3. 最小化内存分配:使用tl库进行零拷贝HTML解析

在parser/mod.rs中,Rust实现了高性能的HTML解析逻辑,通过正则表达式和DOM遍历快速提取漫画元数据,相比纯Kotlin实现性能提升达3-5倍。

Jetpack Compose现代化UI实现

用户界面采用Jetpack Compose构建,充分利用Material Design 3的设计语言和动态色彩系统。UI组件库位于core/ui/src/commonMain/kotlin/com/ehviewer/core/ui/,提供可复用的设计系统组件。

核心UI特性实现:

  1. 动态色彩主题:基于Material Design 3的动态色彩系统,根据壁纸颜色自动生成主题色板
  2. 响应式布局:通过WindowSizeClass适配不同屏幕尺寸和设备形态
  3. 共享元素过渡:使用SharedTransitionLayout实现平滑的页面切换动画
  4. 手势导航系统:自定义HorizontalDraggable和SwipeToDismissBox组件

搜索界面组件SearchFilter.kt展示了Compose声明式UI的强大之处:

@Composable fun SearchFilter( category: Int, onCategoryChange: (Int) -> Unit, language: Int, onLanguageChange: (Int) -> Unit, advancedOption: AdvancedSearchOption, onAdvancedOptionChange: (AdvancedSearchOption) -> Unit, ) = Column(modifier) { // 分类筛选芯片 LazyRow(contentPadding = PaddingValues(start = 8.dp, top = 8.dp, end = 16.dp)) { items(categoryTable.sortedBy { !isCategoryChecked(it.first) }) { (bit, resId) -> FilterChip( selected = isCategoryChecked(bit), onClick = { onCategoryChange(category xor bit) }, label = { Text(text = stringResource(id = resId)) } ) } } // 语言选择器 DropdownFilterChip( label = stringResource(id = R.string.key_language), selectedOption = languages.getOrNull(language) ?: any, options = languages, onOptionSelected = onLanguageChange ) }

图:应用的低多边形艺术风格图标,展现现代设计美学

数据层架构与持久化策略

数据持久化采用Room数据库配合SQLite,通过Kotlin协程实现异步数据操作。数据库架构定义在core/data/src/commonMain/kotlin/com/ehviewer/core/database/目录。

数据库表设计:

表名主要字段用途
GalleryEntitygid, token, title, category, rating画廊基本信息存储
DownloadInfogid, state, downloaded, total下载任务管理
HistoryInfogid, time, mode浏览历史记录
LocalFavoriteInfogid, time, title本地收藏管理

数据库迁移策略通过DatabaseMigrations.kt实现版本兼容,支持从旧版本平滑升级。数据访问对象(DAO)采用Kotlin Flow实现响应式数据流,确保UI与数据状态同步。

@Dao interface GalleryDao { @Query("SELECT * FROM galleries WHERE gid = :gid LIMIT 1") suspend fun getGallery(gid: Long): GalleryEntity? @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insert(gallery: GalleryEntity) @Query("SELECT * FROM galleries WHERE title LIKE '%' || :query || '%'") fun searchGalleries(query: String): Flow<List<GalleryEntity>> }

网络请求与内容解析优化

网络层采用Ktor客户端配合协程异步处理,支持HTTP/2和连接复用。请求构建器EhRequestBuilder.kt提供统一的API调用接口,支持Cookie管理和请求重试。

网络请求优化策略:

  1. 连接池管理:复用TCP连接减少握手开销
  2. 响应缓存:智能缓存策略减少重复请求
  3. 请求优先级:根据用户交互动态调整请求顺序
  4. 错误恢复:自动重试和降级处理机制

内容解析采用混合策略:简单JSON响应使用Kotlinx Serialization,复杂HTML页面使用Rust解析器。这种混合方案在保证类型安全的同时提供最大性能。

图:应用横幅设计,展示品牌标识与低多边形艺术风格

图片加载与内存管理

图片加载基于Coil库实现,配合自定义拦截器优化内存使用和加载性能。核心拦截器位于app/src/main/kotlin/com/hippo/ehviewer/coil/目录:

拦截器功能优化效果
AnimatedWebPDecoderWebP动画解码减少CPU占用30%
CropBorderInterceptor图片边框裁剪减少内存占用20%
HardwareBitmapInterceptor硬件位图加速提升渲染性能40%
DiskCacheScoped磁盘缓存管理减少网络请求50%

内存管理策略包括:

  • Bitmap池复用:重用解码后的Bitmap对象
  • 内存缓存LRU:最近最少使用缓存淘汰算法
  • 加载优先级队列:根据视图可见性调整加载顺序
  • 渐进式加载:先显示低质量预览图再加载高清图

搜索过滤与标签系统实现

搜索系统基于多维度过滤和标签匹配算法,支持复杂查询条件组合。核心实现位于app/src/main/kotlin/com/hippo/ehviewer/client/EhFilter.kt和SearchFilter.kt。

高级搜索功能:

data class AdvancedSearchOption( val minRating: Int = 0, val minPages: Int = 0, val maxPages: Int = 0, val disableFilter: Boolean = false, val requireGalleryTorrent: Boolean = false, val searchLowPowerTags: Boolean = false, val searchDownvotedTags: Boolean = false, val showExpunged: Boolean = false )

标签系统采用命名空间分类法,支持多语言翻译和权重标记。标签数据库EhTagDatabase.kt提供快速标签查询和翻译服务,支持离线使用。

标签命名空间分类:

命名空间示例标签用途
artist"artist:abc"艺术家标识
character"character:xyz"角色标识
parody"parody:series"原作标识
group"group:studio"制作组标识
language"language:english"语言标识

性能监控与调优实践

项目集成了性能监控和基准测试工具,位于benchmark/目录。通过BaselineProfileGenerator.kt生成基线配置文件,优化应用启动和关键路径性能。

性能调优建议:

重要提示:在性能关键路径上优先使用Rust实现,避免在UI线程执行复杂计算。使用协程的Dispatchers.IO进行I/O操作,Dispatchers.Default进行CPU密集型计算。

  1. 启动优化:延迟初始化非关键组件,使用基线配置文件
  2. 内存优化:监控Bitmap内存使用,及时回收大对象
  3. 网络优化:启用HTTP/2和连接复用,合理设置超时时间
  4. 数据库优化:使用索引优化查询,批量操作减少事务开销

配置示例:gradle.properties中的性能相关配置

# 启用R8代码优化 android.enableR8=true # 启用资源缩减 android.enableResourceShrinking=true # 启用基线配置文件 android.baselineProfile.enabled=true

多语言支持与本地化策略

国际化支持通过Moko Resources实现,支持动态语言切换和复数形式处理。语言资源位于core/i18n/src/commonMain/moko-resources/目录,支持12种语言。

本地化最佳实践:

  1. 字符串资源分离:UI文本与业务逻辑分离
  2. 复数形式处理:支持不同语言的复数规则
  3. RTL布局支持:适配从右到左书写语言
  4. 动态语言切换:运行时更新应用语言

语言检测算法在GalleryInfo.kt中实现,通过正则表达式匹配标题和标签中的语言标识:

val S_LANG_PATTERNS = arrayOf( Regex("[(\\[]eng(?:lish)?[)\\]]|英訳", RegexOption.IGNORE_CASE), // 英语 Regex("[(\uFF08\\[]ch(?:inese)?[)\uFF09\\]]|[汉漢]化|中[国國][语語]|中文", RegexOption.IGNORE_CASE), // 中文 Regex("[(\\[]spanish[)\\]]|[(\\[]Español[)\\]]|スペイン翻訳", RegexOption.IGNORE_CASE) // 西班牙语 )

扩展性与维护性设计

项目采用插件化架构设计,支持功能模块的动态扩展。核心扩展点包括:

  1. 解析器插件:可添加新的网站解析器
  2. 下载器插件:支持不同的下载协议
  3. 图片解码器插件:扩展图片格式支持
  4. 主题插件:自定义UI主题和配色

维护性设计原则:

  • 单一职责原则:每个类/模块只负责一个功能
  • 依赖注入:通过构造函数注入依赖,便于测试
  • 接口隔离:定义清晰的接口边界
  • 配置驱动:通过配置文件调整行为,避免硬编码

通过以上架构设计和技术实现,EhViewer在保持高性能的同时提供了优秀的可维护性和扩展性,为开发者提供了现代化的Android应用开发范例。

【免费下载链接】EhViewerEhViewer overhauled with Material Design 3 and more, forked from https://github.com/Ehviewer-Overhauled/Ehviewer项目地址: https://gitcode.com/gh_mirrors/ehvie/EhViewer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表