我想知道是否可以通过解析classes.dex文件来计算调用API的次数。我知道如何调用所有API,但想知道是否有办法在不运行应用程序的情况下获取api被调用的次数,只需解析classes.dex
即可。这些信息是否存储在dex文件中?
我快速查看了dex文件格式,但无法找到该信息。
例如:如果在class1,class2和class3中使用substring()
一次,我应该能够获得子串被调用3次的信息。
答案 0 :(得分:2)
通过解析代码无法判断API调用的次数。例如,foo()
被调用了多少次?:
public static void bar(int x) {
for ( int i = 0; i < x; i++ ) {
foo();
}
}
如果您只看一下源代码,答案是一次,但如果您分析语义,答案是x
次。
如果您只想知道源代码中存在API调用的次数,您可以轻松搞定。
使用baksmali dex文件获取Smali代码。
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"
计算找到该行的次数。类似的东西:
grep api_call_pattern . | wc -l
这只能被视为实际API调用计数的粗略代理。如果你想要更准确的东西,你将不得不进行符号分析。不幸的是,没有一个交钥匙的解决方案,你可以使用我所知道的。