6

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

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

这种行为是否依赖于 Java 编译器,或者 dex 是否会进行所有修整(如果有)?

4

1 回答 1

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        

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

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

于 2012-06-29T14:26:38.580 回答