解决HierarchyViewer不能连接真机的问题

今天想通过HierarchyViewer分析一下Android应用的布局,但是发现无法连接上真机,错误如下:

1

2

3

4

5

[hierarchyviewer]Unable to get view server version from device 00856cd5d08d2409

[hierarchyviewer]Unable to get view server protocol version from device 00856cd5d08d2409

[ViewServerDevice]Unable to debug device: lge-nexus_4-00856cd5d08d2409

[hierarchyviewer]Missing forwarded port for 00856cd5d08d2409

[hierarchyviewer]Unable to get the focused window from device 00856cd5d08d2409

原理

Android系统出于安全考虑,Hierarchy Viewer只能连接开发版手机或模拟器,我们普通的商业手机是无法连上的(老版本的Hierarchy Viewer可以),这一限制在
frameworks/base/services/java/com/android/server/wm/WindowManageService.java

Java

1

2

3

4

5

6

7

8

9

10

public boolean startViewServer(int port) {

if (isSystemSecure()) {

return false;

}

if (!checkCallingPermission(Manifest.permission.DUMP, "startViewServer")) {

return false;

}

//……

}

我们要做的就是,修改并替换掉这个文件,使其通过判断。

检验一台手机是否开启了View Server的办法为:

Shell

1

adb shell service call window 3

若返回值是:Result: Parcel(00000000 00000000 ‘........‘) 说明View Server处于关闭状态
若返回值是:Result: Parcel(00000000 00000001 ‘........‘) 说明View Server处于开启状态

若是一台可以打开View Server的手机(Android开发版手机 、模拟器or 按照本帖步骤给系统打补丁的手机),我们可以使用以下命令打开View Server:
adb shell service call window 1 i32 4939
使用以下命令关闭View Server:
adb shell service call window 2 i32 4939

听说小米手机可以直接打开,如果你的是小米手机,可以试一下。

下面开始是解决方案,使用本方法的前提是:

- 手机已root
- 手机安装了BusyBox(没有的去装一个)

1.拷贝数据

约定当前使用的工作目录是/home/feelyou/hierarchyviewer

打开终端切换到工作目录,新建文件夹存放数据。通过usb连接上手机,执行:

Shell

1

2

3

mkdir ./system

mkdir ./system/framework

adb pull /system/framework/ ./system/framework/

2.获取bootclasspath

Shell

1

2

3

4

adb shell

echo $BOOTCLASSPATH

#将输出的内容复制出来,随意保存到一个文本文件里,后面要用到。

exit

3.反编译odex文件

这里要下载2个小工具,官方地址是https://bitbucket.org/JesusFreke/smali/downloads,下载最新版的smali-xxx.jar和baksmali-xxx.jar,比如我这里下载的是smali-2.0.3.jar和baksmali-2.0.3.jar,将这两个文件下载到工作目录。
然后在终端执行:

Shell

1

java -jar baksmali-2.0.3.jar -a 19 -x ./system/framework/services.odex -d ./system/framework/

注意,-a 后面的参数19,是你的手机当前的版本API Level,不知道的自己查一下。我的Nexus 4 是4.2.2,所以是19。执行成功了之后,在当前目录会有个out文件夹。

4.修改smail文件

使用文本编辑器打开out/com/android/server/wm/WindowManagerService.smali文件,搜索isSystemSecure(),第一个找到的目标,应该就是我们要的,这段代码如下(不用细看,我写这么多只是为了让你找到这个方法):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

.method private isSystemSecure()Z

.registers 4

.prologue

.line 6164

const-string v0, "1"

const-string v1, "ro.secure"

const-string v2, "1"

invoke-static {v1, v2}, Landroid/os/SystemProperties;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

move-result-object v1

invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

move-result v0

if-eqz v0, :cond_22

const-string v0, "0"

const-string v1, "ro.debuggable"

const-string v2, "0"

invoke-static {v1, v2}, Landroid/os/SystemProperties;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

move-result-object v1

invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

move-result v0

if-eqz v0, :cond_22

const/4 v0, 0x1

:goto_21

return v0

:cond_22

