O’s World

努力!奋斗!

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

| 评论

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

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

越狱设备,安装软件

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

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

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

在 Cydia 中找到并安装它们。

拷贝库文件

设备越狱并安装好上面的两个软件之后,就可以将 RevealSpark 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 命令或者重启设备之后就可以使用 RevealSpark Inspector 查看目标程序的 View Hierarchy 了。

可能出现的问题

某些情况下可能出现重启设备后 Cydia Substrate 没用工作,libReveal.dylibSparkInspector.dylib 没有加载。这时 RevealSpark 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 命令之后就可以使用 RevealSpark Inspector 查看目标程序的 View Hierarchy 了。但是当设备重新启动之后还是得重新手动加载一次 dylib