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

标签 java android eclipse jar

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

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

此行为是否取决于 Java 编译器,或者 dex 是否会进行所有修整(如果有)?

最佳答案

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

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        

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

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

关于java - 未引用的方法是否包含在最终的可执行文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263029/

相关文章:

java - Google Marketplace App/OAuth2 - 以编程方式委托(delegate)全域授权

java - GCM 字符串而不是 boolean 值

android - 平滑调整图表和 map View 的大小

java - Firebase 数据库 Android - 将具有不同结构的 datasnapshot 子级映射到 java 对象

java - 与特定事件监听器关联的方法列表?

java - Spring Cloud 侦探 : Propagate traceId to other spring application

java - 使用 Linkedhashmap 测试算法

iphone - 我对 AR 应用程序中指南针和 GPS 功能的理解是否正确?

eclipse - 免费的UML序列图逆向工程eclipse插件开箱即用-是否存在这样的事情?

java - 使用 eclipse 在已安装的 Glassfish 上调试 Maven Web 应用程序