ARTICLE · 1194760
AutoJsPro9-编写自己的插件
今天给大家分享怎么给 AutoJsPro9 写一个自己的插件。前面几期用到的 PP-OCRv6 文字识别插件,就是按今天这套方法写出来的。JS 做不了、或者做起来太慢的事情,比如调安卓原生接口、跑 C++ 推理,都可以写成插件给脚本用。有问题评论区问我就行。
本期示例插件的源码和安装包:
链接:https://pan.quark.cn/s/306357fc2bfa?pwd=9Q3t提取码:9Q3t
插件是什么
插件就是一个普通的安卓 App,装到手机上以后,脚本里一句 $plugins.load("插件包名") 就能把它加载进来。
它由三部分组成:
1. 一个注册类,告诉 Auto.js 插件从哪里进。
2. 一个 Java 类,真正干活的代码写在这里。
3. 一个 JS 文件(胶水层),把 Java 方法包装成脚本好用的样子。
准备工作:用 Android Studio 新建工程
1. 去 Android Studio 官网下载安装,国内可以用 developer.android.google.cn/studio 这个地址。第一次打开会让你下载 SDK,一路点 Next 就行,等它下载完。
2. 新建工程。第一次打开会出现欢迎页,直接点 New Project;已经打开过别的工程的,点左上角菜单 File → New → New Project(新版界面的菜单收在左上角四条横线的按钮里)。

3. 左边选 Phone and Tablet,右边选 No Activity(插件不需要界面),点 Next。

4. 填工程信息,这一步最重要:
Name 填 HelloPlugin,这是工程名字。
Package name 填 com.example.hello,这就是插件的包名,脚本里加载插件用的就是它,自己做插件时换成自己的,别和别人重复。
Save location 是工程保存的位置,放哪都行,路径里最好不要有中文。
Language 一定要选 Java,默认是 Kotlin。
Minimum SDK 选 API 24,安卓 7.0 以上都能装。
Build configuration language 选 Groovy DSL (build.gradle),默认是 Kotlin DSL,选错了后面的配置写法会对不上。

5. 点 Finish,等右下角的进度条跑完。第一次新建工程要下载 Gradle,网络慢的话要等好几分钟,进度条没跑完之前别乱点。
6. 左上角的下拉框选 Android 视图,就能看到下面这样的目录。本期要动的文件我都框出来了:

几个文件夹和文件的建法:
Java 类:展开 kotlin+java(老版本叫 java),在 com.example.hello 上右键 → New → Java Class,输入类名回车。
assets 目录:在 app 上右键 → New → Folder → Assets Folder,直接点 Finish。然后在 assets 上右键 → New → Directory,输入 hello。
index.js:在 hello 文件夹上右键 → New → File,输入 index.js。
最后工程的目录是这样的:
HelloPlugin├─ settings.gradle└─ app├─ build.gradle└─ src/main├─ AndroidManifest.xml├─ assets/hello/index.js└─ java/com/example/hello├─ HelloPluginRegistry.java└─ HelloPlugin.java
第一步,引入插件 SDK
插件 SDK 在 jitpack 上,先在 settings.gradle 的 repositories 里加上 jitpack:
dependencyResolutionManagement {repositories {google()mavenCentral()maven { url 'https://jitpack.io' }}}
再在 app/build.gradle(Android 视图里叫 build.gradle (Module :app))的 dependencies 里加一行依赖,原来的几行不用删:
dependencies {implementation 'com.github.hyb1996:Auto.js-Plugin-SDK:0.2'}
两个文件改完以后,编辑器顶部会出现一条黄色提示,点右边的 Sync Now,等它同步完。没看到这条提示的话,点菜单 File → Sync Project with Gradle Files 也一样。同步失败多半是连不上 jitpack,换个网络再点一次。
第二步,在清单里声明入口
双击打开 manifests 下的 AndroidManifest.xml,在 application 里加一个 meta-data,名字固定是 org.autojs.plugin.sdk.registry,值写注册类的完整类名:
<applicationandroid:allowBackup="false"android:label="Hello 示例插件"><meta-dataandroid:name="org.autojs.plugin.sdk.registry"android:value="com.example.hello.HelloPluginRegistry" /></application>
新建工程自带的 application 上可能还有 icon、theme 之类的属性,不用管,只要把 meta-data 加进 application 里面就行:

