更新记录

1.0.0(2026-08-06)

  • 新版发布

平台兼容性

uni-app(4.76)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android Android插件版本 iOS 鸿蒙
× × 5.0 1.0.0 × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(4.76)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
- - 5.0 1.0.0 - - -

yt-x5web

腾讯 TBS / X5 内核 UTS 插件:提供装核 / 初始化 API + 真正的 X5 WebView 组件 <yt-x5web>com.tencent.smtt.sdk.WebView)。

特别提醒

  • 购买本插件前,请先试用,请先试用,请先试用,确认满足需求之后再行购买。虚拟物品一旦购买之后无法退款。
  • 如有使用上的疑问、bug,可以进交流群联系作者;
  • 请在合法范围内使用,若使用本插件做非法开发,本方概不负责;
  • 插件需先引入再打自定义基座后运行测试

同时支持 uni-app 与 uni-app-x 项目。

项目类型 装核 API <yt-x5web> 组件页面
uni-app .nvue
uni-app-x .uvue

仅调用 initX5Environment 不会让系统自带 <web-view> 自动变成 X5。 要稳定使用 X5 渲染网页,请直接使用本插件的 <yt-x5web> 组件。


功能概览

  1. 离线 / 网络安装 TBS 内核(本地 assets 或 CDN 直链)
  2. 初始化 X5 环境、诊断 ABI / 是否可加载、查询当前内核
  3. 强制杀进程并重启(装核后必须,否则进程内仍可能用旧核)
  4. <yt-x5web> 组件:真正的 smtt WebView,带加载进度、错误、UA、是否 X5 等回调
  5. 减小包体积:可删减单架构内核,或把 .tbs 放到自有服务器用网络安装

兼容性与限制(必读)

说明
平台 仅 Android(不支持 iOS / 鸿蒙组件)
系统版本 Android 5 ~ 13(Android 14+ 使用免费旧核 46514/46515 可能无法加载)
CPU 架构 armeabi-v7aarm64-v8a(x86 等不支持)
组件页面 uni-app → nvue;uni-app-x → uvue不要放在普通 .vue
Manifest 不要再勾选官方「Android X5 Webview」,避免与插件 aar 内 SDK 冲突

关于「系统 <web-view> 也走 X5」与 HBuilderX 版本

  • 若希望 HBuilderX 打包后系统内置 <web-view> 也使用 X5 内核,请将 HBuilderX 降到 4.x
  • HBuilderX 5.x 及更高版本中,常见现象是:X5 内核已经安装且 canLoadX5 提示可用,但 <web-view> 实际仍是系统内核
  • 推荐做法(与 HBX 版本无关):页面里使用本插件的 <yt-x5web>,不要依赖系统 <web-view>

目录结构

uni_modules/yt-x5web/
├── readme.md
├── package.json
└── utssdk/
    ├── interface.uts          # 对外类型定义
    ├── unierror.uts
    └── app-android/
        ├── index.uts          # 装核 / 初始化 API
        ├── index.vue          # <yt-x5web> 兼容模式组件
        ├── X5Web.kt           # 继承 smtt WebView
        ├── config.json
        ├── libs/
        │   └── tenxunX5-release.aar
        └── assets/tbs/        # 可选:本地内核(体积很大)
            ├── tbs_core_..._armeabi_....tbs      # armeabi-v7a,版本 46514
            └── tbs_core_..._arm64-v8a_....tbs    # arm64-v8a,版本 46515

减小 APK 体积(强烈建议阅读)

assets/tbs 下两个 .tbs 合计约 90MB+,会直接打进安装包。

方案 A:网络安装(推荐超包时使用)

  1. utssdk/app-android/assets/tbs/ 里的 .tbs 文件拷到本地备份
  2. 从工程中删除 assets/tbs 目录(或清空其中的 .tbs),减小打包体积
  3. .tbs 上传到自有 CDN / 服务器,得到直链
  4. 运行时用 loadUrl 按当前 ABI 下载并安装
import { checkAbiType, getX5Constants, loadUrl, forceStopAndRestartApp } from '@/uni_modules/yt-x5web'

const abi = checkAbiType()
const c = getX5Constants()
let url = ''
if (abi.code === c.ABI_ARM32) {
  url = 'https://your.cdn.com/tbs_core_armeabi.tbs'      // 46514
} else if (abi.code === c.ABI_ARM64) {
  url = 'https://your.cdn.com/tbs_core_arm64-v8a.tbs'    // 46515
}

loadUrl({
  coreVersion: abi.coreVersion,
  url: url,
  Update: (p) => { console.log('progress', p) },
  success: (msg) => {
    console.log('install ok', msg)
    forceStopAndRestartApp({ delayMs: 1500 })
  },
  fail: (code, msg) => { console.error(code, msg) }
})

