我有一个apk的源代码,包含几百个类。我需要在源代码中获取所有Android SDK方法调用的列表。我想过开发一个python脚本来解析所有的源代码,但似乎有太多的规则要定义。我觉得它太复杂了。
有没有人有想法?或者是否有现成的工具可以做到这一点?
例如,如果代码如下所示:
class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState.containsKey("toto")) {
setContentView(R.layout.mylayout);
this.uselessMethod();
}
}
public int uselessMethod() {
new Thread();
}
}
我想得到这样的东西:
感谢。
答案 0 :(得分:1)
查看Doxygen以获取所有方法。您可能希望使用EXTRACT_ALL http://www.doxygen.nl/manual/starting.html#extract_all,它将假设您的来源中的所有内容都应记录在案(如第三方方法)。
我在记忆中工作,只是在这里尝试过。我认为Doxygen使用其他选项来做到这一点(参见:how to get doxygen to produce call & caller graphs for c functions)。使用Graphviz / dot时,Doxygen会生成一个协作图,看起来它不会提取出你想要的东西,我认为它列出了所有方法调用,包括那些不在你的方法调用中源树。
答案 1 :(得分:1)
这个为我工作:
static void printMethods(Class cls)
{
if(cls!=null){
System.out.println();
System.out.println("Printing Methods of "+cls.getName()+":");
System.out.println();
for(Method m:cls.getDeclaredMethods()){
System.out.println(m.toString());
}
}
}
如何命名:
printMethods(Class_Goes_Here);
示例:
printMethods(java.lang.Boolean.class);
结果:
Printing Methods of java.lang.Boolean:
public static int java.lang.Boolean.compare(boolean,boolean)
public static boolean java.lang.Boolean.getBoolean(java.lang.String)
public static int java.lang.Boolean.hashCode(boolean)
public static boolean java.lang.Boolean.logicalAnd(boolean,boolean)
public static boolean java.lang.Boolean.logicalOr(boolean,boolean)
public static boolean java.lang.Boolean.logicalXor(boolean,boolean)
public static boolean java.lang.Boolean.parseBoolean(java.lang.String)
public static java.lang.String java.lang.Boolean.toString(boolean)
public static java.lang.Boolean java.lang.Boolean.valueOf(java.lang.String)
public static java.lang.Boolean java.lang.Boolean.valueOf(boolean)
public boolean java.lang.Boolean.booleanValue()
public int java.lang.Boolean.compareTo(java.lang.Boolean)
public int java.lang.Boolean.compareTo(java.lang.Object)
public boolean java.lang.Boolean.equals(java.lang.Object)
public int java.lang.Boolean.hashCode()
public java.lang.String java.lang.Boolean.toString()
让我知道您是否还有其他疑问或疑问
With Love By❤️D❤️
答案 2 :(得分:0)
在我上次回答这个问题 7 个月之后:
当我再次仔细阅读您的问题时,我发现您需要的是 Stacktrace。我为您创建了一种方法,让您可以轻松完成此操作,即一个简单的类。
StacktraceUtils 类:
public static class StackTraceUtils
{
public static ArrayList<StackTraceElement> getStackTrace(Thread thread)
{
ArrayList<StackTraceElement> l=new ArrayList<>();
Thread k=thread;
{
StackTraceElement[] v=k.getStackTrace();
for (int i=(v.length - 1);i >= 0;i--)
{
StackTraceElement ste=v[i];
if (!(StackTraceUtils.class.getName().equals(ste.getClassName())))
{
l.add(0, ste);
}
else
{
break;
}
}
}
return l;
}
public static String getStackTraceString(Thread thread)
{
String p="";
Thread k=thread;
p += ((k.getName().equals("main") ?"[MAIN]": k.getName()) + " [" + k.getId() + "]" + (Thread.currentThread().getId() == k.getId() ?" [CURRENT]": "") + " : ");
for (StackTraceElement ste:StackTraceUtils.getStackTrace(k))
{
p += "\n\t->\t" + ste;
}
return p.toString();
}
}
您可以打印 Stacktrace ljke:
System.out.println(StackTraceUtils.getStackTraceString(Thread.currentThread()));
结果:
Thread-21 [10892] [CURRENT] :
-> Main.main(Main.java:59)
-> Main.main(Main.java:17)
-> java.lang.reflect.Method.invoke(Native Method)
-> java.lang.Thread.run(Thread.java:764)
...
请不要忘记给我点赞,我几乎不需要投票来帮助更多人。并且不要忘记做出回答,如果它是......谢谢
——DiLDoST