计算来自classes.dex的api调用次数

时间:2015-05-06 08:59:46

标签: android reverse-engineering dalvik

我想知道是否可以通过解析classes.dex文件来计算调用API的次数。我知道如何调用所有API,但想知道是否有办法在不运行应用程序的情况下获取api被调用的次数,只需解析classes.dex即可。这些信息是否存储在dex文件中?

我快速查看了dex文件格式,但无法找到该信息。

例如:如果在class1,class2和class3中使用substring()一次,我应该能够获得子串被调用3次的信息。

1 个答案:

答案 0 :(得分:2)

通过解析代码无法判断API调用的次数。例如,foo()被调用了多少次?:

public static void bar(int x) {
    for ( int i = 0; i < x; i++ ) {
        foo();
    }
}

如果您只看一下源代码,答案是一次,但如果您分析语义,答案是x次。

如果您只想知道源代码中存在API调用的次数,您可以轻松搞定。

  1. 使用baksmali dex文件获取Smali代码。

  2. Grep(或确认)您想要的API调用的Smali。 SmsManager.sendTextMessage()的示例正则表达式为:

    "invoke[^,]+, Landroid/telephony/SmsManager;->sendTextMessage\(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;\)V"
    
  3. 计算找到该行的次数。类似的东西:

    grep api_call_pattern . | wc -l
    
  4. 这只能被视为实际API调用计数的粗略代理。如果你想要更准确的东西,你将不得不进行符号分析。不幸的是,没有一个交钥匙的解决方案,你可以使用我所知道的。