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

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

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

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

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

// 第一代API
app.viewFile(...)
 
// 第二代API
const app = require('app');
app.viewFile(...)
 
// 也可以这样只导入需要的函数
const { viewFile } = require('app');
viewFile(...)

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

// 第一代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;一部分模块的功能则迁移到其他模块;一部分模块则由Node.js自带模块代替,比如files模块由Node.js的fs和path模块代替;一部分模块则由第三方npm模块代替,这些模块往往更加完善,比如WebSocket由ws模块代替。

以下是各个第一代API模块在第二代API中的对照或代替。需要注意即使模块名字一样,API设计也可能有所不同。比如在第一代API中获取屏幕宽度是device.width,在第二代API中则是device.screenWdith

  • 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')

  • crypto模块 在第二代API中使用Node.js模块crypto
  • debug模块 在第二代API中暂无代替
  • device模块 在第二代API中使用device模块
  • dialogs模块 在第二代API中使用dialogs模块。
  • engines模块 在第二代API中使用engines模块。
  • events模块 第一代API中events模块的事件在第二代API对应如下:
  1. exit: 用process.on('exit', () => {})代替
  • floaty模块 在第二代API中使用floating_window模块。
  • files模块 在第二代API中使用Node.js模块fspath
  • globals全局函数与变量
    • sleep 使用lang模块中的delay函数代替,比如await delay(1000)
    • toasttoastLog 在toast模块中,比如showToast('hello', {log: true})showToast('hello', {log: true})
    • exit 使用Node.js函数process.exit()代替
    • random 使用Math.random代替
    • requiresApi 使用device模块requiresAndroidVersion代替
    • requiresAutojsVersion 使用process.versions.autojspro获取Auto.js版本后判断
    • runtime.requesetPermissions 在ui.Activity中使用this.requesetPermissions代替
    • runtime.loadJarruntime.loadDex 使用$java.loadJar/$java.loadDex代替,参加java
    • context 使用$autojs.androidContext代替
  • http模块 推荐使用内置的axios模块代替,功能比http模块强大得多
  • media 在第二代API中使用media模块。
  • plugins 在第二代API中使用plugins模块。
  • power_manager 在第二代API中使用power_manager模块。
  • sensors 在第二代API中使用sensors模块。
  • shell 在第二代API中使用shell模块。
  • storages 在第二代API中使用datastore模块。
  • settings 在第二代API中使用settings模块。
  • threads 参考多线程与异步
  • timers 在第二代API中使用timers模块。实际上setTimeoutsetInterval等全局函数在第二代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模块