To decompile is to convert executable (ready-to-run) program code (also called object code) into some form of higher-level programming language so that it has a more readable format. Decompilation is a type of reverse engineering that does the opposite of what a compiler does. It is the inverse of compilation. The tool that accomplishes this is called a decompiler. There are a number of different reasons for decompilation, such as understanding a program, recovering the source code for purposes of archiving or updating, finding viruses, debugging programs, and translating obsolete code. It is not possible to have a fully automated decompilation. No decompiler can get the exact source code that the developer wrote.
Decompilation is sometimes used unethically to reproduce source code for reuse or adaptation without permission of the copyright holder. Decompiling an APK file is not a very hard task to do. It requires transforming dex files to jar files and then those jar files to java source code, thereby fetching the app source code. Programs can be designed to be resistant to decompilation through protective means, such as code complexity and obfuscation. This includes, anti-debug techniques, restricting debuggers, trace checking, optimizations, and stripping binaries.