const/4 v0, 0x0

goto :goto_21

.end method

这里注意,我们要在第41~42行之间,也就是:goto_21return v0之间加入const/4 v0, 0x0,使他变成

1

2

3

4

5

6

7

8

9

:goto_21

const/4 v0, 0x0

return v0

:cond_22

const/4 v0, 0x0

goto :goto_21

.end method

保存。

5.重新编译成dex文件

将out文件夹的内容编译并压缩。然后我们会得到一个叫做feelyou_services_hacked.jar的文件,后面要用到。

Shell

1

2

java -jar smali-2.0.3.jar ./out -o classes.dex

zip feelyou_services_hacked.jar ./classes.dex

6.获取/system挂载信息

这一步我们要获取/system挂载信息,并获取写入权限,因为后面要复制东西进来

Shell

1

2

3

adb shell

su

mount

然后出来一堆东西,查找一下哪个分区挂载了/system,例如我的是/dev/block/platform/msm_sdcc.1/by-name/system

接着,输入以下命令重新挂载/system,并更改/system权限(请将/dev/block/platform/msm_sdcc.1/by-name/system替换成你的/system挂载分区):

Shell

1

2

mount -o rw,remount -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system

chmod -R 777 /system

这样我们就可以修改/system的内容了。

7.复制所需文件到手机

首先需要下载dexopt-wrapper,连接为https://dl.dropboxusercontent.com/u/5055823/dexopt-wrapper(英文原文章的连接已经失效),下载后依然放到当前工作目录。

将feelyou_services_hacked.jar和dexopt-wrapper复制到手机的/data/local/tmp文件夹中

Shell

1

2

adb push ./feelyou_services_hacked.jar /data/local/tmp

adb push ./dexopt-wrapper /data/local/tmp

给dexopt-wrapper运行权限

Shell

1

2

3

adb shell

su

chmod 777 /data/local/tmp/dexopt-wrapper

8.生成odex文件

注意!关键步骤!在adb shell中cd到/data/local/tmp文件夹下,运行:

Shell

1

./dexopt-wrapper ./feelyou_services_hacked.jar ./feelyou_services_hacked.odex [这里替换成之前获取到的BOOTCLASSPATH路径,但是注意!删除其中的":/system/framework/services.jar",当然,不包括中括号]

比如最后我的是这样:

Shell

1

./dexopt-wrapper ./feelyou_services_hacked.jar ./feelyou_services_hacked.odex /system/framework/core.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/apache-xml.jar:/system/framework/webviewchromium.jar

这样就生成了一个feelyou_services_hacked.odex文件,等下我们要用它来替换系统原有的odex文件。

执行完了是这样的显示:

9.给生成的odex文件签名

还是在adb shell,su,执行:

Shell

1

busybox dd if=/system/framework/services.odex of=/data/local/tmp/feelyou_services_hacked.odex bs=1 count=20 skip=52 seek=52 conv=notrunc

10.替换系统odex

最后一步,将/system/framework里的services.odex替换成我们自己制作的feelyou_services_hacked.odex。

Shell

1

dd if=/data/local/tmp/feelyou_services_hacked.odex of=/system/framework/services.odex

替换完成后手机会立刻重启。如果执行这一步,这个时候提示是只读,说明/system没有获取到写入权限,请重复第6步。

11.打开服务

成功重启后,用以下命令打开View Server:
adb shell service call window 1 i32 4939
用以下命令查看View Server是否打开:
adb shell service call window 3
返回的值若是Result: Parcel(00000000 00000001 ‘........‘),那就搞定了!

参考文章:

时间: 2024-08-27 13:29:12

解决HierarchyViewer不能连接真机的问题的相关文章

Android配置----DDMS 连接真机(己ROOT),用file explore看不到data/data文件夹的解决办法

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3881477.html 联系方式:[email protected] [正文] Android DDMS 连接真机(己ROOT),用file explore看不到data/data文件夹,问题在于data文件夹没有权限,用360手机助手或豌豆荚也是看不见的. 有以下两种解决方法: 方法一:使用adb

