CN107168875B - 一种基于安卓应用多入口特性的Activity构件泄露检测方法 - Google Patents
一种基于安卓应用多入口特性的Activity构件泄露检测方法 Download PDFInfo
- Publication number
- CN107168875B CN107168875B CN201710338109.XA CN201710338109A CN107168875B CN 107168875 B CN107168875 B CN 107168875B CN 201710338109 A CN201710338109 A CN 201710338109A CN 107168875 B CN107168875 B CN 107168875B
- Authority
- CN
- China
- Prior art keywords
- application
- activity
- obj
- android
- destroyed
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Storage Device Security (AREA)
Abstract
本发明提供了一种基于安卓应用多入口特性来快速检测安卓应用潜在的Activity构件泄露的方法。其特征在于,包括以下步骤:步骤1、利用安卓应用多入口特性,逐个启动应用所包含的各个Activity;步骤2、获取应用堆栈内存;步骤3、分析应用堆栈内存,鉴别泄露的Activity构件。本发明的能准确的检测安卓应用潜在的Activity构件泄露风险,具有全自动、效率高、可重现等特征。
Description
技术领域
本发明专利涉及安卓软件应用,内存泄露检测领域,尤其涉及一种基于安卓应用多入口特性的Activity泄露检测方法。
背景技术
近年来,随着移动设备的普及,基于移动设备的安卓应用数量不断增加。然而,由于安卓复杂的生命周期管理机制,开发安卓应用极容易引入泄露Activity等构件的可能性。这些潜在的应用构件的泄露,会不断消耗系统内存等资源,导致应用卡顿甚至崩溃,极大的影响用户体验和商家品牌形象。为此,如何自动化高效的检测应用潜在的Activity构件的泄露,有着极大的意义。然而,现有检测安卓应用Activity泄露的工作要么需要大量的人工介入,要么难以重现泄露场景。为此,本发明旨在利用安卓应用多入口特性来快速检测安卓应用潜在的Activity构件的泄露现象。
发明内容
本发明主要针对现有工作的不足,提出了一种基于安卓应用多入口特性来快速检测安卓应用潜在的Activity构件泄露的方法。
该方法基于以下现实:安卓应用是多入口的,每个Activity都可独立的被启动;当“开发者选项”中“不保留活动”选项被选中,则应用在运行过程中所有不可见的Activity会被立即自动销毁;Activity构件都提供了一系列刻画其状态的域(Field),通过对这些域(Field)值的比较,可以判断实例是否已被销毁;不能被GC回收的对象实例,一定存在通往GC root的不包含SoftReference、WeakReference、PhantomReference、FinalizerReference以及Finalizer类型对象的路径。
为了实现上述发明目的,本发明采用的技术方案为:
一、本发明的一种基于安卓应用多入口特性的Activity构件泄露检测方法,主要过程包括:
a)在测试机(安卓实体机或虚拟机)的“开发者选项”中打开“不保留活动”,使得一旦离开一个Activity则立刻自动销毁该Activity;
b)安装待检测应用;
c)逐个启动并销毁待测试安卓应用所包含的所有Activity;
d)获取应用堆栈内存信息;
e)分析获取得到的应用堆栈内存,检测泄露的应用构件。
二、本方案首先要求能够自动的启动并销毁待测试安卓应用所包含的所有Activity,这一过程主要包括以下步骤:
a)利用逆向工程工具Apktool对待检测安卓应用.apk文件进行反编译,获取应用安卓Menifest.xml描述文件,并通过分析安卓Menifest.xml文件来进一步获取应用所包含的所有Activity的列表,记为LActivity;
b)逐个启动LActivity中的每一个Activity。此处,主要是利用安卓自带的“amstart”指令逐个启动待检测应用的所有Activity。需注意的是,“am start”命令需带参数“–activity-clear-task”,以确保每个task栈中最多只有一个Activity,否则栈底的Activity将不能被多次创建并销毁。由于“不保留活动”开发者选项的勾选以及“–activity-clear-task”参数的使用,使得每当一个新的Activity被启动时,该应用原先启动的Activity将会自动销毁。每个Activity可以启动k次(k由用户指定)。
三、为了检测应用构件的泄露,我们需要获取应用在上述反复启动应用不同Activity的过程中内存堆栈的内容,该过程主要完成以下功能:
a)若在逐个启动并销毁待测试安卓应用所包含的所有Activity的过程中,应用出现异常并崩溃,则自动转储应用当前的堆栈内容,并关闭应用;
b)当逐个启动并销毁待测试安卓应用所包含的所有Activity的过程完毕之后,自动转储应用当前的堆栈内容。
四、最终,本方案需要对转储的应用堆栈文件(一系列.hprof文件)进行分析,以最终确定泄露的应用构件,该过程主要包括以下步骤:
a)针对一个转储的应用堆栈.hprof文件,首先获取其中所包含的所有Activity对象实例集合,用SA表示;
b)其次,针对所获得的SA中的每一个对象实例obj进行逐个鉴别,判定obj是否已经被销毁,若obj被判定为已销毁,则将其从SA中删除。
c)针对处理后得到的SA中的剩余对象实例obj,进一步判定其是否是泄露的,若是则将其从SA中删除。
d)返回SA,即获得所有泄露的Activity
其中,判定一个对象实例obj是否被销毁的主要方法如下:安卓为每一个Activity实例维护了一个名为mDestroyed的域来指明该实例是否已经被销毁(destroyed)。所以,若obj∈SA,则直接依据obj的mDestroyed域的值来判断obj是否已经被销毁(obj.mDestroyed=true则表示obj已经被销毁);
而要进一步判定一个被销毁的对象实例obj是否泄露,则需要完成以下步骤:
a)获取对象obj到达所有GC root的路径所构成的集合,记为LP;
b)从LP中去除不影响obj是否能被GC回收的路径——即所有包含java.lang.ref.SoftReference、java.lang.ref.WeakReference、java.lang.ref.PhantomReference、java.lang.ref.FinalizerReference以及java.lang.ref.Finalizer类型对象的路径;
c)若最后LP为空,则obj不是泄露的;否则,obj则是泄露的。
本发明能够自动化地实现以下功能:逐个启动并销毁待检测安卓应用的各个Activity,收集安卓应用堆栈内容,并通过进一步分析所转储的应用堆栈内容,鉴别泄露Activity构件实例。相对现有其他工作而言,本发明具有以下有益效果:
1)自动化;
2)高效率;
3)可重现。
附图说明
图1为本发明实施例的基于安卓应用多入口特性的Activity泄露检测方法的整体流程框架。
图2为本发明实施例的自动启动、销毁应用Activity并转储应用堆栈的流程图。
图3为本发明实施例的分析堆栈文件识别泄露Activity的流程。
具体实施方式
下面结合本发明实例中的附图,对本发明实施例中的技术方案进行清楚、完整地的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明的保护范围。
1.主要过程
图1所示为本发明提供的一种基于安卓应用多入口特性的Activity泄露检测方法的整体流程框架图,图1中:
对于待检测的一个安卓应用,我们首先将设备的开发者选项的“不保留活动”这一选项打开,以迫使系统及时自动销毁所有用户不可见的活动(Activity);然后,安装待检测应用;再然后,则尝试逐个启动、销毁待检测应用所包含的Activity并转储应用运行时刻堆栈;最后,利用内存分析工具分析转储的堆栈文件,以确定泄露的Activity实例。
图2所示为本发明中自动启动、销毁应用Activity并转储应用堆栈的流程图。首先,利用逆向工程工具反编译待检测应用(Apk文件),获取应用的AndroidMenifest.xml文件,并进一步分析该文件获取应用所包含的所有Activity类名,存放在LActivity列表中;接下来,针对LActivity中的每一个Activity类,尝试利用“am start-n”命令(带参数“—activity-clear-task”)来自动创建该类Activity实例k次。由于“不保留活动”选项的打开以及“—activity-clear-task”参数的使用,导致新的Activity实例一旦被创建并显示,则原先所显示的Activity实例则会自动的尝试销毁。若在上述过程中,应用出错并崩溃,则自动转储应用当前的堆栈内容。当LActivity中的所有Activity类都完成创建、销毁实例K次之后,最后再转储应用的堆栈内容。
图3所示为本发明中自动化分析堆栈文件(即.hprof文件),并进一步鉴别泄露Activity实例的流程。针对每一个待分析的堆栈文件(即.hprof文件),首先找出其中所包含的所有的Activity实例,存放在列表SA之中;接下来,遍历SA的每一个实例obj,若obj.mDestroyed=false,则将obj从SA中删除,从而SA中仅包含obj.mDestroyed=true的Activity实例,即被销毁了的实例;
再然后,则要逐个判断剩余在SA的每一个实例obj是否真是泄露的,而这是通过对obj到达所有GC root的路径进行分析而得到的。简单而言,首先需要获取obj到达所有GCroot的路径的集合,记为LP;逐一处理LP中的每一条路径p,若路径p包含任何java.lang.ref.SoftReference、java.lang.ref.WeakReference、java.lang.ref.PhantomReference、java.lang.ref.FinalizerReference以及java.lang.ref.Finalizer类型对象,则将路径p从LP中删除。当LP中所有路径都处理完毕,若LP为空,则判定实例obj不是泄露的实例,而是有可能会被GC回收的;否则,LP不为空,则实例obj仍在某些地方被引用而不能被GC回收,从而判定实例obj为泄露的实例。
以上的实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。本发明未涉及的技术均可通过现有的技术加以实现。
Claims (5)
1.一种基于安卓应用多入口特性的Activity构件泄露检测方法,其特征在于,包括以下步骤:
步骤一、在测试机,安卓实体机或虚拟机,的“开发者选项”中打开“不保留活动”,使得一旦离开一个Activity则立刻自动销毁该Activity;
步骤二、安装待检测应用;
步骤三、逐个启动并销毁待测试安卓应用所包含的所有Activity;
步骤三具体包括以下步骤:
步骤3.1、利用逆向工程工具对待检测安卓应用.apk文件进行反编译,获取应用安卓Menifest.xml描述文件,进一步获取应用所包含的Activity列表;
步骤3.2、利用安卓自带的“am start”指令,带参数“-activity-clear-task”,确保每个task栈中最多只有一个Activity,否则栈底的Activity将不能被多次创建并销毁,逐个启动/销毁待检测应用的所有Activity,每个Activity启动k次,k由用户指定;
步骤四、获取应用堆栈内存信息;
步骤五、分析获取得到的应用堆栈内存,检测泄露的应用构件。
2.根据权利要求1所述的基于安卓应用多入口特性的Activity构件泄露检测方法,其特征在于,其中的步骤四:
步骤4.1、若所述逐个启动并销毁待测试安卓应用所包含的所有Activity的过程中,应用出现异常并崩溃,则自动转储应用当前的堆栈内容;
步骤4.2、当所述逐个启动并销毁待测试安卓应用所包含的所有Activity的过程完毕之后,自动转储应用当前的堆栈内容。
3.根据权利要求1所述的基于安卓应用多入口特性的Activity构件泄露检测方法,其特征在于,其中的步骤五具体包括以下步骤:
步骤5.1、针对一个转储的应用堆栈.hprof文件,首先获取其中所包含的所有Activity对象实例,分别用SA表示;
步骤5.2、针对步骤5.1所获得的每一个对象实例obj进行逐个鉴别,判定obj是否已经被销毁,若obj被判定为未销毁,则将其从SA中删除;
步骤5.3、针对步骤5.2处理后得到的SA中的剩余对象实例obj,进一步判定其是否是泄露的,若否则将其从SA中删除;
步骤5.4、返回SA,即获得所有泄露的Activity。
4.根据权利要求3所述的基于安卓应用多入口特性的Activity构件泄露检测方法,其特征在于:所述步骤5.2判定一个对象实例obj是否被销毁,若obj∈SA,则直接依据obj的mDestroyed域的值来判断obj是否已经被销毁,obj.mDestroyed=true则表示obj已经被销毁。
5.跟据权利要求3所述的基于安卓应用多入口特性的Activity构件泄露检测方法,其特征在于:所述步骤5.3判定一个对象实例obj是否泄露,具体包括以下步骤:
步骤5.3.1、获取对象obj到达所有GC root的路径,记为LP;
步骤5.3.2、从LP中去除所有包含java.lang.ref.SoftReference、java.lang.ref.WeakReference、java.lang.ref.PhantomReference、java.lang.ref.FinalizerReference以及java.lang.ref.Finalizer类型对象的路径;
步骤5.3.3、若LP为空,则obj不是泄露的;否则,obj则是泄露的。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710338109.XA CN107168875B (zh) | 2017-05-15 | 2017-05-15 | 一种基于安卓应用多入口特性的Activity构件泄露检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710338109.XA CN107168875B (zh) | 2017-05-15 | 2017-05-15 | 一种基于安卓应用多入口特性的Activity构件泄露检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107168875A CN107168875A (zh) | 2017-09-15 |
CN107168875B true CN107168875B (zh) | 2020-07-03 |
Family
ID=59816029
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710338109.XA Active CN107168875B (zh) | 2017-05-15 | 2017-05-15 | 一种基于安卓应用多入口特性的Activity构件泄露检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107168875B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107797901A (zh) * | 2017-10-25 | 2018-03-13 | 四川长虹电器股份有限公司 | 一种堆栈分析以及邮件实时报警的实现方法 |
CN111897726B (zh) * | 2020-07-27 | 2024-01-19 | Tcl通讯(宁波)有限公司 | 异常定位方法、装置、存储介质及移动终端 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106598572A (zh) * | 2016-11-17 | 2017-04-26 | 武汉斗鱼网络科技有限公司 | 一种应用的退出方法及装置 |
CN106599688A (zh) * | 2016-12-08 | 2017-04-26 | 西安电子科技大学 | 一种基于应用类别的安卓恶意软件检测方法 |
CN106649105A (zh) * | 2016-12-08 | 2017-05-10 | 武汉斗鱼网络科技有限公司 | 一种内存泄漏的检测方法和装置 |
-
2017
- 2017-05-15 CN CN201710338109.XA patent/CN107168875B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106598572A (zh) * | 2016-11-17 | 2017-04-26 | 武汉斗鱼网络科技有限公司 | 一种应用的退出方法及装置 |
CN106599688A (zh) * | 2016-12-08 | 2017-04-26 | 西安电子科技大学 | 一种基于应用类别的安卓恶意软件检测方法 |
CN106649105A (zh) * | 2016-12-08 | 2017-05-10 | 武汉斗鱼网络科技有限公司 | 一种内存泄漏的检测方法和装置 |
Non-Patent Citations (1)
Title |
---|
移动应用程序内存泄露机制分析与检测方案设计;朱洪军 等;《计算机工程与应用》;20161231;第52卷(第17期);第29-35,67页 * |
Also Published As
Publication number | Publication date |
---|---|
CN107168875A (zh) | 2017-09-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107590388B (zh) | 恶意代码检测方法和装置 | |
US10235520B2 (en) | System and method for analyzing patch file | |
CN108763951B (zh) | 一种数据的保护方法及装置 | |
CN112733150B (zh) | 一种基于脆弱性分析的固件未知漏洞检测方法 | |
US12013929B2 (en) | Stack pivot exploit detection and mitigation | |
CN108197476B (zh) | 一种智能终端设备的漏洞检测方法及装置 | |
CN111832026B (zh) | 一种漏洞利用定位方法、系统、装置及介质 | |
CN113946825B (zh) | 一种内存马处理方法及系统 | |
CN109388946A (zh) | 恶意进程检测方法、装置、电子设备及存储介质 | |
CN107168875B (zh) | 一种基于安卓应用多入口特性的Activity构件泄露检测方法 | |
CN107590013B (zh) | 一种检测Android应用Service构件泄露的高效方法 | |
CN111859381A (zh) | 一种文件检测方法、装置、设备及介质 | |
CN112632538A (zh) | 一种基于混合特征的安卓恶意软件检测方法及系统 | |
US8930420B2 (en) | Orphan object tracking for objects having acquire-release semantics | |
US20190205526A1 (en) | Binary image stack cookie protection | |
Malik | Android system call analysis for malicious application detection | |
KR101530530B1 (ko) | 모바일단말의 악성 프로세스 실행 탐지 시스템 및 방법 | |
Gattal et al. | Exploiting the progress of OO refactoring tools with Android code smells: RAndroid, a plugin for Android studio | |
CN114048488B (zh) | 漏洞检测方法及系统 | |
US11314855B2 (en) | Detecting stack pivots using stack artifact verification | |
US11886589B2 (en) | Process wrapping method for evading anti-analysis of native codes, recording medium and device for performing the method | |
CN112230935B (zh) | 一种应用内的隐私风险检测方法、装置以及设备 | |
CN109426601B (zh) | 一种对程序进行无状态检测的方法和装置 | |
LeDoux et al. | Improved malware classification through sensor fusion using disjoint union | |
CN117077133A (zh) | 一种应对应用变脸行为的安卓恶意软件检测方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |