Android如何在root设备上开启ViewServer详解
前言
关于什么是HierarchyViewer,请查看官方文档:http://developer.android.com/tools/debugging/debugging-ui.html。
个人理解:HierarchyViewer能获得当前手机实时的UI信息,给界面设计人员和自动化测试人员带来极大的便利。
HierarchyViewer工具提供了一个可视化界面显示布局的层次结构,让我们可以进行调试,从而优化界面布局结构,它需要手机开启ViewServer配合使用
但是在真机上并不能使用,Android的官方文档中提到:出于安全考虑,HierarchyViewer只能连接Android开发版手机或者模拟器
在代码中是在WindowManagerService.java类中做的限制,如下
privatestaticfinalStringSYSTEM_SECURE="ro.secure"; privatestaticfinalStringSYSTEM_DEBUGGABLE="ro.debuggable"; publicbooleanstartViewServer(intport){ if(isSystemSecure()){//判断系统是否是安全的 returnfalse; } //... try{ mViewServer=newViewServer(this,port); returnmViewServer.start(); }catch(IOExceptione){ Slog.w(TAG_WM,"Viewserverdidnotstart"); } returnfalse; } privatebooleanisSystemSecure(){ return"1".equals(SystemProperties.get(SYSTEM_SECURE,"1"))&& "0".equals(SystemProperties.get(SYSTEM_DEBUGGABLE,"0")); }
可以看到,在isSystemSecure()函数中,判断了ro.secure和ro.debuggable的值
所以我们的思路就是
使SystemProperties.get(SYSTEM_SECURE,"1")返回0
或者SystemProperties.get(SYSTEM_DEBUGGABLE,"0")返回1
即可达到目的
这两个属性被定义在/default.prop文件中,每次系统启动会被加载到内存中,之前看过一些修改system的方法,不过需要刷机,风险比较大,今天偶然返现一个工具mprop
这个工具可以修改内存中一些属性的值,但是在手机重启后需要重新修改,不过这都是小事
依照工具内给定的步骤修改了ro.debuggable的值为1,然后使用下面的命令
#判断手机是否开启了viewserver,如果没开启则开启 adbshellservicecallwindow3 #返回Result:Parcel(0000000000000001'........')开启 #返回Result:Parcel(0000000000000000'........')关闭 #开启ViewServer adbshellservicecallwindow1i324939 #关闭ViewServer adbshellservicecallwindow2i324939
机型:一加2氧OS6.0.1,其他不同型号不同系统需自行测试,不保证成功
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。