最终可执行文件中是否包含未引用的方法?

时间:2012-06-29 13:50:16

标签: java android eclipse jar

在不运行ProGuard的情况下在Android上构建和部署可执行文件时,最终可执行文件中是否包含未引用的方法?

是否还包括来自外部库罐的未引用方法?

这种行为是否依赖于Java编译器,或dex是否进行了所有修剪(如果有的话)?

1 个答案:

答案 0 :(得分:5)

我测试了一个简单的类(所有这些方法都没有引用):

public class Test
{
    private void privateMethod()
    {
        System.out.println("private");
    }

    protected void protectedMethod()
    {
        System.out.println("protected");
    }

    public void publicMethod()
    {
        System.out.println("public");
    }

    void method()
    {
        System.out.println("method");
    }
}

我编译了APK,提取了Test.class并对其进行了反编译(使用javap -c)。我得到了以下结果。我还用jar而不是APK测试,结果完全一样。我用的是Java 1.6.0_29。

  protected void protectedMethod();
    Code:
       0: getstatic     #44             // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #47             // String protected
       5: invokevirtual #46             // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return        

  public void publicMethod();
    Code:
       0: getstatic     #44             // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #48             // String public
       5: invokevirtual #46             // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return        

  void method();
    Code:
       0: getstatic     #44             // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #49             // String method
       5: invokevirtual #46             // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return        

这意味着在编译时排除仅私有函数

我也尝试声明类final,但结果是一样的。