我想在Android apk中静态地确定未使用的代码路径,即我想找出.dex文件中我的代码永远不会到达的所有路径。有什么可能的方法呢?
答案 0 :(得分:2)
一般来说,javac编译器不会生成死代码。如果可以静态地确定某些内容无法访问,则编译将失败。例如:
void foo() {
throw new RuntimeException();
doStuff();
}
这会导致“无法访问的语句”失败。你可以“提示”你想要执行此操作的编译器:
void foo() {
if (true) throw new RuntimeException();
doStuff();
}
但是,编译器仍然知道对doStuff()的调用是不可达的,并将其丢弃。
如果您确实设法将死代码放入DEX文件中,字节码验证程序将可选地告诉您 - 在verifier source中查找DEAD_CODE_SCAN
。
所有这些都是针对方法中的死代码。为了识别从未实际调用的整个方法,您可以使用ProGuard(这是Android应用程序版本中可选但正式支持的部分)。这可能是误报并删除从不直接调用但可以通过反射调用的方法,因此有时需要手动覆盖。