Java 最终可执行文件中是否包含未引用的方法?
在Android上构建和部署可执行文件而不运行ProGuard时,最终可执行文件中是否包含未引用的方法 是否也包括来自外部库JAR的未引用方法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
这种行为是否依赖于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