
Decompilador de bytecode Java para Java, usado no IntelliJ IDEA.
Fernflower é o primeiro decompilador analítico realmente funcional para Java e provavelmente para uma linguagem de programação de alto nível em geral.
As versões são publicadas no repositório IntelliJ Community.
Por favor, envie seus relatórios de bugs e solicitações de funcionalidades para o issue tracker (no subsistema Java. Decompiler. Engine).
O Fernflower é empacotado no IntelliJ IDEA e é usado principalmente para exibir código Java durante a depuração ou navegação em arquivos de classe.
O Fernflower pode ser executado a partir da linha de comando no modo autônomo usando o seguinte comando:
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
* significa zero ou mais vezes
+ significa uma ou mais vezes
<source>: arquivo ou diretório com arquivos a serem descompilados.
Os diretórios são escaneados recursivamente.
As extensões de arquivo permitidas são class, zip e jar.
Fontes prefixadas com -e= significam arquivos de "biblioteca" que não serão descompilados, mas serão considerados ao analisar
relacionamentos entre classes ou métodos.
Especialmente a renomeação de identificadores (veja a opção ren) pode se beneficiar de informações sobre classes externas.
<destination>: diretório de destino para colocar o código-fonte Java resultante
<option>=<value>: uma opção de linha de comando com o valor correspondente (veja "Opções de linha de comando" abaixo).
java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\
Exceto por mpm e urc, o valor 1 significa que a opção está ativada, 0 - desativada.
O valor padrão, se houver, é fornecido entre parênteses.
Normalmente, as seguintes opções serão alteradas pelo usuário, se houver: hes, hdc, dgs, mpm, ren, urc As demais opções podem ser deixadas como estão: elas são destinadas a engenheiros reversos profissionais.
rbr (1): ocultar métodos bridgersy (0): ocultar membros sintéticos de classedin (1): descompilar classes internasdc4 (1): colapsar referências de classe 1.4das (1): descompilar asserçõeshes (1): ocultar invocação vazia de superhdc (1): ocultar construtor padrão vaziodgs (0): descompilar assinaturas genéricasner (1): assumir retorno sem lançamento de exceçõesden (1): descompilar enumeraçõesrgn (1): remover invocação de getClass(), quando fizer parte de uma instrução new qualificadalit (0): exibir literais numéricos "como estão"Alguns ofuscadores dão às classes e seus elementos membros nomes curtos, sem sentido e, acima de tudo, ambíguos. A recompilação de tal código leva a um grande número de conflitos. Portanto, é aconselhável deixar o decompilador renomear os elementos por sua vez, garantindo a exclusividade de cada identificador.
A opção ren (ou seja, -ren=1) ativa a funcionalidade de renomeação. A estratégia padrão de renomeação funciona da seguinte forma:
org.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer na opção urc
(ex.: -urc=com.example.MyRenamer) para o Fernflower. A classe deve estar disponível no classpath da aplicação.O significado de cada método deve ficar claro pelo nome: toBeRenamed determina se o elemento será renomeado, enquanto os outros três fornecem novos nomes para classes, métodos e campos, respectivamente.
Construir um script de inicialização executável:
./gradlew :installDist
O script de inicialização é gerado em build/install/engine/bin.
O Fernflower faz parte do projeto IntelliJ Community, contribuições são bem-vindas, a forma preferida de enviar patches é criando um pull request no repositório da comunidade IntelliJ. Ao enviar patches, por favor siga as diretrizes de contribuição.
O Fernflower é licenciado sob a Apache License Version 2.0.
O Fernflower foi originalmente desenvolvido por Stiver mas tem sido mantido pela JetBrains desde 2014. Alguns patches do ForgeFlower foram mesclados neste repositório. O espelho do Fernflower também foi mantido por Andrew McRae por muito tempo.
O nome correto é Fernflower, não FernFlower.
asc (0): codificar caracteres não ASCII em literais de string e caractere como escapes Unicodebto (1): interpretar int 1 como booleano verdadeiro (solução alternativa para um bug do compilador)nns (0): permitir atributo sintético não definido (solução alternativa para um bug do compilador)uto (1): considerar tipos sem nome como java.lang.Object (solução alternativa para uma falha na arquitetura do compilador)udv (1): reconstruir nomes de variáveis a partir de informações de depuração, se presentesump (1): reconstruir nomes de parâmetros a partir de atributos correspondentes, se presentesrer (1): remover intervalos de exceção vaziosfdi (1): desenlinear estruturas finallympm (0): tempo máximo de processamento permitido por método descompilado, em segundos. 0 significa sem limite superiorren (0): renomear classes e elementos de classe ambíguos (respectivamente ofuscados)urc (-): nome completo de uma classe fornecida pelo usuário que implementa a interface IIdentifierRenamer. É usado para determinar quais identificadores de classe devem ser renomeados e fornece novos nomes de identificadores (veja "Renomeação de identificadores")inn (1): verificar a anotação específica do IntelliJ IDEA @NotNull e remover código inserido, se encontradolac (0): descompilar expressões lambda para classes anônimasnls (0): definir um novo caractere de linha a ser usado na saída. 0 - '\r\n' (Windows), 1 - '\n' (Unix), o padrão depende do SOind: string de indentação (o padrão é 3 espaços)crp (0): usar padrões de registro onde for possívelcps (0): usar switch com padrões onde for possívellog (INFO): nível de log, valores possíveis são TRACE, INFO, WARN, ERRORiec (0): incluir todo o classpath no contexto ao descompilarisl (1): enlinar expressões lambda simplesucrc (1): ocultar construtor e getters de registro desnecessárioscci (1): verificar se o recurso em try-with-resources realmente implementa a interface AutoCloseablejvn (0): sobrescrever todos os nomes de variáveis locais com nomes no estilo JADjpr (0): incluir nomes de parâmetros na nomenclatura JADpbo (0): adicionar parênteses esclarecedores quando operadores bitwise/shift são misturados com aritméticos