一、前言
在提升移动端稳定性评估效果的过程中,通过设定控制少数几个Activity运行Monkey测试,可以显著提升发现问题的效率。然而,随之而来的问题是,我们应如何获取APP的全局Activity列表呢?针对这一问题,本文将简要介绍我所进行的调研及实现过程,并最终利用Python脚本实现了相应的功能。
二、通过什么方式获取Activity
1. adb
ADB是我们在日常工作中频繁使用的工具,同时也是最为简便高效的。借助ADB指令,我们能够查看到手机中应用的包名及Activity详情。一些常用的命令包括:
鉴于我们的具体需求,在调整配置参数的过程中开yun体育app官网网页登录入口,我们不太可能首先通过adb连接手机来搜寻必要的信息。
2. appium
在appium的配置界面,只需设定APK文件的存放路径,即可自动解析并获取相应的应用包名和活动信息。若在以往需要手动临时查阅某些信息时,这种方法无疑是一种相当便捷的选择。
3. 查看源码
查看源码是最直接的方式,有源码,就没有什么看不了的秘密了。
然而,并非每个人都能够获得源代码的访问权限。此外,在测试SDK与第三方应用结合后的稳定性时,我们也不可能向第三方应用提出,请允许我们查阅您的源代码。
4.Android APK逆向解析
利用工具对应用市场的应用程序进行逆向分析或解包,可以从中提取出关键信息,例如APK文件中的清单文件AndroidManifest.xml所包含的package、versionName以及versionCode等数据。众所周知,apk文件中的AndroidManifest.xml文件已经过编译,呈现为二进制形式。若直接使用编辑器打开,将呈现乱码。唯有通过APP的反编译操作,才能获得原始的清单文件AndroidManifest.xml,进而对其进行解析,从而方便地获取包名以及所有activity等信息。

三、确定获取Activity的思路和技术方案
经过对目标和策略的深入剖析,我们明确了核心策略:即对任何市场中的APP进行APK文件分析,确保能够提取出应用的基本资料。为此,我们可以借助脚本和封装工具对AndroidManifest.xml原始清单文件进行反编译处理,从而实现这一目标。然而,随之而来的问题是:目前市面上有哪些优秀的反编译和逆向分析工具可供选择呢?apktool是一款在Android领域被广泛使用的开源反编译工具,它能够直接对Android的APK文件进行反编译操作,并且还可以在反编译得到的目录基础上进行回编,从而生成新的APK文件。另外,jadx这款工具能够将dex文件和apk文件反编译成易于阅读的格式,主要处理Java代码和AndroidManifest.xml文件的查看。同时推出了Python的绑定工具PyJadx,这使得在编写Python脚本对目标APK进行反编译时更为便捷。3.ClassyShark:ClassyShark是谷歌官方专为Android开发者设计的独立二进制文件检查工具,其权威性和功能强大性不言而喻,而且它还得到了良好的维护和持续更新。其GitHub页面可访问于:https://github.com/google/android-classyshark,该工具具备对多种文件格式的解析能力kaiyun.ccm,涵盖了库文件,如.dex、.aar、.so,以及可执行文件,例如.apk、.jar、.class,并且支持所有Android二进制XML文件,包括AndroidManifest、resources、layouts等。在aaptAndroid SDK内置的aapt工具中,我们可以用它来分析APK文件,这其中包括了清单文件AndroidManifest.xml所包含的详细信息。该工具的功能相当强大,其子命令和参数种类繁多。其功能不受图形用户界面的限制,能够被封装入脚本之中,进而用于开发自动化工具,以解析并执行相关任务,这对于搭建自动化测试体系或自动化打包流程等场景尤为有益。AXMLParser的作用是专门解析APK文件中的二进制AndroidManifest.xml文件,目的是获取与原始项目中AndroidManifest.xml文件内容完全相同的可读性强的xml文档。轻量级设计,适合那些仅需浏览,如AndroidManifest.xml文件中记载的细节,诸如应用名称、版本编号与版本名称,以及启动活动等资料。
四、代码如何实现Activity的获取
上述方法均能满足我们的需求,鉴于本次任务仅需对AndroidManifest.xml文件进行信息查阅与处理,因此我们选用轻量级的AXMLParser来执行AndroidManifest.xml的反编译操作,从而实现对AndroidManifest.xml的深入解析云开·全站体育app登录,进而获取应用中所有的Activity信息。
1.AXMLPrint的python实现
class AXMLPrinter(object):
def __init__(self, raw_buff):
我创建了AXML解析器对象,该对象由原始缓冲区数据raw_buff初始化。
self.xmlns = False
self.buff = u''
只要持续满足条件且self.axml处于有效状态,循环将不断执行。
_type = self.axml.next()
if _type ==START_DOCUMENT:
self.buff +=u'\n'
elif _type == START_TAG:
self.buff += u'<'+ self.getPrefix(self.axml.getPrefix()) + self.axml.getName() + u'\n'
self.buff += self.axml.getXMLNS()
for i in range(0,self.axml.getAttributeCount()):
self.buff +="%s%s=\"%s\"\n" % (self.getPrefix(
self.axml.getAttributePrefix(i)), self.axml.getAttributeName(i),
self._escape(self.getAttributeValue(i)))
self.buff +=u'>\n'
elif _type == END_TAG:
self.buff +="%s%s>将前缀与AXML名称相结合,生成用于标识的字符串,具体为:self.getPrefix(self.axml.getPrefix()),self.axml.getName()。
elif _type == TEXT:
self.buff += "%s\n" ,其中 self.axml.getText() 方法返回的内容被添加到缓冲区中。
elif _type ==END_DOCUMENT:
break
解析后的AndroidManifest.xml如下所示

2.应用activity获取的python实现
def get_activities(self):
l = []
for i in self.xml:
遍历self.xml中的第i个元素,针对其下所有名为"activity"的子元素,逐一执行:
赋予值之前,先经过本对象的格式化值处理函数进行处理。
l.append(str(value))
return l
Activity获取结果如下所示:


