【问题标题】:Are unreferenced methods included in the final executable?最终可执行文件中是否包含未引用的方法?
【发布时间】:2012-07-01 01:24:16
【问题描述】:

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

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

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

【问题讨论】:

  • 不是一个完全的骗局,但请参阅此以获得许多非常有用的信息:stackoverflow.com/questions/4912695/…
  • @GrahamBorland 谢谢,我看了一下,在问题或答案中找不到任何关于是否包含未引用代码的信息。

标签: java android eclipse jar


【解决方案1】:

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

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        

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

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

【讨论】:

  • 这也可能取决于实际使用的编译器。此外,我们是在 Android 上,因此 dexification 步骤还可以优化代码。
  • @Robert Dalmas 如何编译成 apk 并避免 dexing?
  • 是的,我从 APK 中的 classes.dex 中提取了类(使用 dex2jar)。不过不知道这个优化是来自Java编译器还是来自dexification。
  • Dalmas,如果您不介意记录您使用的 Java 版本,我将不胜感激。然后有人可以使用相同版本的编译器来生成 jar 文件而不是 Android 可执行文件,以确定它是否由编译器进行修剪。
  • 我只是用jar而不是APK测试,结果完全一样。我使用的是 Java 1.6.0_29。
猜你喜欢
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2011-02-02
相关资源
最近更新 更多