AI流量审计

Langfuse 简介

Langfuse 是一个开源的 LLM 工程平台(Open Source LLM Engineering Platform),为大语言模型应用提供全面的开发和运维工具。它帮助开发团队监控、调试和优化生产环境中的 LLM 应用。

Langfuse 是干什么的?

当你在做 Chatbot / RAG / Agent / 多步推理应用 时,常见问题是:

模型为什么这次回答这么差?
Prompt 改了到底有没有变好?
用户问了什么?模型是怎么一步步走的?
Token 花在哪里了?成本多少?
不同模型 / Prompt 哪个更好?

👉 Langfuse 就是用来解决这些问题的。

核心功能

1. 可观测性(Observability)

  • 完整的应用追踪:基于 OpenTelemetry 标准,提供嵌套追踪能力
  • 性能监控:显示每个调用的延迟和成本
  • 简单集成:通过 @observe() 装饰器即可集成

2. 评估系统(Evaluation)

  • 自动化评估框架
  • 人工标注功能
  • 数据集管理和版本控制

3. 提示词管理(Prompt Management)

  • 集中管理提示词模板
  • 版本控制和回滚
  • Playground 测试环境

4. 指标分析(Metrics)

  • 实时性能监控和分析
  • 详细的成本追踪
  • 自定义指标统计

集成生态

Langfuse 支持主流的 LLM 开发框架和工具:

  • SDK:Python、JavaScript/TypeScript
  • 模型提供商:OpenAI、Anthropic 等
  • 框架:LangChain、LlamaIndex、Vercel AI SDK、Instructor
  • 网关:LiteLLM
  • 无代码工具:Dify、Flowise、Langflow

主要优势

  1. 易于集成:提供 drop-in wrapper,最小化代码改动
  2. 开源透明:支持自托管部署,符合多项安全认证(SOC 2 Type II、ISO 27001、GDPR、HIPAA)
  3. 全栈覆盖:从开发到生产的完整工具链
  4. 调试友好:详细的追踪信息帮助快速定位问题

Langfuse 自托管部署

本部署方案采用 Langfuse + LiteLLM 的组合架构,实现对 LLM 应用流量的完整审计和可观测性。

架构说明

这个部署方案包含三个核心服务:

  1. PostgreSQL 数据库(db)

    • 存储 Langfuse 的所有数据
    • 包括 traces、用户数据、配置等
  2. Langfuse Web 服务(langfuse-web)

    • 提供可视化界面和 API
    • 用于查看追踪数据、管理提示词等
    • 访问地址:http://localhost:3000
  3. LiteLLM 代理层(litellm-proxy)

    • 统一的 LLM 网关,支持多个模型提供商
    • 自动将所有 LLM 调用发送到 Langfuse 进行追踪
    • 访问地址:http://localhost:4000

工作流程

1
2
3
你的应用 → LiteLLM 代理 → 各种 LLM API (OpenAI/Claude/等)

Langfuse 追踪和分析

通过这种架构,你的应用只需要配置 LiteLLM 的地址,所有 LLM 调用都会被自动记录和分析。


快速部署

步骤 1:准备配置文件

创建 docker-compose.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
version: '3.9'

services:
# --- Langfuse 数据库 ---
db:
image: postgres:16
restart: unless-stopped
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=langfuse
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5

# --- Langfuse 服务端 (http://localhost:3000) ---
langfuse-web:
image: langfuse/langfuse:2
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://postgres:postgres@db:5432/langfuse
- NEXTAUTH_SECRET=mysecret # 生产环境请修改
- SALT=mysalt # 生产环境请修改
- NEXTAUTH_URL=http://localhost:3000
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/public/health"]
interval: 30s
timeout: 10s
retries: 3

# --- LiteLLM 代理层 (http://localhost:4000) ---
litellm-proxy:
image: ghcr.io/berriai/litellm:main-latest
restart: unless-stopped
depends_on:
langfuse-web:
condition: service_healthy
ports:
- "4000:4000"
volumes:
- ./litellm-config.yaml:/app/config.yaml
command: ["--config", "/app/config.yaml"]
environment:
# 注意:这些密钥需要在 Langfuse 启动后从后台获取
- LANGFUSE_PUBLIC_KEY=pk-lf-your-public-key
- LANGFUSE_SECRET_KEY=sk-lf-your-secret-key
- LANGFUSE_HOST=http://langfuse-web:3000

