O’s World

努力!奋斗!

如何查看第三方 App 的视图结构

| 评论

Reveal 和 Spark Inspector 是两款 iOS 上比较好用的 Inspector View Hierarchy 工具。它们能够将 App 界面的视图层次结构实时的展示出来,以便于调试分析,就好像用 FireBug 分析 Web 页面一样。

一般情况下,Reveal 和 Spark Inspector 都只能用在自己的项目中,因为必须在项目中包含他们的库文件。如果我们能够在没有源码的情况下使用 Reveal 或 Spark Inspector 分析他人的 App View Hierarchy,无疑是一个很好的学习途径。

越狱设备,安装软件

如前面所说,一般情况下,Reveal 和 Spark Inspector 都只能用在自己的项目中,查看自己项目的 View Hierarchy。如果想要查看第三方 App 的 View Hierarchy 就必须让第三方软件去调用 Reveal 或 Spark Inspector 的动态库文件(libReveal.dylib 和 SparkInspector.dylib)。想要完成这个任务那就得使出非常手段了 – 越狱!。

越狱完成后还需要安装两个软件:

  1. OpenSSH – 可以让你在 Mac 上通过终端操作设备;
  2. Cydia Substrate(原名 Mobile Substrate)– 就是通过它让第三方 App 调用 Reveal 或 Spark Inspector 的动态库文件

在 Cydia 中找到并安装它们。

拷贝库文件

设备越狱并安装好上面的两个软件之后,就可以将 Reveal 或 Spark Inspector 的库文件拷贝到设备中了。

Reveal 使用如下命令:

1
scp /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib root@192.168.XXX.XXX:/Library/MobileSubstrate/DynamicLibraries

Spark Inspector 使用如下命令:

1
scp "/Applications/Spark Inspector.app/Contents/Resources/Frameworks/SparkInspector.dylib" root@192.168.XXX.XXX:/Library/MobileSubstrate/DynamicLibraries

创建 plist 文件

将库文件拷贝到设备中之后,还需要创建相应的 plist 文件使其运行。 可以使用 iFunbox 打开目标 App,在根目录下找到 iTunesMetadata.plist,将 softwareVersionBundleId 项中的值记下来,然后创建文件 libReveal.plist 或者 SparkInspector.plist,将目标 App 的 BundleId 按照如下格式写好(Bundles 可以多个):

1
2
3
4
5
6
{
    Filter = {
        Bundles = ("com.sina.weibo");
        Bundles = ("com.burbn.instagram");
    }
}

plist 文件创建完成之后将其拷贝到设备 /Library/MobileSubstrate/DynamicLibraries 目录中去:

1
scp XXXXXXX.plist root@192.168.XXX.XXX:/Library/MobileSubstrate/DynamicLibraries

完成!

使用 killall SpringBoard 命令或者重启设备之后就可以使用 Reveal 或 Spark Inspector 查看目标程序的 View Hierarchy 了。

可能出现的问题

某些情况下可能出现重启设备后 Cydia Substrate 没用工作,libReveal.dylib 或 SparkInspector.dylib 没有加载。这时 Reveal 和 Spark Inspector 仍然无法工作。可以共通过下面的方法手动加载。

Reveal 使用如下命令:

1
2
launchctl setenv DYLD_INSERT_LIBRARIES /Library/MobileSubstrate/DynamicLibraries/libReveal.dylib
launchctl setenv DYLD_FORCE_FLAT_NAMESPACE ''

Spark Inspector 使用如下命令:

1
2
launchctl setenv DYLD_INSERT_LIBRARIES /Library/MobileSubstrate/DynamicLibraries/SparkInspector.dylib
launchctl setenv DYLD_FORCE_FLAT_NAMESPACE ''

当然也可以同时加载这两个 dylib,使用如下命令:

1
2
launchctl setenv DYLD_INSERT_LIBRARIES /Library/MobileSubstrate/DynamicLibraries/libReveal.dylib:/Library/MobileSubstrate/DynamicLibraries/SparkInspector.dylib
launchctl setenv DYLD_FORCE_FLAT_NAMESPACE ''

然后使用 killall SpringBoard 命令之后就可以使用 Reveal 或 Spark Inspector 查看目标程序的 View Hierarchy 了。但是当设备重新启动之后还是得重新手动加载一次 dylib。