frontmatter

论文地址:What do all these Buttons do? Statically Mining Android User Interfaces at Scale (arxiv.org)

开源地址:https://bit.ly/3knQHc9

概述

本文提出了一个可以高精度大规模自动挖掘Android应用程序的用户界面模型和行为的工具。给定一个应用程序,Frontmatter静态地提取其中所有声明的屏幕、用户界面元素、它们的文本和图形功能,以及通过与它们交互调用的Android API。

相关工作

作者发现虽然Gator对回调方法建模,以及窗口转换图的分析是上下文敏感的,但对于窗口内容的重建是上下文不敏感的,因此其精度不足以提取具有精确标签分配的UI模型。而Backstage经常无法重建应用程序的完整UI层次结构,缺少许多UI元素和标签。这与Frontmatter形成了鲜明对比,后者能重建应用程序的完整GUI模型。

技术实现

在Soot框架、Flowdroid和Boomerang的基础上,对Android UI进行精确的指向性分析。

CG构建

1. View对象处理

由于不存在对象分配点,SPARK算法无法处理如下图所示的强制转换语句,导致漏报,因此作者在每个findViewById唤起后使用新的expression statement,替换掉原有的cast statement。

图片

2. 异步调用处理

作者插桩了handleMessage与sendMessage以模拟handler中异步消息的发送与接收。并建模了AsyncTask中的四种交互来代替异步的execute调用:

* onPreExecute(),执行之前在UI线程上调用;
* 主函数doInBackground(Params…),在后台线程之后调用;
* 在UI线程上调用以在ProgressUpdate上显示进度(progress…);
* onPostExecute(Result),在后台计算完成发布结果后在UI线程上调用。

3. UI回调处理

由于Flowdroid未考虑在当前activity之外定义的监听器,因此缺少一些执行的代码。并且,识别的回调随后若在dummy main中被调用,其回调对象的构造函数中所需的大多数参数都会被设置为null。因此作者通过在特定监听器之后,立即注入其相应的回调invoke语句来修补代码。

图片

4. 适配器处理

在Android中,Adapter对象提供了一种特殊类型的回调,应该单独处理。因此,为了保留上下文,作者为Adapter::View getView(int position,View convertView,ViewGroup parent)方法中创建的UI元素进行建模。并在使用setAdapter方法调用的语句之后立即注入该适配器的getView调用。

图片

通过以上4步优化处理,Frontmatter在FlowDroid最初构建的cg上扩展了平均25%的边。

UI模型

主要借助Boomerang完成,在构建GUI层次结构的同时,Frontmatter还分析了应用程序行为,即Android框架对用户与某些UI元素的交互所触发的反应。为此,Frontmatter收集了所有Android API,并将这些API附加到每个UI元素的回调方法调用上。

此外,Frontmatter会考虑上下文并修剪不可行的边。它从回调开始沿着调用图行走,只获取适当的边,通过检查if和switch语句的条件,是否包含使用getId或getItemId方法初始化的id常量或变量。实现了同一事件监听器下,路径敏感的UI回调分析。

实验

在AndroZoo中518个应用上进行了测试,Frontmatter为403/518个应用生成了模型,占所有应用程序的78%,而Gator为385/518个应用生成成功,占74%