volumes:
pgdata:

步骤 2:创建 LiteLLM 配置文件

创建 litellm-config.yaml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
model_list:
# OpenAI 模型配置
- model_name: gpt-4
litellm_params:
model: openai/gpt-4
api_key: os.environ/OPENAI_API_KEY

- model_name: gpt-3.5-turbo
litellm_params:
model: openai/gpt-3.5-turbo
api_key: os.environ/OPENAI_API_KEY

# Anthropic Claude 配置
- model_name: claude-3-opus
litellm_params:
model: anthropic/claude-3-opus-20240229
api_key: os.environ/ANTHROPIC_API_KEY

- model_name: claude-3-sonnet
litellm_params:
model: anthropic/claude-3-sonnet-20240229
api_key: os.environ/ANTHROPIC_API_KEY

# LM Studio / vllm / ollama
- model_name: qwen3-vl-32b-thinking # 你在 Agent 中调用的模型名
litellm_params:
model: openai/qwen3-vl-32b-thinking # 格式为 openai/任意名
api_base: http://127.0.0.1:1234/v1 # 填写你现有的 vLLM 地址
api_key: "not-needed"

# Langfuse 集成配置(自动追踪所有请求)
litellm_settings:
success_callback: ["langfuse"]
failure_callback: ["langfuse"]

# 可选:启用缓存
cache: true
cache_params:
type: "redis" # 或者 "disk"

# 可选:日志配置
general_settings:
master_key: "sk-1234" # 访问 LiteLLM 的密钥
database_url: "postgresql://postgres:postgres@db:5432/litellm"

步骤 3:配置环境变量

创建 .env 文件存储敏感信息:

1
2
3
4
5
6
7
8
9
10
11
# LLM API 密钥
OPENAI_API_KEY=sk-your-openai-key
ANTHROPIC_API_KEY=sk-ant-your-anthropic-key

# Langfuse 密钥(第一次启动后获取)
LANGFUSE_PUBLIC_KEY=pk-lf-your-public-key
LANGFUSE_SECRET_KEY=sk-lf-your-secret-key

# 生产环境安全配置
NEXTAUTH_SECRET=$(openssl rand -base64 32)
SALT=$(openssl rand -base64 32)

步骤 4:首次启动(获取 Langfuse 密钥)

1
2
3
4
5
# 第一次启动(不包括 LiteLLM)
docker compose up db langfuse-web -d

# 等待服务启动完成
docker compose logs -f langfuse-web

访问 http://localhost:3000:

  1. 注册账号并登录
  2. 进入 SettingsAPI Keys
  3. 创建新的 API Key
  4. 复制 Public Key (pk-lf-…) 和 Secret Key (sk-lf-…)
  5. 更新 .env 文件或 docker-compose.yml 中的密钥

步骤 5:启动完整服务

1
2
3
4
5
6
7
8
9
# 更新配置后重新启动所有服务
docker compose down
docker compose up -d

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f

配置详解

1. PostgreSQL 数据库配置

1
2
3
4
5
6
7
8
db:
image: postgres:16
environment:
- POSTGRES_USER=postgres # 数据库用户名
- POSTGRES_PASSWORD=postgres # 数据库密码(生产环境必须修改)
- POSTGRES_DB=langfuse # 数据库名称
volumes:
- pgdata:/var/lib/postgresql/data # 数据持久化

注意事项:

  • 生产环境必须修改默认密码
  • 定期备份 pgdata
  • 可以配置端口映射进行外部访问(不推荐)

2. Langfuse Web 服务配置

1
2
3
4
5
6
7
8
9
10
langfuse-web:
image: langfuse/langfuse:2
environment:
# 数据库连接(格式:postgresql://用户:密码@主机:端口/数据库)
- DATABASE_URL=postgresql://postgres:postgres@db:5432/langfuse

