shell可以实现很多功能,为autojs的开发带来便捷。
autojs自带的shell比较简陋,在很多场景会受到局限,例如:cd到带有空格或其他字符串的目录,相比较于为目录加上引号,传入命令数组的方式会更优雅高效
方案:改写shell方法,使用Java原生shell,将命令以数组的格式传入,兼容性更好,稳定性更好,性能有所提升。
本代码适用于autojs,不代表JavaScript。
function shell_java(commandArr){//必要时手动把命令拆成数组确保稳定运行,如:cd到含特殊字符、空格的文件夹等。可以直接传命令字符串。
//log("commandArr",commandArr)
let tempBuffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
let byteArrayOutputStream = new java.io.ByteArrayOutputStream();
try {
let exec = java.lang.Runtime.getRuntime().exec(commandArr);
exec.getOutputStream().close();
let inputStream = exec.getInputStream();
let bufferedInputStream = new java.io.BufferedInputStream(inputStream);
let count;
while ((count = bufferedInputStream.read(tempBuffer)) !== -1) {
byteArrayOutputStream.write(tempBuffer, 0, count);
}
bufferedInputStream.close();
let retCode = exec.waitFor();
//console.log(retCode);
exec.destroy();
} catch (e) {
console.error($debug.getStackTrace(e));
}
return byteArrayOutputStream;
}
使用示例:
let command = ['cd', '/sdcard/脚本/'];
let result = String(shell_java(connand));
console.log(result)