如何从第一代API迁移过来
如何从第一代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。
另外,print
,log
等函数需要使用console.log
代替,不能简写。比如log('hello')
需要替换为console.log('hello')
。
- events模块
在第二代API中使用Node.js模块crypto。
- debug模块
在第二代API中暂无代替。
- device模块
在第二代API中使用device模块。
- dialogs模块
在第二代API中使用dialogs模块。
- engines模块
在第二代API中使用engines模块。
- events模块
events模块中的一些事件,比如剪贴板监听、Toast监听等,分散在各自的模块(比如剪贴板模块、无障碍模块)中。events模块中的EventEmitter则使用Node.js模块events代替events。
第一代API中events模块的事件在第二代API对应如下:
toast
,key
,key_down
,key_up
: Toast监听、按键监听,在accessibility无障碍模块中exit
: 用process.on('exit', () => {})
代替notification
:通知监听,在notification通知模块中touch
: 触摸监听,暂无代替,请用shell模块运行getevent -t
命令后解析内容
- floaty模块
在第二代API中使用floating_window模块。
- files模块
globals全局函数与变量
sleep
使用lang模块中的delay
函数代替,比如await delay(1000)
currentPackage
,currentActivity
在无障碍模块accessibility中setClip
,getClip
在剪贴板模块clip_manager中toast
,toastLog
在toast模块中,比如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));
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中使用timers模块。实际上setTimeout
, setInterval
等全局函数在第二代API中也可直接使用。
- work_manager
在第二代API中使用work_manager模块。
- ui
在第二代API中使用ui模块。UI模块由于有较大的API差别。参考UI界面代码迁移。
- util
在第二代API中使用Node.js模块util
- WebSocket
使用npm模块ws代替。ws模块比第一代API模块中的WebSocket功能更完整、更强大。
- zip
在第二代API中使用zip模块。
异步与Promise
理解异步与Promise是使用第二代API最关键的一步,也是第二代API比第一代门槛高的原因之一。这里我们将简单介绍它们,你可以结合其他网络资料、教学视频等更深入地理解。
当我们做一件耗时的事情,比如申请截图权限并等待用户操作,在等待的时候函数会阻塞,但我们希望同时执行另一个事情,我们该怎么做?在第一代API中大多数人会启动一个线程来做这件事情...
(未完待续)