# NextAuth 配置
- NEXTAUTH_SECRET=mysecret # 用于 JWT 签名(必须修改)
- SALT=mysalt # 密码加盐(必须修改)
- NEXTAUTH_URL=http://localhost:3000 # 服务访问地址

关键环境变量说明:

变量 说明 生产环境建议
DATABASE_URL PostgreSQL 连接字符串 使用强密码
NEXTAUTH_SECRET JWT 签名密钥 openssl rand -base64 32 生成
SALT 密码加盐值 openssl rand -base64 32 生成
NEXTAUTH_URL 服务外部访问地址 使用实际域名,如 https://langfuse.example.com

可选配置:

1
2
3
4
5
6
7
8
9
10
11
environment:
# 禁用公开注册
- AUTH_DISABLE_SIGNUP=true

# 配置 SMTP 邮件服务
- SMTP_CONNECTION_URL=smtp://user:pass@smtp.example.com:587
- EMAIL_FROM_ADDRESS=noreply@example.com

# 启用 Google SSO
- AUTH_GOOGLE_CLIENT_ID=your-client-id
- AUTH_GOOGLE_CLIENT_SECRET=your-client-secret

3. LiteLLM 代理配置

1
2
3
4
5
6
7
8
9
10
litellm-proxy:
image: ghcr.io/berriai/litellm:main-latest
volumes:
- ./litellm-config.yaml:/app/config.yaml # 挂载配置文件
command: ["--config", "/app/config.yaml"]
environment:
# Langfuse 集成配置
- LANGFUSE_PUBLIC_KEY=pk-lf-xxx # 从 Langfuse 后台获取
- LANGFUSE_SECRET_KEY=sk-lf-xxx # 从 Langfuse 后台获取
- LANGFUSE_HOST=http://langfuse-web:3000 # Langfuse 服务地址

LiteLLM 配置文件详解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# litellm-config.yaml
model_list:
# 定义可用的模型
- model_name: gpt-4 # 你的应用中使用的模型名称
litellm_params:
model: openai/gpt-4 # 实际调用的模型
api_key: os.environ/OPENAI_API_KEY # API 密钥(从环境变量读取)

litellm_settings:
# 自动将所有调用发送到 Langfuse
success_callback: ["langfuse"] # 成功时回调
failure_callback: ["langfuse"] # 失败时回调

general_settings:
master_key: "sk-1234" # LiteLLM 访问密钥(可选,用于认证)

支持的模型提供商:

  • OpenAI (gpt-4, gpt-3.5-turbo 等)
  • Anthropic (claude-3-opus, claude-3-sonnet 等)
  • Azure OpenAI
  • Google PaLM
  • Cohere
  • Replicate
  • 更多…

在 Langfuse 中查看追踪

  1. 访问 http://localhost:3000
  2. 登录后进入 Traces 页面
  3. 查看所有 LLM 调用的详细信息:
    • 请求参数和响应
    • 延迟时间
    • Token 使用量
    • 成本统计

参考资料

基于工作资料实现应用多开

概述

Android 系统的工作资料(Work Profile)功能可以为应用创建独立的运行环境,实现应用双开。本文介绍如何通过 ADB 命令手动创建工作资料,并安装应用实现多开。

实现原理

工作资料是 Android 5.0 引入的企业功能,本质上是创建一个受管理的用户配置文件(Managed Profile)。通过 pm create-user 命令创建托管配置文件,然后将应用安装到该配置文件中,实现与主用户空间的应用完全隔离。

前置条件

  • Android 5.0 及以上系统
  • 启用 USB 调试
  • 安装 ADB 工具
  • 设备未设置工作资料(一台设备只能有一个工作资料)

操作步骤

1. 创建工作资料

使用以下命令创建一个托管配置文件:

1
adb shell pm create-user --profileOf 0 --managed 工作资料名称

参数说明:

  • --profileOf 0:指定父用户为用户 0(主用户)
  • --managed:创建托管配置文件(工作资料)
  • 工作资料名称:自定义名称,例如”工作空间”、”Work”等

示例:

1
adb shell pm create-user --profileOf 0 --managed Work