方案 B:只兼容一种架构

若 App 只发一种 ABI(例如仅 arm64-v8a,或仅 armeabi-v7a):

  1. 打开 utssdk/app-android/assets/tbs/
  2. 删除不需要的那一个 .tbs 文件
    • 只保留 32 位:删除 *arm64-v8a*.tbs
    • 只保留 64 位:删除 *armeabi*.tbs
  3. 打包体积约可减少一半

注意:删除后,对应架构的设备无法本地装核;请配合云打包 ABI 过滤,或改用网络安装兜底。


推荐业务流程

App 启动尽早 prepareBeforeInit()
        ↓
canLoadX5() === false ?
        ↓ 是
loadLocalForCurrentAbi() 或 loadLocal() 或 loadUrl()
        ↓
forceStopAndRestartApp()   ← 装核成功后必须重启进程
        ↓
重启后 canLoadX5() === true
        ↓
initX5Environment()
        ↓
用 <yt-x5web> 打开页面,看 @pagefinish 的 isX5Core / ua(UA 应含 TBS/)

一、装核 / 初始化 API

引入方式

// 按需
import {
  prepareBeforeInit,
  canLoadX5,
  loadLocalForCurrentAbi,
  loadLocal,
  loadUrl,
  initX5Environment,
  forceStopAndRestartApp,
  getCurrentCoreName,
  getX5Constants,
  checkAbiType,
  diagnose
} from '@/uni_modules/yt-x5web'

// 或命名空间
import * as X5Web from '@/uni_modules/yt-x5web'
X5Web.prepareBeforeInit()

不要直接 import { ABI_ARM32 } from '...',请用 getX5Constants()


API 一览

方法 说明
getX5Constants() 获取 ABI / 版本号 / assets 路径等常量
checkAbiType() 检测当前 ABI,返回应使用的内核版本与 assets 路径
prepareBeforeInit() 初始化前准备(建议 App 启动尽早调用)
applyTbsSettings() 应用 TBS 相关设置
makeTbsDexReadOnly() Dex 只读修复(部分机型装核异常时可试)
diagnose() 完整诊断快照(是否可加载、版本、assets 是否存在等)
canLoadX5() 当前是否可加载 / 使用 X5
getTbsVersion() TBS 版本号,未安装多为 0
getCurrentCore() 当前内核详情(X5 / SYSTEM / UNKNOWN)
getCurrentCoreName() 当前内核名称字符串
isUsingX5Core() 是否判定为正在使用 X5
isX5InitFinished() 本次进程 initX5Environment 是否已结束
getLastInitIsX5() 最近一次 init 回调是否为 X5
initX5Environment(options?) 初始化 X5 环境
loadLocal(options) 从插件 assets 安装指定内核
loadLocalForCurrentAbi(options) 按当前 ABI 自动选 assets 安装(本地首选)
loadUrl(options) 网络下载 .tbs 后安装(减包推荐)
resetCore() 重置内核相关状态
forceStopAndRestartApp(options?) 杀进程并延迟拉起(装核后必须)
killProcess() 仅结束进程(不自动拉起)

1. getX5Constants()

无参数。返回常量对象。

const c = getX5Constants()
// c.ABI_ARM32 / ABI_ARM64 / ABI_OTHER
// c.CORE_VERSION_ARM32=46514  CORE_VERSION_ARM64=46515
// c.ASSET_ARM32 / ASSET_ARM64 / ASSET_DIR / FILE_ARM32 / FILE_ARM64

2. checkAbiType()

无参数。返回:

字段 类型 说明
code number 1 ARM32,2 ARM64,3 不支持
supportedAbis string 设备 ABI 列表
coreVersion number 应安装的版本号
assetPath string tbs/xxx.tbs
fileName string 内核文件名
const abi = checkAbiType()
console.log(abi.code, abi.coreVersion, abi.assetPath)

3. prepareBeforeInit() / applyTbsSettings() / makeTbsDexReadOnly()

无参数,无返回值。建议启动时先 prepareBeforeInit()

prepareBeforeInit()
applyTbsSettings()      // 可选
makeTbsDexReadOnly()    // 可选,异常时再试

4. diagnose() / canLoadX5() / 版本与内核查询

const d = diagnose()
console.log(d.message)           // 可读多行诊断文本
console.log(d.canLoadX5, d.tbsVersion, d.assetExists)

const r = canLoadX5()
console.log(r.can, r.detail)

console.log(getTbsVersion())
console.log(getCurrentCore())      // { type, isX5, message, ... }
console.log(getCurrentCoreName())
console.log(isUsingX5Core())
console.log(isX5InitFinished())
console.log(getLastInitIsX5())

5. initX5Environment(options?)

