Auto.js-VSCode-Extension icon indicating copy to clipboard operation
Auto.js-VSCode-Extension copied to clipboard

Bug:无法运行脚本。使用保存项目到设备之后。

Open fanlushuai opened this issue 1 year ago • 5 comments

Can't resolve relative module ID "./utils/util" when require() is used outside of a module (/android_asset/modules/jvm-npm.js#87)

复现过程

  1. 新建项目,包含一个子目录文件util/util.js,和一个文件main.js保存项目到设备。
  2. 运行main.js。此脚本包含相对路径引用。require('./util/uil.js')
  3. f5调试,出现异常

猜测

  1. vscode插件,发送文件调试。
  2. 位于apk端的服务接受到文件,开始执行。但是此时,执行的根目录,为apk自己默认的 /脚本/ 目录。 而,因为,之前保存项目到文件,此脚本的其他require文件,已经被包装到了,一个项目目录下,即 /脚本/projectName/。导致此文件的引用找不到。

而在apk断直接运行文件的时候。因为require采用的是相对路径。所以,直接就可以运行。但是vscode远程调试时候,根目录,并没有切换指向。

修改建议

修改范围:

  1. 插件端,发送文件调试的时候,标记,在项目内运行。即,添加,参数,projectPath
  2. apk端,解析这个prejectPath,自动,移动执行path。

备注:如果出现结构层次复杂的场景。建议 projectPath,参数,以手动输入或者文件配置的方式,这样,更加灵活的,使得运行脚本,配置在apk断的依赖目录

实现目标

vscode可以灵活的,在运行脚本的功能中,调整依赖文件路径。并且发送给apk,apk同时能够自动调整path。

注意,建立在猜测基础上的建议,如果存在问题,还请海涵。

fanlushuai avatar Oct 25 '23 11:10 fanlushuai

附上其他解决方式。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文件,双击运行即可开始同步。

fanlushuai avatar Oct 27 '23 09:10 fanlushuai

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)

``

fanlushuai avatar Oct 29 '23 00:10 fanlushuai

不再使用插件提供的保存项目功能。改用文件同步+脚本引擎启动脚本。

使用,脚本同步文件夹之后。存在的问题,就是多项目调试。的时候,需要不停的手动切换,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/",
});

fanlushuai avatar Dec 31 '23 15:12 fanlushuai

你说的这种要进行编译运行,有一个专门的工程

kkevsekk1 avatar Feb 06 '24 07:02 kkevsekk1

用这个吧,官网推荐的,编译后会把多个js文件编译到一起,还能混淆。https://github.com/kkevsekk1/webpack-autojs/tree/master

wyy0117 avatar Feb 14 '24 10:02 wyy0117