执行成功后会返回创建的用户 ID,例如:

1
Success: created user id 13

记录这个用户 ID(本例中为 13),后续操作需要用到。

2. 启动工作资料

创建完成后需要启动工作资料:

1
adb shell am start-user 13

13 替换为上一步返回的实际用户 ID。

3. 查看所有用户

可以使用以下命令查看系统中的所有用户:

1
adb shell pm list users

输出示例:

1
2
3
Users:
UserInfo{0:Owner:c13} running
UserInfo{13:Work:1030} running

可以看到主用户(ID 为 0)和刚创建的工作资料(ID 为 13)都在运行中。

4. 安装应用到工作资料

方法一:复制已安装的应用

如果主用户空间已经安装了某个应用,可以直接将其复制到工作资料中:

1
adb shell pm install-existing --user 13 com.tencent.mm

参数说明:

  • --user 13:指定目标用户 ID(工作资料)
  • com.tencent.mm:应用包名(此处以微信为例)

常用应用包名:

  • 微信:com.tencent.mm
  • QQ:com.tencent.mobileqq
  • WhatsApp:com.whatsapp
  • Telegram:org.telegram.messenger

方法二:直接安装 APK

也可以直接将 APK 安装到工作资料中:

1
adb install --user 13 /path/to/app.apk

5. 验证安装

安装完成后,可以查看工作资料中已安装的应用:

1
adb shell pm list packages --user 13

工作资料中的应用会在桌面显示,图标带有工作资料标识(通常是公文包图标)。

完整示例

以下是创建工作资料并安装微信的完整命令流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 创建工作资料
adb shell pm create-user --profileOf 0 --managed Work

# 假设返回用户 ID 为 13

# 2. 启动工作资料
adb shell am start-user 13

# 3. 复制微信到工作资料
adb shell pm install-existing --user 13 com.tencent.mm

# 4. 查看工作资料中的应用列表
adb shell pm list packages --user 13

管理工作资料

停止工作资料

1
adb shell am stop-user 13

停止后,工作资料中的应用将停止运行,不会收到通知。

启动工作资料

1
adb shell am start-user 13

删除工作资料

如果不再需要工作资料,可以删除:

1
adb shell pm remove-user 13

注意:删除工作资料会清除其中所有应用和数据,操作前请备份重要数据。

从工作资料卸载应用

1
adb shell pm uninstall --user 13 com.tencent.mm

三星手机基于DualMessage实现任意应用双开

概述

Android 系统的多用户机制为应用双开提供了原生支持。三星的 Dual Messenger 功能就是基于此原理实现的。本文将介绍如何利用 Android 多用户机制,突破官方限制,为任意应用实现双开功能。

实现原理

Android 系统支持多用户功能,每个用户拥有独立的应用空间和数据。三星 Dual Messenger 通过创建一个名为 “DUAL_APP” 的特殊用户(通常用户 ID 为 95),在该用户空间中安装应用的第二个实例,从而实现双开。

官方仅支持特定应用(如 WhatsApp、Facebook Messenger 等)的双开,这些应用的白名单硬编码在 /system/app/DAAgent/DAAgent.apkWhiteListApps 类中。通过 ADB 命令,我们可以绕过这个限制,为任意应用创建双开实例。

基础方法:ADB 安装应用到双开空间

前置条件

  • 启用 USB 调试
  • 安装 ADB 工具
  • 至少启用一个官方支持的双开应用(如 WhatsApp)

操作步骤

  1. 查找双开用户 ID

    1
    adb shell pm list users

    输出示例:

    1
    2
    3
    Users:
    UserInfo{0:Owner:c13} running
    UserInfo{95:DUAL_APP:1030} running

    记录 DUAL_APP 的用户 ID(通常是 95)

  2. 安装应用到双开空间

    1
    adb install --user 95 /path/to/app.apk

    安装成功后,应用会出现在双开空间中,图标带有双开标识。

权限配置

方法一:通过系统设置授权

新安装的双开应用默认没有任何权限,需要手动授予:

  1. 进入 设置权限管理器
  2. 选择需要授予的权限类型(如联系人、存储等)
  3. 找到双开应用实例
  4. 点击 查看所有权限 进入完整的权限设置页面
  5. 逐一授予所需权限

