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

Java 最终可执行文件中是否包含未引用的方法?,java,android,eclipse,jar,Java,Android,Eclipse,Jar,在Android上构建和部署可执行文件而不运行ProGuard时,最终可执行文件中是否包含未引用的方法 是否也包括来自外部库JAR的未引用方法 这种行为是否依赖于Java编译器,或者dex是否执行了所有修剪(如果有)?我使用一个简单的类进行了测试(所有这些方法都未被引用): 我编译了APK,提取了Test.class并反编译了它(使用javap-c)。我得到了以下结果。我还使用jar而不是APK进行了测试,结果完全相同。我使用了Java1.6.029 protected void prote

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

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


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

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

我编译了APK,提取了
Test.class
并反编译了它(使用
javap-c
)。我得到了以下结果。我还使用jar而不是APK进行了测试,结果完全相同。我使用了Java1.6.029

  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
,但结果是一样的。

不是完全重复的,但请参阅以下内容以获得许多非常有用的信息:@GrahamBorland谢谢,我看了一下,在问题或答案中找不到任何关于是否包含未引用代码的信息。这也可能取决于实际使用的编译器。此外,我们使用的是Android,因此dexification步骤也可以优化代码。@Robert Dalmas如何编译成apk并避免使用dexing?是的,我从apk中的classes.dex(使用dex2jar)提取了类。然而,我不知道这个优化是来自Java编译器还是来自dexification.Dalmas,如果您不介意记录您使用的Java版本,我将不胜感激。然后,有人可以使用相同版本的编译器生成一个jar文件,而不是一个Android可执行文件,以确定编译器是否在进行修剪。我只是用一个jar而不是APK进行了测试,结果完全相同。我使用了Java1.6.029。
  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