2013-08-13 5 views

ответ

2

Вообще говоря, компилятор javac не генерирует мертвый код. Если что-то может быть статически определено как недостижимое, компиляция завершится неудачей. Например:

void foo() { 
    throw new RuntimeException(); 

    doStuff(); 
} 

Это приводит к ошибке «недостижимого утверждения». Вы можете «намек» на компилятор, что вы хотите сделать это в любом случае:

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

    doStuff(); 
} 

Однако компилятор еще знает, что вызов DoStuff() недостижим, и отбрасывает его.

Если вам удалось получить мертвый код в DEX-файле, верификатор байтового кода по желанию рассказать вам об этом - найдите DEAD_CODE_SCAN в verifier source.

Все это для мертвого кода внутри метода. Для определения целых методов, которые на самом деле никогда не называются, вы можете использовать ProGuard (который является необязательной, но официально поддерживаемой частью сборки приложений для Android). Это может быть ложноположительным и удалять методы, которые никогда не вызываются напрямую, но могут быть вызваны путем отражения, поэтому иногда требуются ручные переопределения.