方法二:通过 ADB 命令授权

更快捷的方式是使用 ADB 命令直接授权:

1
2
3
4
5
6
7
8
9
10
11
# 授予存储读取权限
adb shell pm grant --user 95 com.package.name android.permission.READ_EXTERNAL_STORAGE

# 授予存储写入权限
adb shell pm grant --user 95 com.package.name android.permission.WRITE_EXTERNAL_STORAGE

# 授予相机权限
adb shell pm grant --user 95 com.package.name android.permission.CAMERA

# 授予联系人权限
adb shell pm grant --user 95 com.package.name android.permission.READ_CONTACTS

com.package.name 替换为实际的应用包名。

高级方案:使用 Aurora Store

为了方便在双开空间中安装和管理应用,可以将 Aurora Store 安装到双开空间。

安装 Aurora Store

  1. 下载 Aurora Store APK

  2. 安装到双开空间

    1
    adb install --user 95 aurora.apk
  3. 授予必要权限

    1
    2
    3
    4
    5
    6
    # 授予存储权限
    adb shell pm grant --user 95 com.aurora.store android.permission.READ_EXTERNAL_STORAGE
    adb shell pm grant --user 95 com.aurora.store android.permission.WRITE_EXTERNAL_STORAGE

    # 授予安装应用权限
    adb shell appops set --user 95 com.aurora.store REQUEST_INSTALL_PACKAGES allow
  4. 使用 Aurora Store

    打开双开空间中的 Aurora Store,即可直接下载安装应用,无需每次都通过 ADB。

分离 APK 的处理

部分现代应用使用分离 APK(Split APKs)格式,无法直接通过 adb install 安装。需要使用专门的安装器。

使用 SAI(Split APKs Installer)

  1. 安装 SAI 到双开空间

    1
    adb install --user 95 sai.apk
  2. 授予权限

    1
    2
    3
    adb shell pm grant --user 95 com.aefyr.sai android.permission.READ_EXTERNAL_STORAGE
    adb shell pm grant --user 95 com.aefyr.sai android.permission.WRITE_EXTERNAL_STORAGE
    adb shell appops set --user 95 com.aefyr.sai REQUEST_INSTALL_PACKAGES allow
  3. 安装分离 APK

    • 下载应用的 .apkm.apks 文件
    • 将文件移动到双开空间的下载目录
    • 使用双开版 SAI 打开并安装

技术深入:修改白名单(需要 Root)

对于已 Root 的设备,可以通过修改系统文件永久添加应用到白名单:

  1. 系统服务 dual_app 维护着支持双开的应用列表
  2. 白名单定义在 /system/app/DAAgent/DAAgent.apk
  3. 可以通过反编译 APK,修改 WhiteListApps 类,重新打包并替换系统文件
  4. 或使用 Xposed/Magisk 模块动态修改白名单

注意:修改系统文件有风险,操作前请做好备份。

注意事项

  1. 兼容性:不同厂商的 Android 系统对多用户的实现可能有差异,本方法主要适用于三星设备
  2. 稳定性:非官方双开的应用可能存在稳定性问题,建议先测试
  3. 数据安全:双开空间的数据独立存储,卸载应用会清除所有数据,注意备份

参考资料

Git项目管理

