请参考
使用层级查看器布局您的配置文件以了解如何使用层级查看器。
今天我在我的应用程序中使用层次结构查看器,在模拟器和真实设备上都遇到了类似的问题,即层次结构查看器树视图窗口变黑。
注意:对于较新版本的Android Studio,您可以通过
工具 > Android > Android设备监视器 > 窗口 > 打开透视图... > 层次结构视图
打开层次结构查看器。
![enter image description here](https://istack.dev59.com/MIujp.webp)
接下来我将向您展示如何在模拟器和实际设备上解决问题。
信息: 设备调试模式已开启,我没有测试它是否对以下结果产生影响。
a). 检查设备是否已打开视图服务器
bogon:~ roofe$ adb shell service call window 3
Result: Parcel(00000000 00000000 '........')
注意: 如果你遇到了
无法找到命令 adb
adb 通常在 sdk 的路径下,我的位于 /Users/roofe/Library/Android/sdk/platform-tools/adb
。然后你可以将其加入到 PATH 环境变量中或者为其创建一个别名。
我在用户路径下的 .bash_profile
中添加了 alias adb='/Users/roofe/Library/Android/sdk/platform-tools/adb'
,然后执行了 source ./.bash_profile
。这样就可以使用 adb 命令了。
输出信息:
View Server关闭: Result: Parcel(00000000 00000000 '........')
View Server开启: Result: Parcel(00000000 00000001 '........')
如果 View Server 开启了,你的层次结构查看器应该能够正常工作。那么你就不需要阅读下面的内容了。
不幸的是,如果你的 View Server 关闭了,请继续进行以下操作。
我的模拟器和真机的 View Server 都已关闭。
b). 启动 View Server
bogon:~ roofe$ adb shell service call window 1 i32 4939
Result: Parcel(00000000 00000001 '........')
如果结果是
Result: Parcel(00000000 00000001 '........')
,则表示视图服务器已启动。而如果结果是
Result: Parcel(00000000 00000000 '........')
,则表示无法启动视图服务器。
您还可以使用以下命令关闭视图服务器:
adb shell service call window 2 i32 4939
在这里执行命令两次以关闭它,可能存在执行时间。
bogon:~ roofe$ adb shell service call window 2 i32 4939
Result: Parcel(00000000 00000001 '........')
bogon:~ roofe$ adb shell service call window 2 i32 4939
Result: Parcel(00000000 00000000 '........')
大多数真实设备无法启动视图服务器。出于安全考虑,Android在真实设备上对此进行了限制。您可以在Andorid的
WindowManageService.java源代码文件中找到相关代码。
if (!checkCallingPermission(Manifest.permission.DUMP, "startViewServer")) {
return false
}
所以,如果你是天才破解者,你可以对你的设备进行 root 以移除这个限制。我没有做过。如果你尝试成功了,请向我展示。我会非常欣赏你的聪明才智。
这里我的模拟器可以工作,而真实设备不行。如果你的视图服务器仍然关闭,请继续操作。
c)使用ddm
协议中的一种方法,详见 Android Studio 文档 用层次结构查看器 Profile Your Layout。
如果您正在使用Android模拟器,则可以跳过此部分。否则,您需要按照以下步骤设置您的设备。
注意:您的设备必须运行Android 4.1或更高版本。
在您的设备上启用开发者选项。
在您的开发机器上设置环境变量ANDROID_HVPROTO = ddm。
这个变量告诉层次结构查看器使用ddm协议连接设备,这与DDMS协议相同。其中一个限制是主机上只能有一个进程连接到设备,因此您必须杀死任何其他DDMS会话来运行层次结构查看器。
将export ANDROID_HVPROTO = ddm添加到您的.bash_profile,然后source ./ .bash_profile。
删除已安装的应用程序,并重新启动Android Studio,然后安装您的应用程序,现在您可以查看它的层次结构。
注意: 我设置了ddm,没有重启Android Studio,我无法层次查看它。一天后,我意识到了这一点,并进行了一些测试。我发现在设置ppm后,最好重新启动android studio。我猜想当android studio启动时,它会读取该配置并缓存它。
我没有在卸载应用程序的情况下进行测试。
d). 设置视图服务器
请不要在这里感到沮丧。启动视图服务器非常容易。
工具: GitHub上的ViewServer
将此添加到您的build.gradle
中
allprojects {
repositories {
jcenter()
maven {url "https://jitpack.io"}
}
}
dependencies {
...
compile 'com.github.romainguy:ViewServer:017c01cd512cac3ec054d9eee05fc48c5a9d2de'
}
在清单文件中添加
INTERNET
权限。
<uses-permission android:name="android.permission.INTERNET" />
然后将视图服务器注册到您想要检查的活动中
public class MyActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewServer.get(this).addWindow(this);
}
public void onDestroy() {
super.onDestroy();
ViewServer.get(this).removeWindow(this);
}
public void onResume() {
super.onResume();
ViewServer.get(this).setFocusedWindow(this);
}
}
到现在为止,我已经可以在我的真实设备上运行层次结构视图了。
![enter image description here](https://istack.dev59.com/RMlnS.webp)
工具 > Android > Android 设备监视器 > 窗口 > 打开透视图... > 层次结构视图
中找到它,并参考我的答案。 - LF00