作者:TimelessU
为 Oplus Android 设备连接 AirDrop、Quick Share 与 OShare 分享入口。
从系统分享面板选择文件后,OPAirDrop 在互传界面显示 Apple 设备,并通过 AWDL 传输文件。项目使用 Mosey 分享服务,配合 Wonder、Qualcomm WLAN 驱动适配和 OShare 桥接。Root 模块负责服务生命周期,WebUI 提供状态、共存设置、速度历史和日志入口。
- 系统分享入口:连接 OShare 与 Mosey provider,映射设备名称、设备类型、发送进度和取消事件。
- 接收 AirDrop:OShare 原生 COUI 邀请、进度、拒绝 / 取消与完成文件入口;模块与共存开启后持续后台可见,不依赖打开分享页面或 OShare 的可见性时限,每次接收手动确认。
- AWDL 无线适配:通过 Wonder、独立 provider 和 WLAN 驱动覆盖层连接协议服务与无线数据路径。
- 会话管理:驱动与原生服务驻留,共存开启时自动保持后台接收;按分享模式和活动传输管理无线会话。
- Wi-Fi 共存:按当前 Wi-Fi 连接选择共存策略,AWDL 固定信道 149;各频段沿用所选性能配置,始终开启,无需手动开关。
- 模块 WebUI:Vue 3 + miuix-vue,包含服务状态、分享入口设置、后台速度记录、日志查看和导出。
| 项目 | 当前配置 |
|---|---|
| 设备范围 | Oplus(OPPO / OnePlus / realme)sun 平台;已验证机型 PJZ110 |
| Android SDK | 已验证 37,不作为安装限制 |
| 内核 | 已验证 6.6.118;安装不限制版本,驱动 ABI 仍须兼容 |
| WLAN 平台 | Qualcomm sun / peach-v2 |
| AWDL | 信道 149,5745 MHz,20 MHz 带宽 |
| 共存 STA 频段 | 2.4 / 5 / 6 GHz,按连接条件选择策略 |
| 模块环境 | KernelSU 及兼容分支 / Magisk / APatch;需可用的系统挂载功能 |
| OShare 桥接 | LSPosed,作用域为 OShare 与 Mosey |
安装和启动共用 module/bin/compatibility.sh,设备准入检查 Oplus 品牌、ro.board.platform=sun。不限制型号、SoC 属性、SDK、内核版本或原厂驱动构建身份。安装仍检查 Root 权限和包完整性;元模块名称与 /data/adb/metamodule 是否存在不作为准入条件。
模块自身已加载的修改版驱动与 provider / Wonder 继续校验身份,用于识别本模块拥有的运行状态。原厂驱动不再按 PJZ110 的构建身份或模块大小拦截,实际加载结果由内核决定。通过检测不代表所有固件、OShare / Mosey 版本或实际收发已验证。
- 适配 KernelSU 及兼容分支、Magisk、APatch 的模块安装与启动接口。支持管理器内置挂载、Magic Mount、OverlayFS,以及 Mountify 等外部挂载实现;不要求额外安装元模块来通过检测。
- 系统文件仍须由管理器或挂载模块在 Android 扫描系统包前挂载。启动驱动前检查 Mosey APK、原生服务与库是否可见,并比对权限及 VINTF 配置。缺失时停止启动,具体路径见
/data/adb/opairshare/boot-start.log。 - Mountify 若启用了选择性挂载,需将
opairshare加入其挂载列表;检查模块是否被禁用、是否存在skip_mount,以及 OShare、Mosey、GMS 是否被管理器设置为卸载模块。修正后重启。 - 回调 APK 和 GMS 配置的 bind mount 优先使用当前管理器的 BusyBox,按工具能力回退;挂载在 Android 全局挂载命名空间中执行。安装时根据实际 Root SELinux 域生成规则。
- WebUI 需要提供兼容
ksu.exec接口的管理器或独立 WebUI 宿主。Magisk 本身没有模块 WebUI 入口,可使用兼容宿主或通过 Root shell 调用模块脚本。
新增兼容逻辑已通过主机模拟测试;Magisk、APatch、Mountify 等组合的真实重启、发现与双向收发仍待实机验证。挂载排查与测试说明见 Root 与挂载兼容说明。
OPAirShare/
├── module/ Root 模块与运行脚本
├── webui/ Vue 3 + miuix-vue 界面
├── oshare/ OShare / Mosey 的 LSPosed 桥接工程
├── native/ 原生库、socket 助手与 Wi-Fi 会话助手
├── mosey/ 传输回调与联网发现的 APK 构建工具
├── kernel/ WLAN 覆盖层、Wonder、provider 与基础补丁
├── tools/ 源码检查、原生构建和内核构建入口
├── tests/ 设置、速度历史与 WebUI API 回归测试
└── docs/ 构建说明与技术实现说明
本地依赖放在 local-inputs/,组件构建输出放在 build/,WebUI 输出放在 webui/dist/。这些目录通过 .gitignore 管理。
在仓库根目录执行:
python3 tools/check.py
cd webui
npm ci
npm run check
npm run build
cd ..
python3 tests/test_settings.py
python3 tests/test_share_mode.py
python3 tests/test_history.py
node tests/test-api.mjs
sh oshare/tests/run.sh原生助手、Android 桥接、Mosey 补丁与内核的构建步骤见 构建说明。
完成模块装配与安装后:
- OPAirDrop 安装时会检测 LSPosed,自动安装、启用随包附带的 OShare 桥接,并为主用户添加
com.coloros.oshare和com.google.android.mosey作用域。安装后重启一次。未检测到 LSPosed 时跳过桥接安装;安装 LSPosed 后重新安装本模块。 - 将手机连接 Wi-Fi,在文件管理器或相册中选择文件,并打开所选的分享入口。
- 在 Apple 设备上打开 AirDrop 可见性,在分享列表中选择设备并完成接收确认。
- 从支持模块 WebUI 的管理器或兼容 WebUI 宿主查看服务状态、速度历史和共存设置。
模块服务开机自动启动,分享界面退出后的会话释放由后台监督器处理。
恢复环境安装或 LSPosed 配置尚未初始化时,开机后自动重试,最多三次;若开机后才完成激活,需要再次重启。安装日志为 /data/adb/opairshare/oshare-install.log,配置前的数据库备份保存在同一目录。遇到不支持的 LSPosed 数据库结构时,保留原配置并输出错误,可在 LSPosed 中手动启用桥接及两个作用域。
安装器检测到早期使用不同模块 ID 的同项目模块时,会将其停用,重启后由 OPAirDrop 接管,避免同时加载两套驱动。
接收展示接入 OShare 原生 Seedling SDK 和手机自带 UPK 模板,在支持流体云的系统上显示状态栏胶囊、实况进度及完成动画。进度环可以取消当前接收或查看邀请;原生卡片尚未显示或不可用时保留现有通知。
接收确认与文件打开继续使用带会话标识的弹窗:当前原生模板的接受/拒绝按钮没有任务实例参数。该版本保留模板及签名,不运行原互传协议控制器。支持条件及回退行为见 接入说明。
WebUI → 设置 → AirDrop 分享入口可选择 Quick Share、OShare 或二者共存,默认二者共存。无需重启手机。空闲时自动切换,正在传输或保存文件时等待任务完成后切换;页面显示当前入口及等待中的选择。
- Quick Share:由 Google Quick Share 管理 AirDrop 发送与接收,模块不再注入 OShare 的 AirDrop 设备列表,也不启动 OShare 后台接收宿主。WebUI 的名称和保存位置由 Quick Share 自行管理。
- OShare:由系统互传管理 AirDrop 发送、接收、名称及保存位置;桥接限制来自 Quick Share 的 Mosey AirDrop 操作。
- 二者共存:两个入口都可发送,保留共享发现与设备回放;模块的持续后台 AirDrop 接收由 OShare 展示。
该选项只控制 AirDrop 入口,不停用 GMS 或 OShare 整个应用,也不关闭普通 Android / Windows Quick Share 分享。OShare 与二者共存模式需要 LSPosed 桥接;Quick Share 自身的 AirDrop 可用性仍取决于 GMS / Mosey 支持。当前完成主机回归与桥接编译,三种模式切换后的实机发现和双向收发仍待验证。桥接和模块脚本必须配套更新。
配置保存在 Settings.Global 的 opairshare_share_mode;后台监督器在原会话空闲并释放后更新 debug.opairshare.share_mode;切换过程关闭新任务准入,已有任务继续完成。
WebUI → 设置 → AirDrop 名称可保存自定义名称或恢复默认。默认读取 ro.vendor.oplus.market.enname,属性为空时回退到 ro.product.model;名称支持最多 64 个字符,保存在系统全局设置中,重启和模块升级后保留。留空或选择“恢复默认”会重新跟随默认属性值。
接收广播与发送身份使用同一名称。没有待确认邀请或活动传输时更新广播;传输中修改将在当前任务结束后应用,Apple 端列表可能需要等待缓存刷新。
开启模块服务及 Wi-Fi 共存,在 OShare 或二者共存模式下,AirDrop 会自动保持后台可见,无需打开分享页面;独立于系统互传的接收开关和十分钟时限。Apple 设备选中手机后,在 OShare 弹窗中手动接受。关闭模块后停止新邀请,正在传输或保存的任务继续完成。
发行包保留自动共存策略,按 Wi-Fi 的 2.4 / 5 / 6 GHz 连接条件选择会话,AWDL 保持信道 149,各频段沿用所选发送性能配置。网络变化时按任务状态释放和重建会话;Wi-Fi 共存始终开启;旧版本的关闭和严格同信道设置会自动迁移。
此模式不校验 Apple 联系人身份,附近的 Apple 设备均可发起邀请。普通文件保存到 Download/OPAirShare,图片和视频分别发布到 Pictures/OPAirShare、Movies/OPAirShare。当前已在 PJZ110 上验证 Mac 发送文本文件、OShare 接收确认、保存与 SHA256 一致;其他类型、多文件、大文件、锁屏和异常恢复尚待真机覆盖。
从 OPAirDrop v1.0.1 起内置 fei-ke 的 Unlock CN GMS v3.8 功能。安装时检测支持的系统、厂商和 Oplus 自定义分区权限配置,生成配置副本,移除 cn.google.services 与 com.google.android.feature.services_updater 两项限制声明,并在开机早期只读挂载。其他 XML 配置及分区中的原文件保持完整;停用或卸载 OPAirDrop 并重启后恢复原配置。
检测到独立的 com.fei_ke.unlockcngms 模块时,安装器在生成内置配置后将其停用。解锁日志为 /data/adb/opairshare/gms-unlock.log。Google 服务仍需在系统设置中开启。
从 v1.0.2 起,在 KernelSU 管理器中支持模块更新检查、更新日志查看、下载及覆盖安装。首次从旧版升级需要手动安装 v1.0.2 并重启,之后可在管理器中更新。
更新源为 GitHub 正式 Releases,入口固定为 https://github.com/Weverses/OPAirDrop/releases/latest/download/update.json。每个正式版本需附带模块 ZIP、update.json 和 changelog.md;在线检查按 versionCode 比较版本,安装后重启生效。首次正式 Release 上传前,此地址尚不可用。
- 模块特性说明:功能概览、使用条件与已知限制。
- 构建说明:环境、依赖、组件构建、模块装配与验收流程。
- 技术实现说明:服务架构、发现和传输链路、无线适配、会话状态与 WebUI API。
- SM8750 AWDL 实现:原厂固件缺少原生 PAS 支持时,如何组合 NDI、WMI RAW TX、monitor 与 native RX 实现 AWDL。
- 平台迁移指南:新设备的信息收集、无线后端选择、驱动适配与验证步骤。
- 内核目录说明:源码覆盖层、构建路径与上游基线。
- OShare 工程说明:Android 桥接构建与测试入口。
| 用途 | 标识 |
|---|---|
| 项目名称 | OPAirDrop |
| Java 类前缀 | OPAirShare |
| C 符号与文件名前缀 | opairshare |
| 宏与环境变量前缀 | OPAIRSHARE |
| KernelSU 模块 ID | opairshare |
| 运行目录 | /data/adb/modules/opairshare |
| 状态目录 | /data/adb/opairshare |
| 日志导出目录 | /sdcard/Download/OPAirShare |
| 桥接应用 ID | com.tlsu.oshareairdrop |
项目默认采用 GPLv3,允许使用、修改和商业分发。分发项目代码或修改版时,保留版权与许可声明,并按协议提供对应源码。
内核适配、部分原生助手和第三方代码使用各自的协议,具体范围见 开源许可说明。协议全文位于 LICENSE 和 LICENSES,组件来源与许可记录见 第三方声明。
| 项目 | 在本项目中的用途 |
|---|---|
| OnePlusOSS | SM8750 平台内核、Qualcomm WLAN 与 Oplus Wonder 源码基线 |
| 34306/AirDropVivoCN | 项目早期研究与部署方案的起点 |
| thelok1s/mosey-extended | KernelSU 模块组织、Mosey 部署与服务接入参考 |
| FeelLiao/mosey-bada | 原生 Binder 服务接入、桥接与用户态分享架构参考 |
| seemoo-lab/owl | AWDL 帧格式与频道字段分析参考 |
| t4t5/omdrop-owl | AWDL 时间窗口、固定频道与吞吐优化研究参考 |
| UvejsGj/Windfall | 无线重传、接收响应与传输性能分析参考 |
| luyanci/hybrid-miuix-webui | WebUI 组件布局与界面组织参考 |
| 项目 | 用途 |
|---|---|
| Vue | WebUI 应用框架 |
| miuix-vue | WebUI 组件 |
| Motion for Vue / Motion | miuix-vue 使用的动画依赖 |
| Vite | WebUI 构建 |
| Gradle | Android 桥接工程构建 |
| DexKit | 按语义特征解析 OShare 的内部混淆入口 |
| libxposed API | OShare / Mosey 桥接使用的 Xposed 接口 |
| LSPosed | Android 桥接运行环境 |
| KernelSU | 模块启动、挂载与 WebUI 运行环境 |
各项目的贡献归原作者所有。引用代码和依赖的许可文件随仓库保留,详细记录见 第三方声明。
OPAirDrop 是独立社区项目,与 Google、Apple、Oplus(包括 OPPO、OnePlus)不存在隶属、官方合作或背书关系。
文中涉及的品牌、产品名称和商标归各自权利人所有,用于说明兼容对象、技术来源和运行环境。项目代码的开源许可与这些品牌、产品及商标的权属分别适用。
源码提取与迁移记录位于 docs/migration.json。