news 2026/4/29 20:31:42

Uniapp插件开发入门:手把手教你制作一个简单的Android原生插件(附Hello World示例)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Uniapp插件开发入门:手把手教你制作一个简单的Android原生插件(附Hello World示例)

Uniapp插件开发实战:从零构建Android原生弹窗插件

第一次接触Uniapp原生插件开发时,我盯着官方文档里"需要Android/iOS原生开发经验"的提示犹豫了整整两周。直到发现官方提供的UniPlugin-Hello-AS工程模板,才意识到原来门槛可以这么低——只要会JavaScript和基础Java语法,就能开发简单的原生插件。本文将带你用最简化的方式,完成一个显示系统弹窗的Android原生插件开发全流程。

1. 环境准备与工程搭建

开发Uniapp原生插件需要配置以下环境(以Windows系统为例):

  • HBuilderX 3.4.0+:确保安装了App开发套件
  • Android Studio 2021.2.1+:推荐使用稳定版
  • Java JDK 11:配置好JAVA_HOME环境变量
  • Node.js 14+:用于依赖管理

提示:Android Studio安装时务必勾选"Android SDK"和"Android SDK Command-line Tools"

下载官方示例工程:

git clone https://github.com/dcloudio/UniPlugin-Hello-AS.git

用Android Studio打开后,关键目录结构如下:

UniPlugin-Hello-AS ├── app # 主模块 ├── plugin_hello # 示例插件模块 ├── README.md └── settings.gradle

2. 创建自定义插件模块

在Android Studio中右键项目 → New → Module → Android Library,命名为toast_plugin。然后修改build.gradle

apply plugin: 'com.android.library' android { compileSdkVersion 31 defaultConfig { minSdkVersion 21 targetSdkVersion 31 } } dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' implementation project(':uniplugin_component') implementation project(':uniplugin_module') implementation project(':uniplugin_richalert') }

创建核心类ToastPlugin.java

package com.example.toastplugin; import android.content.Context; import android.widget.Toast; import io.dcloud.feature.uniapp.annotation.UniJSMethod; import io.dcloud.feature.uniapp.bridge.UniJSCallback; import io.dcloud.feature.uniapp.common.UniModule; public class ToastPlugin extends UniModule { @UniJSMethod(uiThread = true) public void showToast(String message) { if(mUniSDKInstance != null) { Context context = mUniSDKInstance.getContext(); Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } } }

3. 插件注册与配置

toast_plugin模块的src/main目录下新建assets文件夹,创建dcloud_uniplugins.json

{ "nativePlugins": [ { "hooksClass": "", "plugins": [ { "type": "module", "name": "ToastPlugin", "class": "com.example.toastplugin.ToastPlugin" } ] } ] }

修改主模块的build.gradle,添加对新插件的依赖:

dependencies { implementation project(':toast_plugin') }

4. 生成自定义基座

在Android Studio中:

  1. 点击Build → Generate Signed Bundle / APK
  2. 选择APK → 创建或选择现有签名文件
  3. Build Variants选择release
  4. 等待构建完成,生成的APK在app/release/目录下

将生成的APK文件重命名为android_debug.apk,复制到HBuilderX项目的unpackage/debug/目录(需先创建该目录)

5. Uniapp调用插件

在HBuilderX项目中创建测试页面:

<template> <view class="content"> <button @click="showToast">点击显示原生弹窗</button> </view> </template> <script> export default { methods: { showToast() { const toastModule = uni.requireNativePlugin('ToastPlugin') toastModule.showToast('Hello from Native!') } } } </script>

配置manifest.json启用自定义基座:

"app-plus": { "usingComponents": true, "plugins": { "ToastPlugin": { "version": "1.0.0", "provider": "com.example.toastplugin" } } }

6. 调试与问题排查

常见问题及解决方案:

问题现象可能原因解决方案
找不到插件插件未正确注册检查dcloud_uniplugins.json配置
方法调用无效方法未添加@UniJSMethod注解确保所有暴露方法都有正确注解
基座运行无效果未使用自定义基座确认HBuilderX运行的是自定义基座

调试技巧:

  • 在Android Studio的Logcat中过滤"uniPlugin"查看插件日志
  • 使用adb logcat命令实时查看设备日志
  • 修改插件代码后需要重新打包APK并替换基座文件

