kkevsekk1 / AutoX

A UiAutomator on android, does not need root access(安卓平台上的JavaScript自动化工具)
Other
7.49k stars 1.78k forks source link

6.6.6报错 Writable dex file is not allowed #1107

Open happyme531 opened 1 month ago

happyme531 commented 1 month ago
  1. Autox.js 版本:6.6.6
  2. Autox.js 下载渠道:https://github.com/kkevsekk1/AutoX/releases
  3. Android 版本:Android 14
  4. Android 机型:三星ZFold4
  5. Android 系统类别:OneUI
  6. VSCODE 扩展版本 Auto.js-Autox.js-VSCodeExt (可选,如果是连接电脑的问题需要填):na
  7. 问题描述:RT,我的项目( https://github.com/happyme531/clxTools/tree/master/%E6%A5%9A%E7%95%99%E9%A6%99%E9%9F%B3%E4%B9%90%E7%9B%92 )在6.5.9运行正常,升级到6.6.6运行就报标题上这个错误
  8. 报错日志(可选):
    
    15:24:19.781/E: Writable dex file '/data/user/0/org.autojs.autoxjs.v6/cache/classes/1720707480460.jar' is not allowed.

java.lang.SecurityException: Writable dex file '/data/user/0/org.autojs.autoxjs.v6/cache/classes/1720707480460.jar' is not allowed. at dalvik.system.DexFile.openDexFileNative(Native Method) at dalvik.system.DexFile.openDexFile(DexFile.java:406) at dalvik.system.DexFile.(DexFile.java:128) at dalvik.system.DexFile.(DexFile.java:101) at dalvik.system.DexPathList.loadDexFile(DexPathList.java:438) at dalvik.system.DexPathList.makeDexElements(DexPathList.java:397) at dalvik.system.DexPathList.(DexPathList.java:166) at dalvik.system.BaseDexClassLoader.(BaseDexClassLoader.java:160) at dalvik.system.BaseDexClassLoader.(BaseDexClassLoader.java:105) at dalvik.system.DexClassLoader.(DexClassLoader.java:55) at com.stardust.autojs.rhino.AndroidClassLoader.loadDex(AndroidClassLoader.java:130) at com.stardust.autojs.rhino.AndroidClassLoader.dexJar(AndroidClassLoader.java:145) at com.stardust.autojs.rhino.AndroidClassLoader.defineClass(AndroidClassLoader.java:68) at org.mozilla.javascript.JavaAdapter.loadAdapterClass(JavaAdapter.java:549) at org.mozilla.javascript.JavaAdapter.getAdapterClass(JavaAdapter.java:346) at org.mozilla.javascript.JavaAdapter.js_createAdapter(JavaAdapter.java:186) at org.mozilla.javascript.JavaAdapter.execIdCall(JavaAdapter.java:99) at org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:100) at org.mozilla.javascript.BaseFunction.construct(BaseFunction.java:393) at org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1941) at org.mozilla.javascript.Interpreter.interpret(Interpreter.java:1061) at org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:90) at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:380) at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3869) at org.mozilla.javascript.InterpretedFunction.exec(InterpretedFunction.java:103) at com.stardust.autojs.engine.RhinoJavaScriptEngine.doExecution(RhinoJavaScriptEngine.kt:72) at com.stardust.autojs.engine.JavaScriptEngine.execute(JavaScriptEngine.java:20) at com.stardust.autojs.engine.LoopBasedJavaScriptEngine.access$001(LoopBasedJavaScriptEngine.java:17) at com.stardust.autojs.engine.LoopBasedJavaScriptEngine.lambda$execute$0(LoopBasedJavaScriptEngine.java:42) at com.stardust.autojs.engine.LoopBasedJavaScriptEngine.$r8$lambda$BFE7Dp9qUhwe9LvV-n1VOzahzHw(Unknown Source:0) at com.stardust.autojs.engine.LoopBasedJavaScriptEngine$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:230) at android.os.Looper.loop(Looper.java:319) at com.stardust.autojs.engine.LoopBasedJavaScriptEngine.execute(LoopBasedJavaScriptEngine.java:61) at com.stardust.autojs.engine.LoopBasedJavaScriptEngine.execute(LoopBasedJavaScriptEngine.java:34) at com.stardust.autojs.execution.LoopedBasedJavaScriptExecution.doExecution(LoopedBasedJavaScriptExecution.java:42) at com.stardust.autojs.execution.RunnableScriptExecution.execute(RunnableScriptExecution.java:43) at com.stardust.autojs.execution.RunnableScriptExecution.execute(RunnableScriptExecution.java:37) at com.stardust.autojs.execution.RunnableScriptExecution.run(RunnableScriptExecution.java:31) at java.lang.Thread.run(Thread.java:1012)


10. 屏幕截图(可选):na
Liberations commented 1 month ago

android14 只允许动态加载只读dex导致的。你等最新的看看修复了没。

hcrgm commented 1 month ago

android14 只允许动态加载只读dex导致的。你等最新的看看修复了没。

补充一下,因为安卓外部存储是 fuse/sdcardfs,文件的 uid/gid/mask 是固定的,所以在外部存储中对文件设置只读的操作是无效的。如果 Dex 文件位于外部存储,那file.setWritable(false)将不起作用。应先把 Dex 文件拷贝到应用数据目录下(context.getExternalFilesDir(null))再加载,这个操作应由脚本编写者处理。

Liberations commented 1 month ago

android14 只允许动态加载只读dex导致的。你等最新的看看修复了没。

补充一下,因为安卓外部存储是 fuse/sdcardfs,文件的 uid/gid/mask 是固定的,所以在外部存储中对文件设置只读的操作是无效的。如果 Dex 文件位于外部存储,那file.setWritable(false)将不起作用。应先把 Dex 文件拷贝到应用数据目录下(context.getExternalFilesDir(null))再加载,这个操作应由脚本编写者处理。

我这么修改貌似有用的。查看最终生成的.jar文件为只读了。虽然原路径的dex无法通过shell修改授权。

hcrgm commented 1 month ago

android14 只允许动态加载只读dex导致的。你等最新的看看修复了没。

补充一下,因为安卓外部存储是 fuse/sdcardfs,文件的 uid/gid/mask 是固定的,所以在外部存储中对文件设置只读的操作是无效的。如果 Dex 文件位于外部存储,那file.setWritable(false)将不起作用。应先把 Dex 文件拷贝到应用数据目录下(context.getExternalFilesDir(null))再加载,这个操作应由脚本编写者处理。

我这么修改貌似有用的。查看最终生成的.jar文件为只读了。虽然原路径的dex无法通过shell修改授权。

看到了,这个 issues 案例是 jar 转 dex,jar 转 dex 是缓存在 /data/user 里的,所以有用。我看到有些项目是从外部直接加载 dex,这在 Android 14 就没有用了。