【问题标题】:How can I list all classes and methods from Android SDK used in my source code?如何列出源代码中使用的 Android SDK 中的所有类和方法?
【发布时间】:2013-04-23 06:05:15
【问题描述】:

我有一个 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();
    }
}

我想得到这样的东西:

  • java.lang.Thread#()
  • android.app.Activity#onCreate(Bundle) 无效
  • android.app.Activity#setContentView(int) 无效
  • android.os.Bundle#containsKey(String) 布尔值

谢谢。

【问题讨论】:

标签: java android


【解决方案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 确实会生成一个协作图,但它看起来不会提取出您正在寻找的内容,我认为这是列出所有方法调用,包括那些不在您的源代码树。

【讨论】:

  • Doxygen 可以生成文档,并列出我的代码中定义的类和方法。但是它可以提取我的代码使用的第三方方法(如我上面的示例中所定义)吗?
  • 我刚刚使用 EXTRACT_ALL 测试了 Doxygen:它不会提取从我的代码中调用的 SDK 方法。
【解决方案2】:

这个对我有用:

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()

如果您有任何其他问题或疑问,请告诉我

— DiLDoST

【讨论】:

    【解决方案3】:

    在我最后一次回答这个问题 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:

    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

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 1970-01-01
      • 2012-02-08
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      相关资源
      最近更新 更多