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


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

    原理

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

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

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

    若返回值是: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连接上手机,执行:

    2.获取bootclasspath

    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,将这两个文件下载到工作目录。
    然后在终端执行:

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

    4.修改smail文件

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

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

    保存。

    5.重新编译成dex文件

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

    6.获取/system挂载信息

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

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

    Selection_001

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

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

    7.复制所需文件到手机

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

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

    给dexopt-wrapper运行权限

    8.生成odex文件

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

    比如最后我的是这样:

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

    执行完了是这样的显示:
    Selection_002

    9.给生成的odex文件签名

    还是在adb shell,su,执行:

    10.替换系统odex

    最后一步,将/system/framework里的services.odex替换成我们自己制作的feelyou_services_hacked.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 '........'),那就搞定了!
    Selection_004

    参考文章:

  • 相关阅读:
    beego 注解路由无效问题分析
    sync.Map实现分析
    由浅入深聊聊Golang的sync.Map
    Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型
    golang 的 channel 实现 生产者/消费者 模型
    Golang sync.NewCond条件锁的用法
    golang channel多生产者和多消费者实例
    Go语言的那些坑
    go语言标准库sync/atomic中的原子操作
    理解 Go 标准库中的 atomic.Value 类型
  • 原文地址:https://www.cnblogs.com/fatfatdachao/p/4403282.html
Copyright © 2020-2023  润新知