如何从第一代API迁移过来

2022年12月18日

如何从第一代API迁移过来

如果你对第一代API已比较熟悉,本文将引导你如何从第一代API迁移到第二代API。如果你想了解两代API的优缺点。参考第二代api和第一代的区别

启用第二代API与Node.js引擎

为了向前兼容,Pro 9中的代码仍然默认为旧的Rhino引擎/第一代API运行。要使用第二代API需要特别标识,参考用Node.js引擎运行代码

从全局变量函数改为导入模块

在第二代API中,所有模块都需要导入才能使用。在第一代API中的全局变量,比如app, images模块,在第二代API中都需要导入后使用,比如:

// 第一代API
images.findImage(...);
app.viewFile(...)

// 第二代API
const image = require('image');
const app = require('app');
image.findImage(...)
app.viewFile(...)

// 也可以这样只导入需要的函数
const { findImage } = require('image');
const { viewFile } = require('app');
findImage(...)
viewFile(...)

第一代API中的全局变量、函数大多数也不能直接使用,比如sleep, log, toast

// 第一代API
sleep(1000)
log(context.getPackageName())
toast('')

// 第二代API
const { delay } = require('lang');
const { showToast } = require('toast')

async function main() {
    await delay(1000);
    const context = $autojs.androidContext;
    console.log(context.getPackageName());
    showToast('Hello');
}
main();

模块与函数对照表

在第二代API中,一部分模块的名称和第一代相似,比如app, color;一部分模块的功能则迁移到其他模块,比如images模块的截图功能迁移到media_projection模块;一部分模块则由Node.js自带模块代替,比如files模块由Node.js的fs和path模块代替;一部分模块则由第三方npm模块代替,这些模块往往更加完善,比如WebSocket由ws模块代替。

以下是各个第一代API模块在第二代API中的对照或代替。

  • app模块

在第二代API中使用app模块。

  • base64模块

在第二代API中使用Buffer代替,比如字符串转换base64:Buffer.from('autojs', 'utf8').toString('base64'),base64转换为字符串:Buffer.from('YXV0b2pz', 'base64').toString('utf8')

  • colors模块

在第二代API中使用color模块。

  • canvas

UI界面中的canvas与旧版canvas类似。暂不支持无Ui界面下使用Canvas。

  • console模块

对于console.log等函数直接使用即可,无需迁移。设置日志路径等额外参数参考Console

另外,printlog等函数需要使用console.log代替,不能简写。比如log('hello')需要替换为console.log('hello')

  • events模块

在第二代API中使用Node.js模块cryptoopen in new window

  • debug模块

在第二代API中暂无代替。

  • device模块

在第二代API中使用device模块。

  • dialogs模块

在第二代API中使用dialogs模块。

  • engines模块

在第二代API中使用engines模块。

  • events模块

events模块中的一些事件,比如剪贴板监听、Toast监听等,分散在各自的模块(比如剪贴板模块、无障碍模块)中。events模块中的EventEmitter则使用Node.js模块events代替eventsopen in new window

第一代API中events模块的事件在第二代API对应如下:

  1. toastkeykey_down, key_up: Toast监听、按键监听,在accessibility无障碍模块中

  2. exit: 用process.on('exit', () => {})代替

  3. notification:通知监听,在notification通知模块中

  4. touch: 触摸监听,暂无代替,请用shell模块运行getevent -t命令后解析内容

  • floaty模块

在第二代API中使用floating_window模块。

  • files模块

在第二代API中使用Node.js模块fsopen in new windowpathopen in new window

  • globals全局函数与变量

    • sleep 使用lang模块中的delay函数代替,比如await delay(1000)
    • currentPackage, currentActivity 在无障碍模块accessibility
    • setClip, getClip 在剪贴板模块clip_manager
    • toast, toastLogtoast模块中,比如showToast('hello', {log: true}), showToast('hello', {log: true})
    • waitForActivity, waitForPackage
    • exit 使用Node.js函数process.exit()代替
    • random 使用Math.random代替,比如:
    "nodejs";
    function random(min, max) {
        min = Math.ceil(min);
        max = Math.floor(max);
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
    console.log(random(10, 30));
    
    • requiresApi 使用device模块requiresAndroidVersion代替
    • requiresAutojsVersion 使用process.versions.autojspro获取Auto.js版本后判断
    • runtime.requesetPermissions 在ui.Activity中使用this.requesetPermissions代替
    • runtime.loadJar, runtime.loadDex 使用$java.loadJar/$java.loadDex代替,参加$java
    • context 使用$autojs.androidContext代替
  • http模块

推荐使用内置的axios模块代替,功能比http模块强大得多。

  • images模块

images模块的截图功能在第二代API中使用media_projection模块,图片处理、找图等功能则在image模块。

  • keys模块

按键模拟功能在第二代API在accessibility无障碍模块中。

  • media

在第二代API中使用media模块。

  • ocr

在第二代API中使用ocr模块。

  • plugins

在第二代API中使用plugins模块。

  • power_manager

在第二代API中使用power_manager模块。

  • sensors

在第二代API中使用sensors模块。

  • shell

在第二代API中使用shell模块。

  • storages

在第二代API中使用datastore模块。

  • settings

在第二代API中使用settings模块。

  • threads

参考多线程与异步

  • timers

在第二代API中使用timersopen in new window模块。实际上setTimeout, setInterval等全局函数在第二代API中也可直接使用。

  • work_manager

在第二代API中使用work_manager模块。

  • ui

在第二代API中使用ui模块。UI模块由于有较大的API差别。参考UI界面代码迁移

  • util

在第二代API中使用Node.js模块utilopen in new window

  • WebSocket

使用npm模块wsopen in new window代替。ws模块比第一代API模块中的WebSocket功能更完整、更强大。

  • zip

在第二代API中使用zip模块。

异步与Promise

理解异步与Promise是使用第二代API最关键的一步,也是第二代API比第一代门槛高的原因之一。这里我们将简单介绍它们,你可以结合其他网络资料、教学视频等更深入地理解。

当我们做一件耗时的事情,比如申请截图权限并等待用户操作,在等待的时候函数会阻塞,但我们希望同时执行另一个事情,我们该怎么做?在第一代API中大多数人会启动一个线程来做这件事情...

(未完待续)

UI界面代码迁移

多线程与异步

上次编辑于:
贡献者: hyb1996