1. UniApp 扩展是什么?
UniApp 提供了扩展原生能力的方式,通过创建一个原生插件(Native Plugin),可以在原生平台(Android 和 iOS)上实现自定义的功能。对于 Android 平台,需要通过 Java 编写扩展代码并通过 JNI 与 UniApp 通信。
2. 创建 UniApp 扩展插件
2.1 下载 UniApp 插件开发模板
- 前往 UniApp 插件开发文档。
2.2 设置 Android 开发环境 【自行配置】
3. 打包 Auto.js 为库模块
整合 Auto.js 源码到扩展中
-
确定必要模块:
- JS 引擎:Auto.js 使用 V8 引擎或 Rhino 引擎运行脚本。
- 无障碍服务:支持自动化操作的核心功能。
- 悬浮窗功能:显示运行状态或脚本交互界面。
- 脚本管理模块:提供脚本启动、停止等功能。
-
将 Auto.js 源码导入到 Android 项目中:
- 创建一个新的 Android Library 模块(
library
类型)。 - 将 Auto.js 源码的关键文件复制到
src/main/java
文件夹下。例如:/src/main/java/com/autojs/core /src/main/java/com/autojs/accessibility /src/main/java/com/autojs/scripts
- Auto.js 项目依赖
.so
文件(如 V8 引擎的本地库),将这些文件放入src/main/jniLibs
目录下,结构如下:/src/main/jniLibs/arm64-v8a/libv8.so
/src/main/jniLibs/armeabi-v7a/libv8.so
- 在
build.gradle
中配置本地库支持:android { sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } }
- 创建一个新的 Android Library 模块(
4. 暴露接口给 UniApp
实现插件的 Native 方法
UniApp 插件需要通过 Native 层暴露方法给 JavaScript 调用。以 Auto.js 的功能为例,以下是如何实现这些接口。
示例功能:启动脚本
-
定义一个接口: 在插件的 Java 类中,实现脚本启动功能。
package com.example.autojsplugin; import android.content.Context; import android.util.Log; import com.alibaba.fastjson.JSONObject; import com.autojs.core.ScriptEngine; public class AutoJsPlugin { private ScriptEngine scriptEngine; // 初始化脚本引擎 public void initPlugin(Context context) { scriptEngine = new ScriptEngine(context); } // 启动脚本 public String startScript(JSONObject args) { String scriptPath = args.getString("path"); try { scriptEngine.execute(scriptPath); return "Script started: " + scriptPath; } catch (Exception e) { Log.e("AutoJsPlugin", "Failed to start script", e); return "Error: " + e.getMessage(); } } // 停止脚本 public String stopScript() { if (scriptEngine != null) { scriptEngine.stop(); return "Script stopped."; } return "No script running."; } }
5. 注册方法给 UniApp
-
在
AndroidManifest.xml
中注册插件,并通过 UniApp 桥接暴露方法。 -
继承
UniJSCallback
:- UniApp 的插件需要实现
AbsSDKInstance
或UniJSCallback
。
- UniApp 的插件需要实现
-
实现桥接: 在 JavaScript 中通过
uni.requireNativePlugin
调用以下方法:
@Override
public void invoke(Context context, String method, JSONObject args, UniJSCallback callback) {
switch (method) {
case "startScript":
String result = startScript(args);
callback.invoke(result);
break;
case "stopScript":
String result = stopScript();
callback.invoke(result);
break;
case "enableAccessibility":
enableAccessibilityService(context);
callback.invoke("Accessibility Service Enabled");
break;
default:
callback.invoke("Unknown method: " + method);
}
}
6. 配置 AndroidManifest.xml
权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
<application>
<service
android:name=".AccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_config" />
</service>
</application>
7. 测试
-
在
manifest.json
中声明插件。 - 编写 JavaScript 调用逻辑。
const autojs = uni.requireNativePlugin('AutoJsPlugin'); // 启动脚本 autojs.startScript({ path: '/sdcard/scripts/test.js' }); // 停止脚本 autojs.stopScript(); // 启用无障碍服务 autojs.enableAccessibility();