在不运行 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/