1

I want to statically determine unused code path in Android apk i.e. I want to find out all paths in .dex file that my code will never reach. What are the possible ways to do so ?

4

1 回答 1

2

一般来说,javac 编译器不会生成死代码。如果可以静态确定某些内容无法访问,则编译将失败。例如:

void foo() {
    throw new RuntimeException();

    doStuff();
}

这会导致“无法访问的语句”失败。无论如何,您都可以向编译器“提示”您要执行此操作:

void foo() {
    if (true) throw new RuntimeException();

    doStuff();
}

但是,编译器仍然知道对 doStuff() 的调用不可达,并丢弃它。

如果您确实设法将死代码放入 DEX 文件中,字节码验证器会选择性地告诉您 -DEAD_CODE_SCAN验证器源中查找。

所有这些都是针对方法内的死代码。为了识别从未实际调用过的整个方法,您可以使用ProGuard(这是一个可选但官方支持的 Android 应用程序构建部分)。这可能会误报并删除从未直接调用但可能通过反射调用的方法,因此有时需要手动覆盖。

于 2013-08-13T17:45:37.477 回答