2. 中国科学院大学 计算机与控制学院, 北京 100049;
3. 北京工业大学 计算机学院, 北京 100124;
4. 中国科学院软件研究所 软件工程技术研究开发中心, 北京 100190
2. School of Computer and Control Engineering, University of Chinese Academy of Sciences, Beijing 100049, China;
3. College of Computer Science, Beijing University of Technology, Beijing 100124, China;
4. Technology Center of Software Engineering, Institute of Software, Chinese Academy of Sciences, Beijing 100190, China
随着科技的发展, 人们的生活水平越来越高, 信息传递越来越方便, 手机已经成为了人们生活中必不可少的工具。近年来, Android手机凭借真正的开放性占据了智能手机的主要市场。在2012年时, Android智能手机已占全球智能手机市场59%的份额[1], 位居第一。截止到2016年第1季度, Android智能手机已经拥有超过83%的市场占有率[2]。然后, 高度的开放性也引来了许多问题, 资源泄漏就是众多问题中普遍存在的一个。Android系统提供了丰富的资源给用户使用, 这些资源可以分为三类:独占式资源 (例如照相机)、内存消耗资源 (例如音乐播放器) 以及能源消耗资源 (例如各种传感器)。无论是哪一类资源, 它们在使用时都需要显式的申请和释放。如果某个资源在使用后没有执行释放操作, 就会带来资源泄漏的问题。资源泄漏问题可能会造成能量消耗、内存浪费甚至程序崩溃等一系列负面结果。
由于Android程序的缺陷层出不穷, 目前基于静态分析来检测Android程序中潜在的缺陷已经成为研究热点。例如针对资源泄漏问题, 就有资源泄漏静态检测工具Relda2[3]和资源泄漏自动化修复工具RelFix[4]被提出。但是, 目前还没有工作对Relda2和RelFix的有效性进行验证。
基准测试程序[5]可以对测试对象的某一性能指标进行特定以及可对比的测试。将具有相似测试目的基准测试程序整理到一起可以形成基准测试集[6], 它作为一种评价方式在计算机领域中有着长期的应用。使用基准测试集进行测试的优点是测试结果具有针对性以及可比性, 利用它对已有工具进行测评不仅能够为用户提供选择标准, 而且还可以为开发者提供改进工具的方向。使用针对于Android程序资源泄漏问题的基准测试集测试Relda2和RelFix工具能够客观地验证它们的有效性。但是目前还没有这样的基准测试集被提出, 因此本文构建了一套针对于Android程序资源泄漏问题的基准测试集ResLeak Bench。
ResLeak Bench由两大部分基准测试程序组成:一是根据资源类别以及Android程序特性自主开发的Android程序; 二是从知名Android市场下载的具有相关资源操作的Android程序。这两部分都包含了存在资源泄漏的程序以及不存在资源泄漏的程序。另外, 自主开发的Android程序覆盖了三种类型 (独占式、内存消耗、能源消耗) 的资源。使用自主开发的基准测试程序, 能够模拟出资源的各种不同的使用方式以及泄漏方式, 使得ResLeak Bench具有一定的完备性。考虑到自主开发的基准测试程序一般情况下规模比较小、功能单一, 和真实的应用程序有着比较大的差距, 因此本文还使用Android市场下载的真实程序作为一部分基准测试程序, 这样使ResLeak Bench更具有实际意义。最终, ResLeak Bench总共包含70个基准测试程序, 其中自主开发和市场下载的各有35个。
本文的另一工作是使用ResLeak Bench对资源泄漏静态分析工具Relda2以及资源泄漏自动化修复工具RelFix进行了有效性的评测。对Relda2工具的评测结果表明该工具能够分析出绝大部分Android程序中存在的资源泄漏问题, 但是也有一小部分分析盲点。不过作为静态分析工具, Relda2的结果是比较令人满意的。对RelFix工具的评测结果表明该工具能够有效修复几乎各种类型的资源泄漏问题, 但是对于由Manifest配置文件[7]导致的资源泄漏问题无法修复。因为由Manifest配置文件导致的资源泄漏问题在实际程序中只占很小的一部分, 所以RelFix的修复结果还是比较令人满意的。
1 相关背景知识 1.1 基准测试集基准测试集作为一种评价某种系统 (工具) 性能的标杆, 在计算机领域中占有着重要的角色。它被用于测试和预测计算机系统的性能, 揭示不同结构机器的长处和短处, 为用户决定购买或使用哪种工具最合适他们的应用要求提供决策。基准测试集的测试有些偏重于硬件, 有些偏重于软件, 还有偏重于整个系统或者是某个工具。基准测试集也可用于测评一些工具。对于学术界和工业界最新提出的工具, 如果它能够通过某些基准测试集的评测, 它的认可度将会得到显著的提高。例如, FlowDroid[8]是一个Android程序的静态污点分析工具, 人们对该工具的认可不仅是因为该工具本身的功能, 同时还因为工具的开发者同时提出了该工具配套的基准测试集 (DroidBench)。基准测试集对开发者和用户都是很有价值的, 对于开发者的作用是为产品进行市场宣传和发现该产品的瓶颈, 对用户的作用是指导产品的选择。
1.2 Android基础Android程序是由活动 (Activity)、服务 (Service)、内容提供器 (Content Provider) 以及广播接收器 (Broadcast Receiver) 四大组件构成的。在这些组件中, 活动提供了一个能够与用户交互的画面; 服务用于处理一些需要长时间处理的事务; 内容提供器提供了一种在不同应用程序之间交换数据的接口; 而广播接收器用于相应各种系统以及用户发出的广播。根据Android官方文档[9]的描述, 活动组件是管理资源的基本单元, 所以本文构造的基准测试程序更多关注的是活动这个组件。
在Android程序中, 活动有着自己的生命周期。这个生命周期定义了活动是如何被创建、使用以及销毁的。活动的生命周期对应着一系列的回调函数[10], 特定的回调函数会在活动转换到生命周期的特定状态时被调用。开发者可以复写这些回调函数, 从而使活动在状态转换时能够处理一些额外的逻辑。图 1展示了活动的生命周期[11], 可以看到活动被创建时会首先调用onCreate () 函数, 开发者可以在这里做一些初始化操作; 而活动被销毁时会调用onDestroy () 函数, 开发者可以在这里让系统执行一些回收资源的指令。
开发者可以使用各种资源组件使得他们的程序更加有趣, 但是, 对这些资源的不合理使用会导致资源泄漏的问题。资源泄漏问题可能会造成能量消耗、内存浪费甚至程序崩溃等一系列负面结果。根据Android官方文档, 每一个资源都有一个建议执行回收操作的回调函数, 不同的资源可能会有不同回调函数, 但是, 这些回调函数只可能是onPause ()、onStop () 以及onDestroy () 中的一个。当一个资源在一个活动中被申请, 但是忘记在这个活动的特定生命周期回调函数中 (或者之前) 被释放掉时, 资源泄漏问题就出现了。修复资源泄漏最直接的方法就是在特定的生命周期回调函数中插入对应的资源回收操作。
在Android程序中, 回调函数的使用是必不可少的, 在这里, 本文将回调函数分为系统回调函数和用户回调函数。系统回调函数是指系统会根据某种状态的变化自动触发回调的函数。例如, 活动组件的生命周期回调函数 (onCreate ()、onDestroy () 等) 就属于系统回调函数。用户回调函数是指通过用户事件触发的回调函数。例如, 当手机屏幕中某个按钮被点击时, 这个按钮的点击监听器中的onClick () 函数就会被执行, 这个onClick () 函数就是一个用户回调函数, 它只有在这个按钮被点击后才会被执行。ResLeak Bench中的很多基准测试程序都和回调函数有关。
1.3 资源泄漏相关工具随着资源泄漏问题的出现, 一些研究工作开始关注这个问题。目前, 已经有针对资源泄漏问题的工具被提出。比较有代表性的就是资源泄漏静态检测工具Relda2和资源泄漏自动化修复工具RelFix。
Relda2是一个轻量级的静态分析工具, 它能够自动地分析目标Android程序的资源操作, 然后报告出可能出现资源泄漏的操作的具体位置。工具的开发者从Android官方文档中的1 994个类中提取出了313种资源操作, 形成一张资源列表。对于目标Android程序, Relda2主要分为以下几步来进行分析:首先, 使用逆向工程技术获得该程序的Dalvik字节码[12]; 然后, 通过分析得到的Dalvik字节码构造出函数调用图; 最后, 利用构造出的函数调用图和资源列表, 通过自底向上分析的方法找出没有执行释放资源操作的资源。
RelFix是一个资源泄漏自动化修复工具。该工具主要是通过必要的动态跟踪和字节码插桩的技术进行自动修复。RelFix以Android应用的apk安装包以及该应用经过资源泄漏静态分析工具分析后的报告作为输入, 通过Apktool[13]得到该应用的Dalvik字节码, 再根据资源泄漏的报告生成必要的Dalvik补丁代码插入到原程序中, 最后将修改后的代码打包生成新的apk安装包。该工具主要有安全修复 (修复了资源泄漏问题并且没有引入其他额外的错误)、轻量级静态分析 (静态分析耗时在一秒钟时间以内) 以及低插桩代价 (修复一个漏洞平均只需要不到4%的额外补丁代码) 三个特点。
2 基准测试集构造 2.1 基准测试集的需求一些面向Android应用程序资源泄漏的分析和修复工具, 其主要功能是能够检测潜在的资源泄漏问题以及对存在资源泄漏问题的程序进行修复。所以, 本文的基准测试集是由与资源操作相关的Android程序构成的, 同时, 这些程序还应该满足以下需求:
1) 覆盖独占性资源、内存消耗资源以及能源消耗资源三种类型的资源;
2) 包含尽可能多的不同资源操作;
3) 考虑到资源泄漏的各种场景;
4) 能够有一定的实际意义。
2.2 基准测试集的设计首先, 考虑到自主开发的基准测试程序往往功能单一, 和实际的应用程序存在比较大的差距,为了满足“具有一定的实际意义”的需求, 本文的基准测试集将由两部分组成:自主开发的程序[14]和下载的开源程序。同时, 每一类程序都分别包含有存在资源泄漏问题的程序以及不存在问题的程序。因此, ResLeak Bench的整体构成由图 2所示。
本文通过自主开发的方式实现的基准测试程序能够更准确地定位目标, 更好对工具进行评估。本文利用自主开发方式实现的基准测试程序主要有两类, 分别是存在资源泄漏和不存在资源泄漏的基准测试程序。其二者的根本区别在于当申请了一些已经被明确规定需要释放的资源时, 资源释放操作是否被有效执行。
首先, 是存在资源泄漏基准测试程序的设计。出现资源泄漏的情况主要分为两种:第一种情况是开发者根本没有写对应的资源释放语句 (每次都会出现资源泄漏); 另一种情况是开发者将资源释放语句写在了不恰当的地方, 程序在某种状态下会导致该释放语句不会被执行 (并非每次都会出现资源泄漏), 比如在用户接口 (User Interface, UI) 控件中申请与释放资源。对于第一种情况, 可以在系统回调函数中执行申请资源操作, 但是不执行释放资源操作;对于第二种情况, 可以基于用户回调函数和一些判定语句来进行设计。存在资源泄漏的自主开发测试集构成如图 3所示。
其次, 是不存在资源泄漏基准测试程序的设计。当开发者申请了资源后, 只有对相关资源执行有效的释放操作, 才能避免资源泄漏情况的发生。根据申请资源位置的不同, 不存在资源泄漏的自主开发测试集的构成可如图 4所示。
对于每一个资源, Android官方文档都给出了它应该被释放的位置, 这个位置是onPause ()、onStop () 和onDestroy () 函数中的一个。虽然在图 4中没有规定资源的释放位置, 但是不存在资源泄漏的自主开发测试集应该覆盖这三种在不同函数中释放的资源。
为保证ResLeak Bench的全面性, 本文参考了关于Android资源泄漏研究的文献以及Android官方文档, 整理出了Android程序中使用的资源操作[15]。不同的程序使用这些资源的方式也是不同的, 为了找到Android应用中最常用的资源使用方式, 本文收集了大量的真实Android应用, 整理出了最常用的资源以及它们常用的使用场景。由于资源操作数目众多以及资源使用场景的不确定性, ResLeak Bench虽然没有覆盖所有的资源操作以及使用场景 (几乎不可能), 但是它里面基准测试程序的选取都是通过以上分析得到的, 能够以最合适的测试程序数量最大限度地保证自身的全面性。
2.3 基准测试集的实现 2.3.1 自主开发测试集的实现根据2.2节的设计, 存在资源泄漏的测试集实现了五大类, 不存在资源泄漏的测试集实现了4大类, 总共实现了35个基准测试程序。
存在资源泄漏的自主开发测试集的实现如下:
1) 在活动的生命周期中申请资源并且不释放:在活动生命周期中的onCreate ()、onStart ()、onResume () 三个回调函数中申请资源。
2) 在服务的生命周期中申请资源并且不释放:在服务生命周期中的onCreate ()、onStartCommand ()、onBind () 三个回调函数中申请资源。
3) 在其他常用回调函数中申请资源并且不释放:分别在onReceive ()、onActivityResult ()、onLocationChange ()、onPictureTaken ()、onSensorChange ()、onServiceConnected ()、onCompletion ()、onGlobalLayoutListener () 函数中申请资源。
4) 在UI控件中申请与释放资源:利用Button直接申请与释放资源; 利用Button间接申请资源与释放资源。
5) 在判定语句中释放某资源:在onDestory () 函数里的if语句中释放资源; 在onPause () 函数里的else语句中释放资源。
不存在资源泄漏的自主开发测试集:本文实现了10个不存在资源泄漏的测试程序, 主要是通过修改前面存在资源泄漏的基准测试程序实现的 (在适当的地方加上资源释放语句)。
2.3.2 开源程序测试集的实现为了使ResLeak Bench更具有实际意义, 本文让ResLeak Bench也包含了一部分真实的Android开源应用。本文通过以下步骤为ResLeak Bench一共搜集了35个应用:
1) 确定开源程序的获取途径为著名的开源社区Javaapk以及F-Droid。
2) 通过查看应用程序的简介, 初步分析该应用是否包含相关资源操作,并下载初步认定有资源操作的应用程序的源码。
3) 分析应用程序源码, 人为判定该应用是否真实存在相关资源操作。如果有, 则继续判定是否有资源泄漏问题。
4) 下载上一步确定有资源操作的应用安装包, 并根据分析结果将该应用分类 (存在泄漏还是不存在泄漏)。
最终, 本文下载的Android应用程序主要涉及一些含有拍照录像、音乐播放、使用传感器、录音等功能的应用程序。
3 对Relda2工具的评测本章将使用ResLeak Bench对资源泄漏静态分析工具Relda2进行评测。对于ResLeak Bench里的每一个测试程序, 本文使用Relda2工具对其进行检测, 并生成对应的测试报告。然后将报告中的资源泄漏情况与预期的泄露情况进行对比, 以便能够找到Relda2分析不正确的地方。本文使用Relda2分析了测试集里所有的70个测试程序, 其中有54个测试程序的实验结果预期一致, 有16个实验结果是与预期不一致 (8个开源测试程序, 8个自主开发的测试程序)。与预期不一致的实验结果如表 1所示。
测试实验结果可以从两个方面对Relda2进行评估:基于系统回调函数的资源泄漏检测情况以及基于用户回调函数的资源泄漏检测情况。
基于系统回调函数的基准测试程序根据回调函数的不同大致可以分为四类:活动组件的生命周期回调函数、服务组件的生命周期回调函数、广播接收器组件的onReceive () 回调函数以及其他常用的系统回调函数。对于不同类型的资源泄漏情况, Relda2的实验结果如表 2所示。
从实验结果可以看出, 对于存在于组件回调函数中的资源泄漏, Relda2没有出现漏报; 对于存在于其他常用系统回调函数中的资源泄漏, Relda2虽然出现了误报, 但是误报率在可接受范围内。由此可见, Relda2能够较好地检测系统回调函数中的资源泄漏问题, 特别是存在于主要组件中的资源泄漏问题。另外, 对于资源在系统回调函数中合理使用 (没有资源泄漏) 的基准测试程序, Relda2也没有产生误报。
基于用户回调函数的基准测试集中主要是通过Button间接执行资源操作 (点击Button之后, 在Button的事件侦听函数中触发另一个方法或者启动另一个组件, 并且在该方法或者组件中执行资源操作) 和直接执行资源操作 (点击Button之后, 在Button的事件侦听函数中执行资源操作) 而实现的。相应的实验结果如表 3所示。
当本文利用一个Button进行申请资源时, 无论是通过onClick属性方式进行申请资源还是通过注册方式申请资源都能够被Relda2成功检测出资源泄漏问题。当用两个Button实现资源的申请与释放时, 对于onClick属性方式与注册方式混合或者全部都是注册方式实现Button的事件侦听方式时, Relda2同样能够成功地检测出基准测试程序的资源泄漏问题, 但是两个Button都是用onClick属性方式实现事件侦听时 (两个按钮都是通过onClick属性方式实现资源的申请与释放), Relda2并不能检测出资源泄漏的问题。所以面对Button的onClick属性, Relda2存在一定的不足。
总体来说, Relda2能够较好地分析资源泄漏的情况, 并且能够很好地检测出主要组件中的资源泄漏。但是, 对于存在于用户回调函数中的资源泄漏时, Relda2的检测还是存在一定的不足, 所以Relda2可以在用户回调函数这方面进行改善。对于静态分析工具来说, Relda2的分析结果还是比较令人满意的。
4 对RelFix工具的评测本章将使用ResLeak Bench对资源泄漏修复分析工具RelFix进行评测。在这里, 本文主要通过自主开发的基准测试集对RelFix进行测评。由于RelFix需要使用Relda2提供的漏洞报告进行修复, 因此需要选用存在资源泄漏并且能够被Relda2正确检测的基准测试程序。最终, 有12基准测试满足要求, 于是本文使用RelFix对12个基准测试程序进行了修复。对于每一个测试程序, 经过RelFix的修复之后能够生成一个新的apk安装包, 并且相关资源操作后面被插入了日志语句。这些日志语句能够帮助本文在程序动态运行时观察和追踪资源的操作。最后将被修复过后的基准测试程序安装到真机中进行验证, 通过观察资源操作的日志信息, 得到测试RelFix的实验结果如表 4所示。
从实验结果可以知道,在进行资源泄漏修复过程中修复前后的代码并没有增加多少,并且满足了工具开发者所说的控制在代码总量的4%。存在资源泄漏的基准测试程序主要分为以下类型:活动生命周期中的资源泄漏、服务生命周期中的资源泄漏、常用的回调函数中的资源泄漏。并且RelFix是在Relda2的基础上进行对Android应用程序进行资源修复, 最后的修复结果对Relda2的报告文件还是存在一定的依赖性的。接下来主要对表格中没有修复成功的基准测试程序进行分析。
对于名为on Activity Result.lanuch Mode.single Instance的基准测试程序, 它的活动在Android的配置文件中的启动模式是单例模式 (single Instance)。当Activity处于这种模式时, on Activity Result并不会被系统自动调用, 也就是说在该回调函数中释放资源是无效的。如果要进行资源修复有两种办法:一种是直接在申请资源所在的组件中释放资源;另一个种是将活动的登录模式进行转换成其他模式, 但是Rel Fix的修复结果并没有成功。最后修复过的基准测试程序无法正常运行。
在回退键中进行释放资源是许多开发者经常应用到的情况。例如点开一个网页可以进行播放音乐, 当点击回退键时就应该释放资源, 停止播放音乐。在本次实验中用onkeyDown基准测试程序进行模拟, 首先在本组件的活动的onCreate () 函数中申请资源; 其次调用用户回调函数中的onkeyDown () 函数, 并且注册的按键是回退键 (是当用户按下回退键之后会执行onkeyDown () 函数); 最后不进行释放资源操作, 确保基准测试程序存在资源泄漏问题。对于这一基准测试程序的预期结果是RelFix能够在onkeyDown () 函数中对申请的资源进行释放。如果选择在onDestory () 释放资源的话并不能真正有效地释放资源, 也就是修复失败, 因为当用户点击回退键时, 系统没有调用onDestory (), 资源没有被释放。RelFix对这一特殊情况没有修复成功, 它直接在onDestory () 函数中释放资源, 但是此时释放资源的操作是无效的。
对于名为on Location Changed () 的基准测试程序来说, 它是需要在地理位置发生变化才能执行on Location Changed () 回调函数中申请的资源操作, RelFix对该基准测试程序进行修复时, 并没有修复成功。
通过利用基准测试集对RelFix进行测试发现RelFix的修复结果基本满足了用户需求, 不过从RelFix不能修复成功的基准测试程序中可以得出RelFix可能以下几个不足:在进行资源泄漏修复时不能修复由于Android配置文件导致的资源泄漏问题; 资源泄漏修复还是需要依靠资源泄漏检测工具, 所选择的资源泄漏检测工具也成为RelFix是否能修复成功的一个因素; 对于基于回调的机制的用户回调函数中进行设计的基准测试程序不能被有效的修复。总体来说, RelFix可以从减少对其他工具的依赖性和提高对Android配置文件处理这两方面进行改善。
5 结语使用基准测试集测试是衡量被测试对象某一特性的重要方法。本文构建了一套针对于Android程序资源泄漏问题的基准测试集ResLeak Bench,它一共包含70个基准测试测序, 主要由自主开发和开源程序两个方面构成。本文利用这70个基准测试程序对资源泄漏检测工具Relda2和修复工具RelFix进行测试。无论是Relda2还是RelFix, 都被发现出了一些问题, 这说明ResLeak Bench有着不错的实用性, 能够检测出被测试的对象存在的问题。另外, 对Relda2的测试结果表明, Relda2能够比较理想地检测出在Activity组件中存在的资源泄漏问题, 但是面对使用Button进行相关资源操作的测试程序, 它的检测准确率还有待提高。对RelFix的测试结果表明, RelFix能够比较理想地实现资源泄漏的修复, 并且修复过后的Android应用程序的原有功能没有受到影响。但是, 它对资源泄漏检测的工具具有一定依赖性, 资源泄漏检测工具的有效性也会对它的修复结果产生影响。
此外, ResLeak Bench不仅能够对本文使用的测试对象Relda2和RelFix进行测评, 还可以对其他关于Android应用软件资源泄漏地检测和修复的工具进行测评。对于资源相关工具的使用者来说, ResLeak Bench能够为提供选择策略。用户可以利用本文构造出的基准测试集进行对多个工具进行验证, 通过对实验结果的比较, 得出比较符合他们要求的工具。对于资源工具的开发者来说, 他们可以利用ResLeak Bench对工具进行改进。
[1] | 杨娇. 基于Android平台手机通讯录的设计与实现[D]. 西安. 西安电子科技大学, 2013. ( YANG J. Design and implementation for a mobile phone contacts on Android platform[D]. Xi'an: Xidian University, 2013. ) |
[2] | IDC. Smartphone OS market share, 2016 Q1[EB/OL].[2016-06-01]. http://www.idc.com/promo/smartphone-market-share/os; jsessionid=B13EFFFA3D9B1C2CB357D32DBF4204BA. |
[3] | WU T, LIU J, XU Z, et al. light-weight, inter-procedural and callback-aware resource leak detection for Android apps[J]. IEEE Transactions on Software Engineering, 2016, 42 (11) : 1054-1076. doi: 10.1109/TSE.2016.2547385 |
[4] | LIU J, WU T, YAN J, et al. Fixing resource leaks in Android apps with light-weight static analysis and low-overhead instrumentation[C]//Proceedings of the 2016 IEEE 27th International Symposium on Software Reliability Engineering. Piscataway, NJ: IEEE, 2016: 342-352. |
[5] | Flyingstarwb. 目前高性能计算基准测试程序分类[EB/OL]. [2016-04-01]. http://blog.csdn.net/flyingstarwb/article/details/4225913/. |
[6] | 王良. Benchmark性能测试综述[J]. 计算机工程与应用, 2006, 42 (15) : 45-48. ( WANG L. Summa of benchmark performance test[J]. Computer Engineering and Applications, 2006, 42 (15) : 45-48. ) |
[7] | GUO C, ZHANG J, YAN J, et al. Characterizing and detecting resource leaks in Android applications[C]//Proceedings of the 2013 IEEE/ACM 28th International Conference on Automated Software Engineering. Piscataway, NJ: IEEE, 2013: 389-398. |
[8] | ARZT S, RASTHOFER S, FRITZ C, et al. FlowDroid: precise context, flow, field, object-sensitive and lifecycle-aware taint analysis for Android apps[J]. ACM SIGPLAN Notices, 2014, 49 (6) : 259-269. doi: 10.1145/2666356 |
[9] | Google. App components[EB/OL].[2016-04-01]. https://developer.android.com/guide/components/index.html. |
[10] | 王铬. 回调函数在软件设计中的应用[J]. 河南教育学院学报 (自然科学版), 2003, 12 (3) : 44-46. ( WANG G. The application of callback function in software design[J]. Journal of Henan Education Institute (Natural Science Edition), 2003, 12 (3) : 44-46. ) |
[11] | Google. Activity lifecycle[EB/OL].[2016-04-01]. https://developer.android.com/training/basics/activity-lifecycle/index.html. |
[12] | Google. Dalvik bytecode[EB/OL].[2016-04-01]. https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html. |
[13] | TUMBLESON C, WISNIEWSKI R. A tool for reverse engineering Android APK files[EB/OL].[2016-04-01]. https://ibotpeaches.github.io/Apktool/. |
[14] | 姚尚朗, 靳岩. Android开发入门与实战[M]. 北京: 人民邮电出版社, 2009 : 57 -136. ( YAO S L, JIN Y. Introduction and Practice of Android Development[M]. Beijing: Posts & Telecom Press, 2009 : 57 -136. ) |
[15] | ZHANG J. Resourcetable[EB/OL].[2016-04-01]. http://lcs.ios.ac.cn/~zj/ResourceTable.html. |