【问题标题】:How can I count method calls inside APK? (using .smali format)如何计算 APK 中的方法调用? (使用 .smali 格式)
【发布时间】:2017-01-24 13:43:02
【问题描述】:
我正在尝试开发一种工具,该工具基本上可以分析 Android 应用 APK 并计算对特定 API 方法的调用次数(例如,android.app.AlarmManager.set())
1.您推荐什么方法?
到目前为止,我使用了APKTool,现在我拥有.smali 文件。
但是,对于同一个 java 源,我可以有多个文件:
ExportAsyncTask$1.smali
ExportAsyncTask$2.smali
ExportAsyncTask$3.smali
ExportAsyncTask$4.smali
2。这些多个文件是什么意思?
3.生成的.smali 文件还包括我想省略分析的外部库。我该怎么做?
【问题讨论】:
标签:
java
android
apk
smali
apktool
【解决方案1】:
1.您推荐什么方法?
是的,Apktool 可用于您的任务。 APK 中的每个java 类将由代表包的目录树中的.smali 文件表示。 Smali - 是 Android 虚拟机语言。该语言比 Java 简单得多,因此更易于分析。在您的情况下,您应该搜索 invoke 操作码和 Landroid/app/AlarmManager;->set 字符串。如果您在 Linux 中工作,您可以例如 grep 并计算它们。在 Windows 中,您有像 Notepad++ 这样的文本编辑器,允许在多个文件中进行文本搜索。
2。这些多个文件是什么意思?
在Java中有内部类和隐式内部类。前者将出现在OutherClass$InnerClass.smali 中,而后者没有自己的名字,得到数字,如@987654327@。你有时甚至会得到更深的层次,比如a$b$c$1.smali。
3.生成的 .smali 文件还包括我想省略分析的外部库。我该怎么做?
你没有精确的方法来做到这一点。但一般来说,当您查看许多示例的包/目录树时,您通常会掌握其中的模式。例如。通常应用程序代码在com.* 包中,android.*、org.* 和uk.* 包含库。经过这样的检查后,您只需从搜索中排除这些目录。