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

Jef*_*rod 6 java eclipse android jar

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

是否包括来自外部图书馆罐子的未引用方法?

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

Dal*_*mas 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我编译了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        
Run Code Online (Sandbox Code Playgroud)

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

我也试图声明这个类final,但结果是一样的.

  • 这也可能取决于所使用的实际编译器.此外,我们在Android上,因此dexification步骤也可以优化代码. (2认同)