使用Git提交模板

  1. 项目根目录下创建提交模板

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    cat > .gitmessage << 'EOF'
    # ============= Git 提交信息模板 =============
    # 类型(必填): feat | fix | docs | style | refactor | perf | test | chore | ci | build | revert
    # 影响范围(可选): 例如模块、组件或功能(如 "user-auth", "payment-api"
    # 描述(必填): 简洁说明本次提交的更改
    # --------------------------------------------

    <类型>(<影响范围>): <简短描述>

    # 详细说明(可选):
    # - 为什么进行这次更改?
    # - 解决了什么问题?
    # - 是否有副作用或注意事项?

    # 关联 Issue 或 Task(可选):
    # Fixes #123
    # Closes #456
    # Related to #789

    # -------------------- 示例 --------------------
    # feat(user-auth): 添加 OAuth2 登录支持
    #
    # - 集成 Google 和 GitHub OAuth2 登录
    # - 更新用户模型以存储第三方登录信息
    #
    # Fixes #42
    # Related to #56
    # =============================================
    EOF
  2. 配置当前项目使用模板提交(项目成员都需配置)

    1
    git config --local git commit.template=.gitmessage
  3. 创建强制检查脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    mkdir .githooks
    cat > commit-msg << 'EOF'
    #!/bin/bash
    MSG_FILE="$1"
    MSG=$(cat "$MSG_FILE")

    # 检查是否包含类型和描述
    if ! echo "$MSG" | grep -qE "^(feat|fix|docs|style|refactor|perf|test|chore|ci|build|revert)\(.*\): .+"; then
    echo "错误:提交信息不符合规范!"
    echo "示例: feat(user-auth): 添加登录功能"
    exit 1
    fi
    EOF
    chmod +x .githooks/commit-msg
  4. 配置强制检查提交格式(项目成员都需配置)

    1
    git config --local git core.hookspath=.githooks

Linux上支持拆分窗口的终端

在Ubuntu中,有几个终端模拟器支持窗口拆分功能,允许你在一个终端窗口内同时显示多个会话。以下是一些常见的支持窗口拆分的终端模拟器:

  1. GNOME Terminal
    • GNOME Terminal本身不直接支持窗口拆分,但你可以使用tmuxscreen等终端复用工具来实现窗口拆分功能。
  2. Tilix
    • Tilix是一个非常强大的终端模拟器,支持平铺式布局和窗口拆分。你可以同时在同一窗口中垂直或水平拆分多个终端会话,非常适合进行多任务操作。
  3. Terminator
    • Terminator也是一个支持窗口拆分的终端模拟器,它允许你将终端拆分成多个窗格,可以水平或垂直拆分,十分方便进行多任务操作。
  4. Konsole
    • 如果你使用的是KDE桌面环境,Konsole是一个非常好的选择,它也支持窗口拆分功能,用户可以在一个窗口内分屏显示多个终端会话。
  5. Alacritty
    • Alacritty本身不内置窗口拆分功能,但可以与tmux结合使用,达到类似的效果。Alacritty本身强调速度和简洁性,因此没有过多的图形化界面。
  6. Xterm + tmux/screen
    • Xterm 是一个轻量级的终端模拟器,虽然它没有直接的窗口拆分功能,但可以与tmuxscreen等工具结合使用,提供类似的终端拆分体验。

如果你需要一个图形化界面的终端模拟器,TilixTerminator都是非常好的选择。如果你不介意使用命令行工具,结合tmux的任何终端模拟器都能满足拆分窗口的需求。

Hexo写作指南

创建草稿文章

1
hexo new draft "Example"

发布草稿hexo publish draft Example

创建文章

1
hexo new draft "Example"

创建分类

1
hexo new page categories

创建tag

1
hexo new page tags

记录一下解决Google Voice网页版拨打电话一闪而过的问题

我的电脑环境是Ubuntu 22.04连接了一个无线蓝牙耳机,当使用Google Voice网页版拨打电话时拨号界面总是一闪而过,后来网上查询各种方法也未解决,经过自己的一番折腾搞明白了原来是音频设置的问题

先检查一下音频设置有没有问题,麦克风、响铃、扬声器这三个框中都应该能看到你目前连接的设备才对

image-20240412114843186

image-20240412115030371

如果不能看见到系统设置中把相对应的输入、输出设备都打开就可以了

image-20240412115304805

Android Nearby Share快速分享至Linux

一直以来原生的Android手机和Linux设备之间共享文字/文件等信息有诸多不便,之前也试过KDE Connect和AirDroid等软件尽管有诸多的第三方软件支持但是总觉得安装app太麻烦而且效果也不尽人意,直到我发现了一个软件 RQuickShare 这款软件支持Google原生的的Nearby Share快速分享用起来十分舒服这里推荐给大家。

演示图片

  • Copyrights © 2015-2026 Kaisar
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信