解决appium 连接真机Android 9启动报错.....shell "ps 'uiautomator'

好久没有使用Appium了,感觉要从头开始了,正好换个电脑要重新装环境,装环境就不描述了,照着网上的资料就可以了,问题就出现在连接真机,手机是Android9,vivoZ5x,启动APP时候始终报错,提示....shell "ps 'uiautomator'. 网上搜了很多,但是如下的解决版本亲测有效. 在appium的安装目录,找到该目录下C:\soft\Appium\node_modules\appium\node_modules\appium-adb\lib的 adb.js 文件 1.找到

APPium连接真机输入框中输入的内容与代码中不一致

今天解决了上一个问题,又碰到了一个新的问题. 问题:连接真机输入框中输入的内容与代码中不一致. 描述: 想实现登录页面输入用户名和密码自动登录,可是在输入用户名和密码的框中输入的内容总是与代码中的不一致,初步感觉到应该和输入发有关系,于是把用户名和密码都换成数字可以成功登录,但是真实的用户名很有可能含有字母,所以继续学习实践.把手机默认输入法换成英文的,再运行一次代码,用户名"clinvab001"可以正常输入,但是密码输入又出了问题,在网上各种寻找,几经实践终于找到了解决的办法了,在

XE6 & IOS开发之免证书真机调试(2):连接真机并运行App(有图有真相)

XE6 & IOS开发之免证书真机调试(2):连接真机并运行App(有图有真相) 2014-08-26 21:26 网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 连接真机前,请先确保真机已越狱,并已安装好AppSync.--------------------------------------------------------------- 1.确保iPhone已越狱,可以看到并成功运行cydia为准. 2.并且安

appium通过WiFi连接真机进行测试

http://www.th7.cn/Program/Android/201507/514602.shtml appium通过WiFi连接真机进行测试 2015-07-24 19:43:07CSDN-sunwangdian-点击数:430 1.安装任一adb wireless 2.确保手机已root 3.确保手机与pc在同一网段 4.启动adb wireless,点击连接按钮,默认端口为5555 5.adb connect,如图 表示连接成功 6.adb devices查看设备是否存在,若连接不成

Mac连接真机调试的问题

从昨晚到现在,我被一个文件里的空行折腾个半死,eclipse 无法连接真机进行调试,怎么都找不出问题,在terminal下开启adb服务会产生adb server din't ACK的提示.在我离真相最近的一次是看到有人说是~/.android/adb_usb.ini文件多了一个空行,我打开看到是这样: 我一看,就一行,哪来的空行,以为不是这个原因,又折腾了很久,依旧不行.这个时候打开微博看了下,阿里巴巴的股票已经超过Facebook成为仅次于Google的互联网公司,就算再把范围放大到科技公司

Appium 小白从零安装 ,Appium连接真机测试。

Appium安装过程 先安装了 Node.js.在node的官网上下载的exe安装文件. 在node的command line中执行 npm install -g appium 来安装appium,报错,无效. 去appium.io官网,下载的appium的压缩包.其实这个压缩包中已经含有appium的可执行文件,无需再单独配置Node.js了. 解压之后出现appium.exe,双击运行提示需要安装.Net Framework,点击 “是” 便可以立即下载. 下载成功后,再次运行appium.

Appium——连接真机,adb devices获取不到设备号

连接真机后,使用 adb devices获取不到设备号. 1.检查usb接口是否正常,是否正常链接到电脑 2.手机开发者模式是否开启,usb调试是否开启 3.检查驱动是否正常 4.如果驱动显示黄叹号,或者adb devices没有设备号,就用驱动精灵检查驱动,更新下驱动 再次查看,正常

uiautomatorviewer 连接真机的时候报 com.android.ddmlib.SyncException :Remote object doesn't exits!

使用UI automatorviewer 连接真机的时候,报如下错误 原因之一:手机锁屏了,解锁,重新刷新下,就可以了 uiautomatorviewer 连接真机的时候报 com.android.ddmlib.SyncException :Remote object doesn't exits! 原文地址:https://www.cnblogs.com/tester-lyj/p/11956945.html