插件开发与 Java-JS 混合开发
做安卓自动化脚本,JS 能力再强也有边界:要操作系统底层、要调 Android 原生 API、要跑自己写的 Java 算法——纯 JS 脚本就够不着了。够不着怎么办?那就得借 Java 的手。EasyClick 提供了两条路:插件开发(Java 写 apk,脚本引用)和 Java-JS 混合开发(Java 和 JS 放一起编,js 直接调 java)。这篇文章把两条路的流程讲透。
插件本身是一个 apk 包,和普通的 Android 开发无任何区别:开发时可以用 Android Studio 开发、打包成 apk,也可以走 EasyClick 的 IDEA 模板(更省事)。用 IDEA 创建项目、选择 ‘EasyClick 插件工程’,点击下一步并完成,会自动生成对应的 java 类和配置信息。它的目录结构是:
| 路径 | 作用 |
|---|---|
src/js/main.js |
js 调用插件相关方法的测试入口 |
src/com/ |
Java 源码,PluginClz 类是默认生成的插件入口类 |
libs/jarlibs |
三方引用 jar 包,会被合并到插件中 |
libs/solibs |
so 封装文件,会被编译到插件的 lib 文件夹 |
libs/resources |
资源文件,会被编译到插件的 resources 文件夹 |
libs/jslibs |
JS 类库文件,不会编译到插件中,仅用来测试和调用 |
作为插件开发者,只要关注 java 代码的编写即可;如果有 jni 调用,将 so 文件放到 libs/solibs 中。PluginClz 是默认生成的插件 java 类,test 方法是默认生成的插件方法,实际调用请看 main.js 中的调用。运行时执行菜单栏「EasyClick 开发工具 - 运行工程」,前提是要连接到手机;打包执行菜单栏「EasyClick 开发工具 - 打包插件 - 编译插件 apk 文件」,打包结果看 EasyClick 运行日志的输出,一般在 build/release.apk——如果打包的插件 apk 很大,很可能是这里搞错了,正常插件一般只有几到几百 kb。脚本里用它的方式三步:将打好包的 apk 文件放到脚本工程的 plugin 文件夹下;使用 loadDex 函数载入插件;使用 new 方法生成插件对象实例即可调用。
插件这条路走通了,另一条路不拆成两个工程,把 Java 和 JS 放在一起编。
混合开发是把 java 和 js 放在一起编写,js 调用 java 的方法,编译后 java 代码和 jar 包会变成一个 defaultplugin.apk 文件作为插件使用。用 IDEA 创建项目、选择 ‘EasyClick Java-JS 混合项目’,JDK 版本要用 1.8(小版本无所谓),点击下一步并完成,会自动生成对应的 java 类和配置信息。目录结构与插件工程一致:src/js/main.js(测试入口)、src/com/(Java 源码,PluginClz 入口类)、libs/jarlibs(三方 jar)、libs/solibs(so)、libs/resources(资源)、libs/jslibs(JS 类库)。工程配置三步:配置 JDK 和输出 class 目录(在项目上点击右键,进入项目结构配置)、引用 android.jar(找到 android.jar 右键选择“加入 lib”确认添加)、完成后即可编写代码。java 编译后是插件形式,插件名称是 defaultplugin.apk:
// 脚本运行的时候调用 loadDex 载入插件
loadDex("defaultplugin.apk");
// 使用 importClass 或者 importPackage 引入 java 类
// 使用 new 方法生成插件对象实例即可调用
运行执行菜单栏「EasyClick 开发工具 - 运行工程」(需连接手机),打包执行「EasyClick 开发工具 - 打包工程」,打包结果看 EasyClick 运行日志的输出。
两条路怎么选,和产物大小
| 维度 | 插件开发 | Java-JS 混合开发 |
|---|---|---|
| 代码组织 | Java 独立成 apk,脚本引用 | Java 和 JS 同工程编写 |
| 产物 | release.apk(几到几百 kb) | defaultplugin.apk |
| 适用 | 已有 Android 工程 / 复用代码 | 以脚本为主、Java 补能力 |
| 调用方式 | loadDex + new | loadDex + importClass + new |
简单说:你已经有独立的 Android 能力要做成插件,用插件开发;你的脚本需要夹带少量 Java 逻辑,用混合开发。两条路给安卓自动化脚本开了两扇“原生能力”的门:插件开发用 Java 写 apk 扩展脚本功能,Android 原生能力随便调;混合开发用 js 调 java 方法,编译产出 defaultplugin.apk,脚本侧 loadDex + importClass 即可用;正常插件几到几百 kb,不拖累脚本分发;独立能力用插件、夹带逻辑用混合,两条路可以并存。
当你的脚本需要“JS 够不着”的能力时,这两条路就是答案。怎么选?看你要的是独立能力还是补丁。
常见问题
插件能调用 Android 原生能力吗?
能。插件本身就是 Android apk,Java 代码里可以使用 Android SDK 能力;jni 调用把 so 放到 libs/solibs 即可。
打包的 apk 特别大怎么回事?
正常插件只有几到几百 kb。apk 很大通常是误把不相关的大文件放进了工程,检查 libs 目录里是否有不该合并的资源。
为什么 jslibs 里的 JS 类库没编译进插件?
设计如此:libs/jslibs 里的 JS 类库仅用来测试和调用,不会编译到插件中,避免插件膨胀。
想要真实跑起来?
本文介绍的方案均可基于 EasyClick 能力在 iEasyClick 落地。官网提供完整文档、开发工具与自动化产品,免费体验。