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
)。以下の結果を得ました。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
が、結果は同じでした。