Auto.js 加载插件时就是靠这一条找到入口的,名字和类名都不能写错。
第三步,写注册类
在 com.example.hello 上新建一个 Java 类,名字叫 HelloPluginRegistry,把里面的内容换成:
package com.example.hello;import android.content.Context;import org.autojs.plugin.sdk.Plugin;import org.autojs.plugin.sdk.PluginLoader;import org.autojs.plugin.sdk.PluginRegistry;public class HelloPluginRegistry extends PluginRegistry {static {registerDefaultPlugin(new PluginLoader() {@Overridepublic Plugin load(Context context, Context selfContext, Object runtime, Object topLevelScope) {return new HelloPlugin(context, selfContext, runtime, topLevelScope);}});}}
这个类基本是固定写法,照抄改个类名就行。
第四步,写插件类
再新建一个 Java 类,名字叫 HelloPlugin。插件类继承 Plugin,里面的 public 方法在 JS 里都能直接调用:
package com.example.hello;import android.content.Context;import android.content.pm.PackageInfo;import android.os.Build;import android.os.Handler;import android.os.Looper;import android.widget.Toast;import org.autojs.plugin.sdk.Plugin;public class HelloPlugin extends Plugin {public HelloPlugin(Context context, Context selfContext, Object runtime, Object topLevelScope) {super(context, selfContext, runtime, topLevelScope);}// JS 胶水层所在的目录,对应 assets/hello/index.js@Overridepublic String getAssetsScriptDir() {return "hello";}public String hello(String name) {return "你好," + name + "!我来自插件 " + getSelfContext().getPackageName();}public int add(int a, int b) {return a + b;}public String[] deviceInfo() {return new String[]{Build.BRAND, Build.MODEL, String.valueOf(Build.VERSION.SDK_INT)};}// 插件自己的版本号要用 selfContext 读public String pluginVersion() throws Exception {Context self = getSelfContext();PackageInfo info = self.getPackageManager().getPackageInfo(self.getPackageName(), 0);return info.versionName;}// 弹 Toast 要切到主线程public void toast(final String msg) {new Handler(Looper.getMainLooper()).post(new Runnable() {@Overridepublic void run() {Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();}});}}
这里有两个 Context,新手最容易搞混:
1. getContext() 是 Auto.js 自己的,弹 Toast、开服务用它。
2. getSelfContext() 是插件自己的,读插件里的 assets、资源、版本号要用它,不然读到的是 Auto.js 的东西。
还有一点,脚本默认跑在子线程,Toast、弹窗这类操作界面的代码要像上面那样 post 到主线程。
第五步,写 JS 胶水层
在 app/src/main/assets/hello/ 下新建 index.js,目录名要和上面 getAssetsScriptDir() 返回的一致:
module.exports = function (plugin) {var hello = {};hello.sayHello = function (name) {return String(plugin.hello(name || "Auto.js"));};hello.add = function (a, b) {return plugin.add(a, b);};hello.device = function () {var arr = plugin.deviceInfo();return {brand: String(arr[0]),model: String(arr[1]),sdk: parseInt(arr[2])};};hello.version = function () {return String(plugin.pluginVersion());};hello.toast = function (msg) {plugin.toast(String(msg));};return hello;};
参数 plugin 就是上面的 HelloPlugin 对象。最后 return 出去的东西,就是脚本里 $plugins.load() 拿到的东西。
为什么不直接把 Java 对象给脚本用?因为 Java 返回的字符串是 java.lang.String,数组是 Java 数组,直接拿去 JSON.stringify 或者比较会出各种怪问题。在胶水层用 String() 转一下、拼成 JS 对象,脚本那边用着就和普通 JS 一样了。参数默认值、选项合并这些也适合放在这一层写。
第六步,编译安装
点菜单 Build → Generate App Bundles or APKs → Generate APKs:

等一会儿,右下角弹出 Build completed successfully 就是打包好了,点里面的 locate:

会打开一个文件夹,里面的 app-debug.apk 就是插件安装包,路径是工程目录下的 app/build/outputs/apk/debug/。把它发到手机上安装就行,装完不用打开它。
不想点菜单的,也可以在 Android Studio 底部的 Terminal 里执行:
gradlew assembleDebug第七步,脚本里调用
在 AutoJsPro9 里新建一个脚本:
// 加载插件,参数是插件的包名let hello = $plugins.load("com.example.hello");log(hello.sayHello("大懒虫"));log("1 + 2 = " + hello.add(1, 2));log("设备信息:" + JSON.stringify(hello.device()));log("插件版本:" + hello.version());hello.toast("插件调用成功");

点运行,打开日志可以看到插件返回的内容,屏幕下方也弹出了插件发的 Toast:

几个常见的坑
1. 改了插件代码要重新编译、重新安装。如果跑出来还是旧效果,把 AutoJsPro9 强行停止再打开。
2. Java 里抛 Error(比如 so 加载失败的 UnsatisfiedLinkError),脚本里的 try/catch 接不住。最好在 Java 里 catch 住,转成普通异常再抛出去,脚本才能看到原因。
3. 插件里要带 so 库(比如 OCR、YOLO 这类),build.gradle 的 packaging 里要设 jniLibs { useLegacyPackaging true },清单 application 上加 android:extractNativeLibs="true",并且把四种架构都打进去,因为 so 是加载到 Auto.js 的进程里跑的。
4. 插件包名不要和别人的插件重复,不然会互相覆盖。
本期到此结束,大家可以自行测试下。
一键关注本公众号,后续继续分享 AutoJsPro9 的教程。















































