回调 说明
success?.(isX5: boolean) 初始化完成,isX5=true 表示已启用 X5
complete?.(isX5: boolean) 结束回调(与 success 同传 isX5)

null 或不传表示无回调预热。

if (canLoadX5().can) {
  initX5Environment({
    success: (isX5) => { console.log('init done, isX5=', isX5) },
    complete: (isX5) => { console.log('complete', isX5) }
  })
}

6. loadLocalForCurrentAbi(options) — 本地自动装核

按当前 ABI 自动选择 assets/tbs 内对应文件。

回调 说明
onProgressUpdate?.(progress: number) 进度 0–100
success?.(msg: string) 安装成功(多数机型仍需重启)
fail?.(code: number, msg: string) 失败
isCanLoadX5?.(can: boolean) 安装流程开始时的 canLoad 探测
loadLocalForCurrentAbi({
  isCanLoadX5: (can) => console.log('before canLoad=', can),
  Update: (p) => console.log(p),
  success: (msg) => {
    console.log(msg)
    forceStopAndRestartApp({ delayMs: 1500 })
  },
  fail: (code, msg) => console.error(code, msg)
})

7. loadLocal(options) — 指定 assets 路径装核

参数 类型 说明
coreVersion number 如 46514 / 46515
assetPath string tbs/xxx.tbs
回调 loadLocalForCurrentAbi
const abi = checkAbiType()
loadLocal({
  coreVersion: abi.coreVersion,
  assetPath: abi.assetPath,
  Update: (p) => {},
  success: (msg) => forceStopAndRestartApp(null),
  fail: (code, msg) => {}
})

8. loadUrl(options) — 网络装核

参数 类型 说明
coreVersion number 与下载文件匹配的版本号
url string .tbs 直链(请用自有 CDN)
回调 同本地安装

见上文「减小 APK 体积 → 方案 A」。


9. forceStopAndRestartApp(options?) / killProcess() / resetCore()

// 装核成功后:延迟拉起(建议 delayMs ≥ 800,默认 1500)
forceStopAndRestartApp({ delayMs: 1500 })
forceStopAndRestartApp(null) // 使用默认延迟

killProcess()   // 只杀进程,不自动拉起
resetCore()     // 重置内核相关状态

二、组件 <yt-x5web>

真正的腾讯 smtt WebView,不是系统 <web-view>

使用限制

  • uni-app:只能写在 .nvue 页面
  • uni-app-x:只能写在 .uvue 页面
  • 必须给组件明确宽高(如 width:750rpx;height:600px);仅靠 flex:1 时高度常为 0(能 load 但看不见)

属性

属性 类型 说明
src string 要加载的网址;变化时自动 loadUrl

组件方法(ref 调用)

方法 返回值 说明
loadUrl(url) 加载指定 URL
reload() 刷新
stopLoading() 停止加载
goBack() boolean 可后退则后退;返回是否已后退
canGoBack() boolean 是否还能后退
getUserAgent() string 当前 UA(含 TBS/ 可确认 X5)
getIsX5Core() boolean 当前 WebView 是否 X5 内核
getUrl() string 当前已加载 URL

返回值差异:

  • uni-app-x:可直接使用方法的 同步 return
  • uni-app(nvue):同步 return 不可靠,请监听下方「方法结果事件」里的 result

带返回值的方法会 同时 return + $emit 同名事件(不做环境判断)。

页面生命周期事件

事件 参数(Map) 说明
@pagestart url 开始加载
@pagefinish url / isX5Core / ua / width / height 加载完成
@error code / description / url 加载失败
@progress progress(0–100) 加载进度
@title title 文档标题

方法结果事件

调用带返回值的方法后触发,参数 Map 统一为 result

事件 result 含义
@goback 是否已后退
@cangoback 是否可后退
@getuseragent UA 字符串
@getisx5core 是否 X5
@geturl 当前 URL

示例:uni-app(nvue)

<template>
  <view class="page">
    <yt-x5web
      ref="x5"
      :src="url"
      :style="'width:750rpx;height:' + webHeight + 'px;'"
      @pagestart="onPageStart"
      @pagefinish="onPageFinish"
      @error="onError"
      @progress=""
      @getisx5core="onGetIsX5Core"
      @getuseragent="onGetUserAgent"
      @cangoback="onCanGoBack"
      @goback="onGoBack"
    ></yt-x5web>
  </view>
</template>

