运行 uiautomatorviewer 在 ubuntu 20.04 中出现错误
Getting an error while running uiautomatorviewer in ubuntu 20.04
执行命令时出现如下错误:
用户名@设备:~/Android/Sdk/tools/bin$ ./uiautomatorviewer
不支持 Djava.ext.dirs=/home/username/Android/Sdk/tools/lib/x86_64:/home/username/Android/Sdk/tools/lib。请改用 -classpath。
错误:无法创建 Java 虚拟机。
错误:发生致命异常。程序将退出。
然后我在 uiautomatorviewer 文件中使用 --class-path 并遇到此错误:
我使用这种方法编辑 uiautomatorviewer 文件:https://www.programmersought.com/article/53371586152/
错误:无法初始化 main class com.android.uiautomator.uiautomatorviewer 原因:java.lang.noclassdeffounderror:org/eclipse/swt/widgets/control
我的变化:enter image description here
原文:enter image description here
而当我出现上面的错误时,又回到了之前的状态
现在我又遇到了第一期。
额外信息:
$JAVA_HOME => /usr/lib/jvm/java-8-openjdk-amd64
$ANDROID_HOME => /home/username/Android/Sdk
Android工作室版本:4.1.3
这是我在评论中要求的输出。
+java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
+exec java -Xmx1600M -Djava.ext.dirs=/home/alielyasi/Android/Sdk/tools/lib/x86_64:/home/alielyasi/Android/Sdk/tools/lib -Dcom.android.uiautomator.bindir=/home/alielyasi/Android/Sdk/tools -jar /home/alielyasi/Android/Sdk/tools/lib/uiautomatorviewer-26.0.0-dev.jar
-Djava.ext.dirs=/home/alielyasi/Android/Sdk/tools/lib/x86_64:/home/alielyasi/Android/Sdk/tools/lib is not supported.
Use -classpath
首先,我们可以看到正在使用的 Java 命令是 java
,而不是特定的(绝对)路径名。
没关系,但这意味着 $PATH
将用于将 java
解析为 Java 启动器的实际路径名。 (不是 $JAVA_HOME
。)
其次,我们可以看到 java -version
告诉我们它正在使用 Java 11.0.11。正如我在评论中提到的,Java 9 及更高版本不支持“ext.dirs”机制。
不幸的是,java
命令使用 -classpath
的建议不会起作用(按原样)。
所以我要给你两种方法来解决这个问题:
解决方案 #1:只需使用 Java 8.
您需要确保已安装 Java 8,并且 运行ning java -version
打印出版本号为 8.0.xxx
,其中xxx
是(理想情况下)最新可用的 Java 8 补丁版本。
由于您使用的是 Ubuntu 20.04,因此有两种方法可以确保您使用的是 Java 8 而不是 Java 11。
您可以使用“替代”系统使 Java 8 成为默认 Java 版本 全局 。 运行 man update-alternatives
用于文档。 (你需要 运行 update-alternatives
作为 root ...)
您可以通过更改 PATH
环境变量使 Java 8 成为当前用户或当前 shell 的默认值。
解决方案 #2:调整脚本,使 Java 11 生效。
正如我上面所说,简单地将 -Djava.ext.dirs=...
转换为 -classpath
选项是行不通的。这是因为 exec
行使用了 -jar
选项,当使用 -jar
时 -classpath
被忽略。但是 -jar
表示这是一个“可执行 JAR”,入口点 class 名称来自 JAR 文件的清单。
所以我们需要取消选中它。
首先我们需要知道(完整)入口点 class 名称是什么,并且 JAR 文件正在设置自己的 class 路径。我们可以通过使用jar
命令提取META-INF/MANIFEST.MF
文件并查看它来确定
接下来我们需要形成一个class由
组成的路径
- 当前由
$frameworkdir
给出的路径
- 主要 JAR 文件的路径(即
$jarpath
)
- 清单文件中指定的路径
路径的顺序可能很重要。
需要通过 -classpath
或 -cp
选项将整个 class 路径提供给 java
命令。 (不是 --class-path
。)
最后删除 -jar $jarpath
并将其替换为完整的入口点 class 名称。 (这是一个 class 名称,而不是路径名。不要将点更改为斜杠、添加后缀或做任何类似的事情。使用与清单文件完全相同的名称。)
这种方法应该有效,但我无法对其进行测试。如果失败,请在下方留言。
执行命令时出现如下错误:
用户名@设备:~/Android/Sdk/tools/bin$ ./uiautomatorviewer
不支持Djava.ext.dirs=/home/username/Android/Sdk/tools/lib/x86_64:/home/username/Android/Sdk/tools/lib。请改用 -classpath。 错误:无法创建 Java 虚拟机。 错误:发生致命异常。程序将退出。
然后我在 uiautomatorviewer 文件中使用 --class-path 并遇到此错误: 我使用这种方法编辑 uiautomatorviewer 文件:https://www.programmersought.com/article/53371586152/
错误:无法初始化 main class com.android.uiautomator.uiautomatorviewer 原因:java.lang.noclassdeffounderror:org/eclipse/swt/widgets/control 我的变化:enter image description here 原文:enter image description here 而当我出现上面的错误时,又回到了之前的状态
现在我又遇到了第一期。
额外信息: $JAVA_HOME => /usr/lib/jvm/java-8-openjdk-amd64
$ANDROID_HOME => /home/username/Android/Sdk
Android工作室版本:4.1.3
这是我在评论中要求的输出。
+java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
+exec java -Xmx1600M -Djava.ext.dirs=/home/alielyasi/Android/Sdk/tools/lib/x86_64:/home/alielyasi/Android/Sdk/tools/lib -Dcom.android.uiautomator.bindir=/home/alielyasi/Android/Sdk/tools -jar /home/alielyasi/Android/Sdk/tools/lib/uiautomatorviewer-26.0.0-dev.jar
-Djava.ext.dirs=/home/alielyasi/Android/Sdk/tools/lib/x86_64:/home/alielyasi/Android/Sdk/tools/lib is not supported.
Use -classpath
首先,我们可以看到正在使用的 Java 命令是 java
,而不是特定的(绝对)路径名。
没关系,但这意味着 $PATH
将用于将 java
解析为 Java 启动器的实际路径名。 (不是 $JAVA_HOME
。)
其次,我们可以看到 java -version
告诉我们它正在使用 Java 11.0.11。正如我在评论中提到的,Java 9 及更高版本不支持“ext.dirs”机制。
不幸的是,java
命令使用 -classpath
的建议不会起作用(按原样)。
所以我要给你两种方法来解决这个问题:
解决方案 #1:只需使用 Java 8.
您需要确保已安装 Java 8,并且 运行ning java -version
打印出版本号为 8.0.xxx
,其中xxx
是(理想情况下)最新可用的 Java 8 补丁版本。
由于您使用的是 Ubuntu 20.04,因此有两种方法可以确保您使用的是 Java 8 而不是 Java 11。
您可以使用“替代”系统使 Java 8 成为默认 Java 版本 全局 。 运行
man update-alternatives
用于文档。 (你需要 运行update-alternatives
作为 root ...)您可以通过更改
PATH
环境变量使 Java 8 成为当前用户或当前 shell 的默认值。
解决方案 #2:调整脚本,使 Java 11 生效。
正如我上面所说,简单地将 -Djava.ext.dirs=...
转换为 -classpath
选项是行不通的。这是因为 exec
行使用了 -jar
选项,当使用 -jar
时 -classpath
被忽略。但是 -jar
表示这是一个“可执行 JAR”,入口点 class 名称来自 JAR 文件的清单。
所以我们需要取消选中它。
首先我们需要知道(完整)入口点 class 名称是什么,并且 JAR 文件正在设置自己的 class 路径。我们可以通过使用jar
命令提取META-INF/MANIFEST.MF
文件并查看它来确定
接下来我们需要形成一个class由
组成的路径- 当前由
$frameworkdir
给出的路径
- 主要 JAR 文件的路径(即
$jarpath
) - 清单文件中指定的路径
路径的顺序可能很重要。
需要通过 -classpath
或 -cp
选项将整个 class 路径提供给 java
命令。 (不是 --class-path
。)
最后删除 -jar $jarpath
并将其替换为完整的入口点 class 名称。 (这是一个 class 名称,而不是路径名。不要将点更改为斜杠、添加后缀或做任何类似的事情。使用与清单文件完全相同的名称。)
这种方法应该有效,但我无法对其进行测试。如果失败,请在下方留言。