更新记录
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>组件。
功能概览
- 离线 / 网络安装 TBS 内核(本地 assets 或 CDN 直链)
- 初始化 X5 环境、诊断 ABI / 是否可加载、查询当前内核
- 强制杀进程并重启(装核后必须,否则进程内仍可能用旧核)
<yt-x5web>组件:真正的 smtt WebView,带加载进度、错误、UA、是否 X5 等回调- 减小包体积:可删减单架构内核,或把
.tbs放到自有服务器用网络安装
兼容性与限制(必读)
| 项 | 说明 |
|---|---|
| 平台 | 仅 Android(不支持 iOS / 鸿蒙组件) |
| 系统版本 | Android 5 ~ 13(Android 14+ 使用免费旧核 46514/46515 可能无法加载) |
| CPU 架构 | armeabi-v7a、arm64-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:网络安装(推荐超包时使用)
- 把
utssdk/app-android/assets/tbs/里的.tbs文件拷到本地备份 - 从工程中删除
assets/tbs目录(或清空其中的.tbs),减小打包体积 - 将
.tbs上传到自有 CDN / 服务器,得到直链 - 运行时用
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):
- 打开
utssdk/app-android/assets/tbs/ - 删除不需要的那一个
.tbs文件- 只保留 32 位:删除
*arm64-v8a*.tbs - 只保留 64 位:删除
*armeabi*.tbs
- 只保留 32 位:删除
- 打包体积约可减少一半
注意:删除后,对应架构的设备无法本地装核;请配合云打包 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: 看 @pagefinish 的 isX5Core===true,或 UA 字符串中包含 TBS/;也可调 getIsX5Core() / getCurrentCoreName()。
Q: Android 14+ 装不上? A: 本插件附带的免费旧核主要面向 Android 5–13;更高系统可能无法加载,需自行评估更换内核方案。
更多好用插件推荐
- 高德定位连续定位后台定位保活定位
- 百度汽车摩托车导航插件
- 百度鹰眼轨迹插件支持后台采集、保活
- 百度定位插件、连续定位、保活、坐标系转换、支持双端
- 计步器插件,支持Android、iOS双端
- uts经典蓝牙插件、蓝牙电子秤
- 获取唯一标识、ServiceID、卸载更新不变iOS+Android
- Android经典蓝牙
- 华为ScanKit统一扫码插件支持iOS+Android原生插件
- 【华为扫码】统一扫码插件支持多码连续扫码支持半屏扫码uts插件iOS+Android+HarmonyOS
- 截屏、录屏、防截屏、录屏iOS、Android
- 人脸采集插件 最新百度SDK 离线人脸采集、活体检测
- 页面截长图、截取WebView内容,生成长截图Android+iOS
- Android无预览拍照、录制、静默拍照、静默录制、抓拍插件支持
- uni高德地图功能拓展地图截图
- 科大讯飞离线合成插件支持iOS、android
- iOS保活Android保活鸿蒙保活定位插件系统定位
- 高德定位、猎鹰轨迹插件
- 海康威视综合安防平台视频播放插件
- 支持NFC读写功能检测支持Android iOS HarmonyOS
- 自定义相机
- VLC视频播放器-兼容式组件
- VLC视频播放器-标准模式组件
- 桌面小组件
- 海康网络摄像头
- 百度OCR
- 录音pcm播放插件
- 原生离线语音合成原生TTS
- 科大讯飞离线语音合成、识别插件
- 科大讯飞离线语音听写
Demo
- uni-app:
pages/x5webview/x5webview.nvue(同级 X5Demo 工程) - uni-app-x:
pages/x5wbview/x5webview.uvue(同级 X5Uniapp-x 工程) - 首页可完整试装核 API:
pages/index

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 542
赞赏 14
下载 12487011
赞赏 1938
赞赏
京公网安备:11010802035340号