论文地址:What do all these Buttons do? Statically Mining Android User Interfaces at Scale (arxiv.org)
概述
本文提出了一个可以高精度大规模自动挖掘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%