6

ProGuard を実行せずに Android で実行可能ファイルをビルドおよびデプロイする場合、参照されていないメソッドは最終的な実行可能ファイルに含まれますか?

外部ライブラリ jar からの参照されていないメソッドも含まれていますか?

この動作は Java コンパイラに依存していますか? それとも dex がすべてのトリミングを行うのでしょうか?

4

1 に答える 1

5

私は単純なクラスでテストしました(これらのメソッドはすべて参照されていません):

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)。以下の結果を得ました。APK の代わりに jar でもテストしましたが、結果はまったく同じです。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        

つまり、コンパイル時にプライベート関数のみが除外されます。

class も宣言しようとしましたfinalが、結果は同じでした。

于 2012-06-29T14:26:38.580 に答える