Obtainium 源码直装指南:从 Release 直接获取 Android 应用更新

发布时间:2026/9/13 18:53:19
Obtainium 源码直装指南:从 Release 直接获取 Android 应用更新 Obtainium 源码直装指南从 Release 直接获取 Android 应用更新【免费下载链接】ObtainiumGet Android app updates straight from the source.项目地址: https://gitcode.com/GitHub_Trending/ob/Obtainium本文以仓库根目录 README.md 为骨架结合 lib/ 源码与 docs/DEVELOPER_GUIDE.md 展开。Obtainium 是一款以Get Android app updates straight from the source直接从源头获取 Android 应用更新为核心设计理念的 Flutter 应用它绕过传统应用商店直接从各类应用源如 GitHub、GitLab、F-Droid 仓库、APK 站点、甚至任意 HTML 页面的 Release 页面获取最新版本完成 APK 下载与安装并在新版本发布时向你推送通知。读完本文你将掌握Obtainium 支持哪些应用源及其分类、如何查找并导入社区共享的 App 配置、如何从 GitHub / F-Droid / IzzyOnDroid 安装 Obtainium 并验证其签名以及源码层面这套源 → 版本探测 → 过滤 → 安装流水线的工作机理。设计理念为什么需要直连源头的应用更新器传统应用分发依赖中央商店作为唯一入口而开源与独立开发者生态中大量应用的官方发布渠道其实是其自身主页上的 Release 页面或 APK 直链。Obtainium 的设计目标就是把这些分散的源头统一成可追踪、可更新、可通知的清单让用户始终拿到开发者亲手发布的构建产物。从仓库源码看这一理念在架构上体现为高度抽象的源AppSource扩展模型每种应用源对应 lib/app_sources/ 目录下的一个 Dart 文件全部继承自 lib/providers/source_provider.dart 中的抽象基类AppSource。开发指南 docs/DEVELOPER_GUIDE.md 明确写道这是 Obtainium 的核心可扩展性模型——要支持一个新的应用源只需在lib/app_sources/中新增一个文件并在SourceProvider._buildSources()中注册。支持的应用源全览README 将当前支持的应用源分为四大类逐一整理如下均可对照源码逐一核实开源项目通用源源源码实现GitHublib/app_sources/github.dartGitLablib/app_sources/gitlab.dartForgejo含 Codeberglib/app_sources/codeberg.dartF-Droidlib/app_sources/fdroid.dart第三方 F-Droid 仓库lib/app_sources/fdroidrepo.dartIzzyOnDroidlib/app_sources/izzyondroid.dartSourceHutlib/app_sources/sourcehut.dart其他通用源源源码实现APKPurelib/app_sources/apkpure.dartAptoidelib/app_sources/aptoide.dartUptodownlib/app_sources/uptodown.dartitch.iolib/app_sources/itchio.dartHuawei AppGallerylib/app_sources/huaweiappgallery.dartTencent App Storelib/app_sources/tencent.dartvivo App Store中国lib/app_sources/vivoappstore.dartRuStorelib/app_sources/rustore.dartFarsroidlib/app_sources/farsroid.dartSamsung Galaxy Storelib/app_sources/samsunggalaxystore.dartLiteAPKslib/app_sources/liteapks.dartAPK4Freelib/app_sources/apk4free.dartCoolApklib/app_sources/coolapk.dartSourceForgelib/app_sources/sourceforge.dartJenkins Jobslib/app_sources/jenkins.dartAPKMirror仅追踪 Track-Onlylib/app_sources/apkmirror.dartAPKCombolib/app_sources/apkcombo.dartRockMods仅追踪 Track-Onlylib/app_sources/rockmods.dart特定应用专用源源源码实现Telegram Applib/app_sources/telegramapp.dartNeutron Codelib/app_sources/neutroncode.dart兜底源FallbackDirect APK Link直接 APK 链接lib/app_sources/direct_apk_link.dart。HTML兜底任何返回包含 APK 文件链接的 HTML 页面的 URL 都可以作为源实现在 lib/app_sources/html.dart。从源码结构可以推断SourceProvider在解析用户输入 URL 时先按 host 正则匹配各具名源最后才回退到HTML这个万能兜底因此 HTML 源永远排在匹配顺序的最后参见 lib/providers/source_provider.dart 附近_buildSources()与getSource()的注册与解析逻辑。寻找现成的 App 配置Finding App Configurations为某个应用手动配置源参数有时比较繁琐因此 README 提供了三条获取现成配置的途径社区共享配置站在 crowdsourced 配置站上直接搜索应用找到即可一键导入。提交配置请求若找不到所需应用可到该配置站的 issues 页面留言请求补充。贡献配置通过向该配置站仓库发起 PR 的方式把你配置好的应用参数贡献给社区。这些共享配置本质上就是仓库源码中App模型的 JSON 序列化形态。在 lib/providers/source_provider.dart 中App.toJson()会输出idAndroid 包名或临时哈希、url、author、name、installedVersion、latestVersion、apkUrls、preferredApkIndex、additionalSettings每个应用的源专属参数等字段反向的App.fromJson()则先执行appJSONCompatibilityModifiers()这一串幂等迁移函数保证旧版配置在升级后仍可加载该迁移逻辑被 try/catch 包裹单个迁移失败不会导致整个加载流程中断。安装 Obtainium 与签名验证README 提供了三个分发渠道的安装方式均需从设备浏览器/下载器获取 APK 后手动安装GitHub Releases从项目 Releases 页面下载 APK。IzzyOnDroid 仓库IzzyOnDroid 是知名的开源应用镜像仓库可通过其 F-Droid 索引页安装。F-Droid 官方仓库注意 F-Droid 渠道安装的是dev.imranr.obtainium.fdroid这个独立包名的构建风味flavour。从源码看该风味使用独立的入口 lib/main_fdroid.dart并在 lib/main.dart 中通过bool isFdroidBuild false;这一全局变量区分普通构建为falseF-Droid 构建在main_fdroid.dart中被置为true。两者行为差异主要体现在首次运行时是否自动添加Obtainium 自更新条目lib/main.dart 中if (!isFdroidBuild)分支。验证信息Verification info为防范供应链攻击README 给出了两套校验依据项目值包名Package IDdev.imranr.obtainium签名证书 SHA-256 哈希B3:53:60:1F:6A:1D:5F:D6:60:3A:E2:F5:0B:E8:0C:F3:01:36:7B:86:B6:AB:8B:1F:66:24:3D:A9:6C:D5:73:62签名适用范围上述签名同样适用于 F-Droid 风味得益于可复现构建reproducible buildsPGP 公钥用于验证 APK 哈希可在 Ubuntu keyserver 上以contactimranr.dev检索也就是说无论从 GitHub 还是 F-Droid 渠道安装只要签名证书 SHA-256 一致即可确认为同一发布者的产物。仓库中 docker/Dockerfile 与 sign.sh 的存在也从工程层面印证了可复现构建与签名流程是该项目的基础设施组成部分。局限性LimitationsREADME 明确提示了唯一一条核心局限需要用户理解对于某些源数据是通过Web scraping网页抓取获取的一旦网站改版抓取逻辑很容易失效此时可能没有更可靠的替代方法可用。这条局限在源码中有充分印证。以 lib/app_sources/html.dart 的grabLinksCommon()为例该函数用html包解析页面中的a标签、正则提取 URL、按customLinkFilterRegex正则过滤、用compareAlphaNumeric做智能排序最后再交给AppSource.isApkOrContainerFile()判定是否为可安装的容器文件.apk/.xapk/.apkm/.apks等。这类依赖页面 DOM 结构与链接命名规律的做法天然对网站改版敏感。README 的这句警告正是对这种实现方式的开诚布公。从源码看直连源头的核心流水线为帮助读者深入理解这里将 README 概述的功能映射到具体实现链路对应 docs/DEVELOPER_GUIDE.md 中的架构说明1. URL 标准化与源解析用户粘贴任意 URL 后SourceProvider.getSource(url)会先尝试按 host 正则匹配已注册的源失败则回退到 HTML 源。每个源的sourceSpecificStandardizeURL()负责把 URL 归一化为规范形态canonical form否则抛出InvalidURLError。例如 GitHub 源通过standardizeUrlWithRegex把输入约束为https://github.com/{owner}/{repo}形式见 lib/app_sources/github.dart。2. 最新版本探测抽象基类定义了核心契约方法getLatestAPKDetails(standardUrl, additionalSettings)返回统一的APKDetails版本号、APK URL 列表、应用名、发布日期、更新日志、全部资产 URL。以 GitHub 源为例它调用 GitHub REST API/repos/{owner}/{repo}/releases?per_page100并支持一系列细粒度选项见 lib/app_sources/github.dart 的表单项定义includePrereleases是否包含预发布版本fallbackToOlderReleases最新版无可用 APK 时是否回退到更早的 ReleasefilterReleaseTitlesByRegEx/filterReleaseNotesByRegEx按标题/正文正则过滤verifyLatestTag是否单独请求/releases/latest校验最新 tagsortMethodChoice排序方式按日期date、智能名称smartname、不排序none、smartname-datefallback或纯名称name默认datereleaseTitleAsVersion用 Release 标题而非 tag 作为版本号。3. 版本与 APK 过滤拿到候选 APK 列表后getApp()会依次应用versionExtractionRegEx版本号提取正则通过extractVersion实现、apkFilterRegExAPK 文件名过滤正则支持invertAPKFilter取反、autoApkFilterByArch按设备supportedAbis自动按架构过滤实现在 lib/providers/source_provider.dart。这些键全部来自AppSource._commonAppSettingFormItems见 lib/providers/source_provider.dart属于所有源共用的逐应用设置项。4. 更新检查与后台任务前台下拉刷新走 lib/providers/apps_provider_updates.dart 的checkUpdates()它以固定并发上限kDefaultFetchConcurrency 4分批拉取各应用的新元数据并每隔约 3 秒批量saveApps()一次从而把 UI 重建次数从 O(N) 降到 O(N/批)。后台更新则通过workmanager注册 15 分钟最小周期的定时任务见 lib/main.dart 的_scheduleWorkManager()由带pragma(vm:entry-point)注解的callbackDispatcher()无头执行bgUpdateCheck()。5. 安装策略下载完成后lib/installers/ 目录下的策略模式抽象决定如何安装默认StockInstaller走 Android PackageInstaller 会话 API检测到 Shizuku/Dhizuku/Sui 时用ShizukuInstaller也用于 Obtainium 自我更新用户也可指定ExternalInstaller转交第三方安装器详见 docs/DEVELOPER_GUIDE.md 的安装器对照表。关键设置项速查源码级默认值以下设置项在 lib/providers/settings_provider.dart 中有明确的类型与默认值方便配置时对照设置键类型默认值说明updateIntervalint360分钟前台自动检查更新的间隔updateIntervalSliderValdouble6.0设置页滑块的中间值checkOnStartboolfalse启动时检查更新enableBackgroundUpdatesbooltrue是否启用后台更新bgUpdatesOnWiFiOnlyboolfalse后台更新仅在 Wi-Fi 下进行bgUpdatesWhileChargingOnlyboolfalse后台更新仅在充电时进行enableCertificatePinningboolfalse是否启用证书固定配合 assets/ca-certs/ 中的根证书themeintsystem主题system / light / darkthemeColorint0xFF6438B5主题色默认紫色colourSchemeModeenumstandard配色方案standard / vibrant / expressive / materialYouuseBlackThemeboolfalse深色主题是否使用纯黑背景groupByenumnone应用列表分组方式none / category / sourcehideDowngradesbooltrue是否隐藏版本回退提示onlyCheckInstalledOrTrackOnlyAppsboolfalse只检查已安装或 Track-Only 的应用此外逐应用的additionalSettings中还包含minimumUpdateAgeDays更新最小发布年龄供应链延迟策略可选值为 0/1/2/3/5/7/14/30 天0 表示使用全局默认见 lib/providers/source_provider.dart、trackOnly仅追踪不更新、versionDetection版本探测开关等通用选项。结语Obtainium 用一套简洁的源抽象 配置驱动架构把从源头获取更新这一朴素诉求变成了可扩展的应用源生态。对普通用户而言它提供了一条绕过商店、直达开发者 Release 页面的更新通道并配以共享配置站与可复现构建签名来降低使用门槛对开发者而言lib/app_sources/ 中 30 个源实现、AppSource基类与SourceProvider单例构成了一个边界清晰、易于扩展的参考范例。若需深入了解内部机制可继续阅读 docs/DEVELOPER_GUIDE.md 与 lib/ 源码。【免费下载链接】ObtainiumGet Android app updates straight from the source.项目地址: https://gitcode.com/GitHub_Trending/ob/Obtainium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询