Auto.js-VSCode-Extension
Auto.js-VSCode-Extension copied to clipboard
Bug:无法运行脚本。使用保存项目到设备之后。
Can't resolve relative module ID "./utils/util" when require() is used outside of a module (/android_asset/modules/jvm-npm.js#87)
复现过程
- 新建项目,包含一个子目录文件util/util.js,和一个文件main.js保存项目到设备。
- 运行main.js。此脚本包含相对路径引用。require('./util/uil.js')
- f5调试,出现异常
猜测
- vscode插件,发送文件调试。
- 位于apk端的服务接受到文件,开始执行。但是此时,执行的根目录,为apk自己默认的 /脚本/ 目录。 而,因为,之前保存项目到文件,此脚本的其他require文件,已经被包装到了,一个项目目录下,即 /脚本/projectName/。导致此文件的引用找不到。
而在apk断直接运行文件的时候。因为require采用的是相对路径。所以,直接就可以运行。但是vscode远程调试时候,根目录,并没有切换指向。
修改建议
修改范围:
- 插件端,发送文件调试的时候,标记,在项目内运行。即,添加,参数,projectPath
- apk端,解析这个prejectPath,自动,移动执行path。
备注:如果出现结构层次复杂的场景。建议 projectPath,参数,以手动输入或者文件配置的方式,这样,更加灵活的,使得运行脚本,配置在apk断的依赖目录
实现目标
vscode可以灵活的,在运行脚本的功能中,调整依赖文件路径。并且发送给apk,apk同时能够自动调整path。
注意,建立在猜测基础上的建议,如果存在问题,还请海涵。
附上其他解决方式。vscode插件,Batch Runner,加上一个bat脚本,在linux环境,用sh脚本即可。
下面是一个基本的ADB脚本,可以将电脑上的文件夹同步到安卓手机上。请注意,你需要在Windows操作系统上运行该脚本,并确保已经安装了ADB工具。
bat复制代码
@echo off
setlocal enabledelayedexpansion
rem 设置ADB工具的路径
set ADB_PATH=C:\adb\platform-tools
rem 设置电脑上要同步的文件夹路径
set PC_FOLDER_PATH=C:\Path\to\Your\Folder
rem 设置手机上要同步的目标路径
set PHONE_FOLDER_PATH=/sdcard/Path/to/Your/Folder
rem 连接到手机
%ADB_PATH%\adb devices
rem 确认是否正确连接到设备
:devicecheck
%ADB_PATH%\adb get-state | find "device"
if %errorlevel% neq 0 (
echo 无法找到连接的设备,请检查设备是否正确连接。
pause
exit
)
rem 创建手机上的目标文件夹
%ADB_PATH%\adb shell mkdir -p "%PHONE_FOLDER_PATH%"
rem 同步文件夹到手机
%ADB_PATH%\adb push "%PC_FOLDER_PATH%" "%PHONE_FOLDER_PATH%"
rem 断开与手机的连接
%ADB_PATH%\adb disconnect
endlocal
在使用这个脚本之前,请确保以下事项: 将C:\adb\platform-tools替换为你的ADB工具的实际路径。 将C:\Path\to\Your\Folder替换为你要同步到手机的文件夹的路径。 将/sdcard/Path/to/Your/Folder替换为手机上要存储同步文件夹的目标路径。 保存脚本为.bat文件,双击运行即可开始同步。
bat和sh都不好用,还是用python吧。
import adbutils
from adbutils import adb
import re,os,glob
# https://github.com/openatx/adbutils
# https://blog.csdn.net/xiaoerbuyu1233/article/details/122124201
adb = adbutils.AdbClient(host="127.0.0.1", port=5037)
for info in adb.list():
print(info.serial, info.state)
# <serial> <device|offline>
for d in adb.device_list():
print(d.serial) # print device serial
# 点亮屏幕
d.shell("input keyevent KEYCODE_POWER")
# 解锁
d.shell("input keyevent 82")
# 关屏时间
d.shell("settings put system screen_off_timeout 10000000")
# 屏幕常亮?? https://www.jianshu.com/p/bae933aac556 在我的手机上,不管用。。。妈的
d.shell("svc power stayon usb")
for f in glob.glob(r'E:\code\open\kuaishou\**\*.js',recursive=True):
localPath=f
phonePath=f.replace("E:\code\open\kuaishou","/storage/emulated/0/脚本/kuaishou").replace("\\","/")
print(localPath)
print(phonePath)
d.sync.push(localPath,phonePath)
``
不再使用插件提供的保存项目功能。改用文件同步+脚本引擎启动脚本。
使用,脚本同步文件夹之后。存在的问题,就是多项目调试。的时候,需要不停的手动切换,app上面的路径。以适配不同的文件夹。
现在,采用一个,在app,设置的目录的根目录,加上,projectXXX.js ,通过脚本引擎的方式,追加,path,参数。来执行项目。
解决,多个项目,调试起来,难受的问题。
// projectXXX.js
log("开始执行脚本");
engines.execScriptFile("/storage/emulated/0/脚本/projectXXX/main.js", {
path: "/storage/emulated/0/脚本/projectXXX/",
});
// projectYYY.js
log("开始执行脚本");
engines.execScriptFile("/storage/emulated/0/脚本/projectYYY/main.js", {
path: "/storage/emulated/0/脚本/projectYYY/",
});
你说的这种要进行编译运行,有一个专门的工程
用这个吧,官网推荐的,编译后会把多个js文件编译到一起,还能混淆。https://github.com/kkevsekk1/webpack-autojs/tree/master