7. 插件功能扩展

基础弹窗功能运行成功后,可以尝试扩展更多实用功能:

设备信息获取示例

@UniJSMethod(uiThread = true) public void getDeviceInfo(UniJSCallback callback) { if(mUniSDKInstance == null || callback == null) return; Activity activity = mUniSDKInstance.getContext(); WifiManager wifi = (WifiManager)activity.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); JSONObject data = new JSONObject(); try { data.put("model", Build.MODEL); data.put("sdkVersion", Build.VERSION.SDK_INT); data.put("macAddress", info.getMacAddress()); } catch (JSONException e) { e.printStackTrace(); } callback.invoke(data); }

JS端调用方式:

toastModule.getDeviceInfo(res => { console.log('设备信息:', res) })

8. 性能优化建议

  1. 减少跨语言调用:批量传输数据优于频繁调用
  2. 异步处理耗时操作:避免阻塞UI线程
  3. 合理使用缓存:对不变的数据进行缓存
  4. 内存管理:及时释放不再使用的资源

优化后的调用示例:

@UniJSMethod(uiThread = false) public void complexOperation(JSONObject params, UniJSCallback callback) { // 在子线程执行耗时操作 String result = doHeavyWork(params); // 返回结果到JS线程 mUniSDKInstance.runOnUiThread(new Runnable() { @Override public void run() { if(callback != null) { callback.invoke(result); } } }); }

在实际项目中,我发现插件初始化的性能开销较大,推荐将多个相关功能整合到一个插件模块中,而不是创建多个小型插件。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 20:20:55

Windows热键侦探:三分钟定位快捷键冲突的幕后黑手

Windows热键侦探&#xff1a;三分钟定位快捷键冲突的幕后黑手 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾遇到…

作者头像 李华
网站建设 2026/4/29 20:20:17

ChampR终极指南:免费开源英雄联盟助手,一键配置出装符文

ChampR终极指南&#xff1a;免费开源英雄联盟助手&#xff0c;一键配置出装符文 【免费下载链接】champr &#x1f436; Yet another League of Legends helper 项目地址: https://gitcode.com/gh_mirrors/ch/champr 还在为英雄联盟复杂的出装搭配和符文配置烦恼吗&…

作者头像 李华
网站建设 2026/4/29 20:14:40

AGILE框架:交互式拼图学习提升视觉语言模型能力

1. 项目概述AGILE框架是一种创新的视觉语言模型训练方法&#xff0c;它通过交互式拼图学习机制&#xff0c;显著提升了模型在视觉感知和逻辑推理方面的能力。这个框架的核心在于将传统的静态图像-文本配对训练转变为动态的拼图式交互学习过程&#xff0c;让模型在"玩拼图&…

作者头像 李华
网站建设 2026/4/29 20:14:29

FRED应用:RPC Photonics 扩散片BSDF导入模拟

摘要RPC Photonics公司有高品质的的工程漫射体BSDF测试数据&#xff0c;但它对于FRED帮助甚少&#xff0c;下面这个步骤描述了如何利用FRED脚本转换RPC Photonics提供的TXT文件&#xff0c;并将数据直接应用到FRED的Tabulated scatter 散射模型。背景Thorlabs和RPC Photonics联…

作者头像 李华
网站建设 2026/4/29 20:14:04

跟着 MDN 学 HTML day_3:(表单CSS美化实战与盒子模型三大核心属性详解)

一、学习前言 本次是跟着MDN官方文档零基础攻坚HTML前端系列的第三天学习打卡。前两天我们已经完整吃透原生表单语义结构、全套实用表单控件、表单name和value键值对提交底层原理&#xff0c;能独立手写合规可提交的原生基础表单。 原生默认表单自带浏览器原生丑陋样式&#xf…

作者头像 李华
网站建设 2026/4/29 20:13:35

Flutter状态管理最佳实践

Flutter状态管理最佳实践 引言 状态管理是Flutter开发中的核心概念&#xff0c;它直接影响应用的性能、可维护性和用户体验。随着应用规模的增长&#xff0c;选择合适的状态管理方案变得尤为重要。本文将深入探讨Flutter状态管理的最佳实践&#xff0c;包括状态管理方案的选择、…

作者头像 李华