<script>
export default {
  data() {
    return { url: 'https://www.baidu.com', webHeight: 600 }
  },
  onReady() {
    setTimeout(() => {
      const x5 = this.$refs.x5
      if (x5 && x5.loadUrl) x5.loadUrl(this.url)
    }, 400)
  },
  methods: {
    pick(e, key) {
      if (!e) return ''
      if (e[key] != null) return e[key]
      if (e.detail && e.detail[key] != null) return e.detail[key]
      if (typeof e.get === 'function') return e.get(key)
      return ''
    },
    onPageStart(e) {
      console.log('pagestart', this.pick(e, 'url'))
    },
    onPageFinish(e) {
      console.log('isX5=', this.pick(e, 'isX5Core'), 'ua=', this.pick(e, 'ua'))
      // nvue:用事件拿方法返回值
      this.$refs.x5 && this.$refs.x5.getIsX5Core && this.$refs.x5.getIsX5Core()
      this.$refs.x5 && this.$refs.x5.getUserAgent && this.$refs.x5.getUserAgent()
    },
    onError(e) {
      console.log('error', this.pick(e, 'description'))
    },
    (e) {
      console.log('progress', this.pick(e, 'progress'))
    },
    onGetIsX5Core(e) {
      console.log('getIsX5Core result=', this.pick(e, 'result'))
    },
    onGetUserAgent(e) {
      console.log('UA result=', this.pick(e, 'result'))
    },
    onCanGoBack(e) {
      console.log('canGoBack result=', this.pick(e, 'result'))
    },
    onGoBack(e) {
      console.log('goBack result=', this.pick(e, 'result'))
    }
  }
}
</script>

示例:uni-app-x(uvue)

事件参数请声明为 Map<string, any>;方法可直接拿同步返回值。

<template>
  <view class="page">
    <yt-x5web
      ref="x5"
      :src="url"
      :style="'width:750rpx;height:' + webHeight + 'px;'"
      @pagestart="onPageStart"
      @pagefinish="onPageFinish"
      @error="onError"
      @progress=""
      @getisx5core="onGetIsX5Core"
      @getuseragent="onGetUserAgent"
    ></yt-x5web>
  </view>
</template>

<script>
type YtX5webRef = {
  loadUrl: (url: string) => void
  getIsX5Core: () => boolean
  getUserAgent: () => string
  goBack: () => boolean
  canGoBack: () => boolean
  getUrl: () => string
}

export default {
  data() {
    return {
      url: 'https://www.baidu.com',
      webHeight: 600 as number,
      info: ''
    }
  },
  onReady() {
    setTimeout(() => {
      const x5 = this.$refs['x5'] as YtX5webRef | null
      if (x5 != null) {
        x5.loadUrl(this.url)
      }
    }, 400)
  },
  methods: {
    pick(e: Map<string, any> | null, key: string): any | null {
      if (e == null) return null
      return e.has(key) ? e.get(key) : null
    },
    onPageStart(e: Map<string, any>) {
      console.log('pagestart', this.pick(e, 'url'))
    },
    onPageFinish(e: Map<string, any>) {
      console.log('isX5=', this.pick(e, 'isX5Core'), 'ua=', this.pick(e, 'ua'))
      // uni-app-x:可直接用 return
      const x5 = this.$refs['x5'] as YtX5webRef | null
      if (x5 != null) {
        console.log('method isX5=', x5.getIsX5Core(), 'ua=', x5.getUserAgent())
      }
    },
    onError(e: Map<string, any>) {
      console.log('error', this.pick(e, 'description'))
    },
    (e: Map<string, any>) {
      console.log('progress', this.pick(e, 'progress'))
    },
    onGetIsX5Core(e: Map<string, any>) {
      console.log('@getisx5core', this.pick(e, 'result'))
    },
    onGetUserAgent(e: Map<string, any>) {
      console.log('@getuseragent', this.pick(e, 'result'))
    }
  }
}
</script>

常见问题

Q: canLoadX5 为 true,但页面还是系统内核? A: 系统 <web-view> 在 HBX 5.x 上常无法切到 X5。请改用 <yt-x5web>,或将 HBX 降到 4.x 再验证系统 web-view。

Q: 组件白屏 / 看不见内容? A: 检查是否给了明确 px 高度;确认页面是 nvue(uni-app)或 uvue(uni-app-x)。

Q: 装核成功但下次启动仍不可用? A: 安装成功后必须 forceStopAndRestartApp(),让新进程加载已安装内核。

Q: 如何确认真的在用 X5? A: 看 @pagefinishisX5Core===true,或 UA 字符串中包含 TBS/;也可调 getIsX5Core() / getCurrentCoreName()

Q: Android 14+ 装不上? A: 本插件附带的免费旧核主要面向 Android 5–13;更高系统可能无法加载,需自行评估更换内核方案。


更多好用插件推荐


Demo

  • uni-app:pages/x5webview/x5webview.nvue(同级 X5Demo 工程)
  • uni-app-x:pages/x5wbview/x5webview.uvue(同级 X5Uniapp-x 工程)
  • 首页可完整试装核 API:pages/index

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。