运行 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 名称,而不是路径名。不要将点更改为斜杠、添加后缀或做任何类似的事情。使用与清单文件完全相同的名称。)

这种方法应该有效,但我无法对其进行测试。如果失败,请在下方留言。