{"repo":"neocanable/garlic","free":true,"listed":false,"github":"https://github.com/neocanable/garlic","clone":"git clone https://github.com/neocanable/garlic.git","description":"The world's fastest apk (android)/java open source decompiler","language":"C","stars":691,"topics":["android","android-decompile","android-decompiler","android-reverse","apk","apk-decompiler","c99","decompiler","dex","dex-decompiler","java-decompiler","reverse-engineering"],"license":"Apache-2.0","category":"reverse_engineering","readme_excerpt":"# Garlic decompiler\n[![License](http://img.shields.io/:license-apache-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)\n\n[![Telegram](https://img.shields.io/badge/Telegram-Join%20Chat-blue?logo=telegram)](https://t.me/+8N--zZal0KExMzA1)\n\n\nEnglish | [Chinese](README.CN.md)\n\nThe world's fastest apk (android)/java open source decompiler\n\nAndroid/Java decompiler written in C\n\nTool for produces java source code from class/jar/dex/apk file\n\n### Features\n\n* decompile apk file\n* decompile dex file\n* decompile class file\n* decompile jar file\n* decompile war file\n\n### Install\n\n* macos/linux\n``` shell\nbrew install neocanable/decompiler/garlic\n```\n\n\n### Build\n\n##### 1. Build on linux/macOS \n\n​\t**requirements**: cmake >= **3.26**\n\n\n```sh\ngit clone https://github.com/neocanable/garlic.git\ncd garlic\ncmake -B build\ncmake --build build\n./build/garlic\n```\n\n\n\n##### 2. Build on Windows\n\nplease check the [windows build document](docs/build-garlic-on-windows.md)\n\nAlso see [Garlic on Windows](docs/garlic-on-windows.md) for performance tips and known issues.\n\n##### 3. Build with Zig (cross-platform)\n\n​\t**requirements**: zig >= **0.16.0**\n\nBuild for your host platform directly:\n\n```sh\ngit clone https://github.com/neocanable/garlic.git\ncd garlic\nzig build --release=fast\n./zig-out/bin/garlic\n```\n\nCross-compile to any target with `-Dtarget`:\n\n```sh\n# Linux x86_64 (musl)\nzig build --release=fast -Dtarget=x86_64-linux-musl\n\n# Linux x86_64 (glibc)\nzig build --release=fast -Dtarget=x86_64-linux-gnu\n\n# Linux aarch64\nzig build --release=fast -Dtarget=aarch64-linux-musl\n\n# Linux i686 (32-bit)\nzig build --release=fast -Dtarget=x86-linux-musl\n\n# Windows x86_64\nzig build --release=fast -Dtarget=x86_64-windows\n\n# Windows 32-bit\nzig build --release=fast -Dtarget=x86-windows\n\n# macOS x86_64 (Intel)\nzig build --release=fast -Dtarget=x86_64-macos\n\n# macOS aarch64 (Apple Silicon)\nzig build --release=fast -Dtarget=aarch64-macos\n```\n\nZig bundles its own cross-linkers and libc, so **no cross-toolchain needs to be installed** — everything works out of the box. The output goes to `zig-out/bin/`.\n\n\n### Usage\n\n* decompile apk\n  ```sh\n  garlic /path/to/android.apk\n  \n  garlic /path/to/android.apk -o /path/to/save # -o option is source code output path\n  \n  garlic /path/to/android.apk -t 5             # -t option is thread count, default is 4\n  ```\n\n* decompile .dex file\n  ```sh\n  garlic /path/to/classes.dex\n  \n  garlic /path/to/classes.dex -o /path/to/save # -o option is source code output path\n  \n  garlic /path/to/classes.dex -t 5             # -t option is thread count, default is 4\n  ```\n\n* decompile .class file\n\n    decompile .class file, default output is **stdout**\n    ```sh\n    garlic /path/to/jvm.class\n    ```\n\n\n* decompile jar file\n    ```sh\n    garlic /path/to/file.jar\n    \n    garlic /path/to/file.jar -o /path/to/save # -o option is source code output path\n    \n    garlic /path/to/file.jar -t 5             # -t option is thread count, default is 4\n    ```\n\n    default output is same level directory as the file\n\n\n* javap \n  \n    like javap, more faster, disabled LineNumber and StackMapTable attributes\n    ```sh\n    garlic /path/to/jvm.class -p\n    ```\n\n* dexdump\n    ```sh\n    garlic /path/to/dalvik.dex -p           \n    \n    ```\n\n* search string\n  ```\n  garlic ~/demo/demo.apk -f \"windowInfo\" # search \"windowInfo\" in demo.apk\n  ```\n\n  ```\n  garlic ~/demo/demo.jar -f \"[W|w]indow\" # search regex [W|w]indow in demo.jar\n  ```\n\n  ```\n  garlic ~/demo/demo.dex -f \"info\" # search contains string \"info\" in demo.dex\n  ```\n\n\n### Debug\n\nin **src/jvm.c**, change main function to: \n\n```c\nint main(int argc, char **argv)\n{\n    jar_file_analyse(path_of_jar, out_of_jar, 1);\n    return 0;\n}\n\n```\n\nif thread count less than 2, it will disable multiple thread.\n\n\n\n### Speed\n\ndecompile newest(2025-06-16) wechat.apk which size is 200M+ and 19w+ classes need 12 seconds\n\n```sh\ngarlic ~/wechat/wechat.apk\n[Garlic] APK file analysis\nFile     : ~/wechat/wechat.apk\nSave to  : ~/wechat/wechat_apk\nThread   : 4\nProgress : 192538 (192538)\n[Done]\n```\n\n![decompile tiktok](shell/images/garlic-show.gif)\n\n\n### Garlic + Rosemary pipeline\n\n[Video](https://youtu.be/I_cwuW4UKOs?si=eTCFuC1XzHuBi5a0)\n\n\n### Customization\n\n**Email:**   neocanable#gmail.com (replace # to @)\n\n**wechat:** neocanable\n\n\n![author](shell/images/qrcode.jpg)\n\n\n--------------------------------------------\n*Licensed under the Apache 2.0 License*\n","default_branch":"main","files":317,"tree":[".github/ISSUE_TEMPLATE/bug_report.md",".github/ISSUE_TEMPLATE/feature_request.md",".gitignore","CMakeLists.txt","LICENSE","MCP-SERVER.CN.md","MCP-SERVER.md","README.CN.md","README.md","build.sh","build.zig","build.zig.zon","cmake/bin2c.cmake","docs/arm.md","docs/build-garlic-on-windows.md","docs/dex.md","docs/elf.md","docs/garlic-on-windows.md","docs/pe.md","libs/include/rosemary/jd_elf_export.h","libs/linux-aarch64/librosemarylib.so","libs/linux-i686/librosemarylib.so","libs/linux-x64/librosemarylib.so","libs/macos-aarch64/librosemarylib.dylib","libs/macos-x64/librosemarylib.dylib","libs/win32/librosemarylib.dll","libs/win32/librosemarylib.dll.a","libs/win64/librosemarylib.dll","libs/win64/librosemarylib.dll.a","shell/check_leaks.sh","shell/dex_opcode_helper.rb","shell/generate_xcode_project.sh","shell/images/garlic-show.gif","shell/images/qrcode.jpg","shell/jvm_opcode_helper.rb","shell/macos_sign.sh","shell/max_line.rb","shell/valgrind.sh","src/ai/http_server.c","src/ai/http_server.h","src/ai/jd_mcp.h","src/ai/jd_mcp_server.c","src/ai/jd_mcp_sql.h","src/ai/jd_mcp_tools.c","src/analyzer/jd_analyzer.c","src/analyzer/jd_analyzer.h","src/analyzer/jd_api_matcher.c","src/analyzer/jd_api_matcher.h","src/analyzer/jd_string_analyzer.h","src/apk/apk.c","src/apk/apk.h","src/apk/apk_manifest.c","src/apk/apk_manifest.h","src/common/debug.h","src/common/endian_x.h","src/common/file_tools.h","src/common/str_tools.h","src/common/types.h","src/dalvik/dex_annotation.c","src/dalvik/dex_annotation.h","src/dalvik/dex_class.c","src/dalvik/dex_class.h","src/dalvik/dex_decompile.c","src/dalvik/dex_decompile.h","src/dalvik/dex_descriptor.c","src/dalvik/dex_descriptor.h","src/dalvik/dex_dump.c","src/dalvik/dex_dump.h","src/dalvik/dex_exception.c","src/dalvik/dex_exception.h","src/dalvik/dex_expression_builder.c","src/dalvik/dex_expression_builder.h","src/dalvik/dex_ins.c","src/dalvik/dex_ins.h","src/dalvik/dex_ins_action.c","src/dalvik/dex_ins_action.h","src/dalvik/dex_ins_helper.h","src/dalvik/dex_lambda.c","src/dalvik/dex_lambda.h","src/dalvik/dex_meta_helper.c","src/dalvik/dex_meta_helper.h","src/dalvik/dex_method.c","src/dalvik/dex_method.h","src/dalvik/dex_optimizer.c","src/dalvik/dex_optimizer.h","src/dalvik/dex_pre_optimizer.c","src/dalvik/dex_pre_optimizer.h","src/dalvik/dex_simulator.c","src/dalvik/dex_simulator.h","src/dalvik/dex_smali.c","src/dalvik/dex_smali.h","src/dalvik/dex_structure.h","src/dalvik/dex_type_analyse.c","src/dalvik/dex_type_analyse.h","src/dalvik/dex_writter.c","src/decompiler/control_flow.c","src/decompiler/control_flow.h","src/decompiler/debug_pointer.h","src/decompiler/descriptor.c","src/decompiler/descriptor.h","src/decompiler/dominator_tree.c","src/decompiler/dominator_tree.h","src/decompiler/exception.c","src/decompiler/exception.h","src/decompiler/expression.c","src/decompiler/expression.h","src/decompiler/expression_analyse.c","src/decompiler/expression_analyse.h","src/decompiler/expression_array.c","src/decompiler/expression_array.h","src/decompiler/expression_assert.c","src/decompiler/expression_assert.h","src/decompiler/expression_assign.c","src/decompiler/expression_assign.h","src/decompiler/expression_branches.c","src/decompiler/expression_branches.h","src/decompiler/expression_chain.c","src/decompiler/expression_chain.h","src/decompiler/expression_copy_propgation.c","src/decompiler/expression_copy_propgation.h","src/decompiler/expression_enum.c","src/decompiler/expression_enum.h","src/decompiler/expression_exception.c","src/decompiler/expression_exception.h","src/decompiler/expression_goto.c","src/decompiler/expression_goto.h","src/decompiler/expression_helper.h","src/decompiler/expression_if.c","src/decompiler/expression_if.h","src/decompiler/expression_inline.c","src/decompiler/expression_inline.h","src/decompiler/expression_inner_class.c","src/decompiler/expression_inner_class.h","src/decompiler/expression_local_variable.c","src/decompiler/expression_local_variable.h","src/decompiler/expression_logical.c","src/decompiler/expression_logical.h","src/decompiler/expression_loop.c","src/decompiler/expression_loop.h","src/decompiler/expression_loop_type.c","src/decompiler/expression_loop_type.h","src/decompiler/expression_new.c","src/decompiler/expression_new.h","src/decompiler/expression_node.c","src/decompiler/expression_node.h","src/decompiler/expression_node_helper.h","src/decompiler/expression_node_param.c","src/decompiler/expression_node_param.h","src/decompiler/expression_remove_useless.c","src/decompiler/expression_remove_useless.h","src/decompiler/expression_return.c","src/decompiler/expression_return.h","src/decompiler/expression_synchronized.c","src/decompiler/expression_synchronized.h","src/decompiler/expression_ternary.c","src/decompiler/expression_ternary.h","src/decompiler/expression_visitor.c","src/decompiler/expression_visitor.h","src/decompiler/expression_writter.c","src/decompiler/expression_writter.h","src/decompiler/field.c","src/decompiler/field.h","src/decompiler/instruction.c","src/decompiler/instruction.h","src/decompiler/klass.c","src/decompiler/klass.h","src/decompiler/method.c","src/decompiler/method.h","src/decompiler/scc.c","src/decompiler/scc.h","src/decompiler/signature.c","src/decompiler/signature.h","src/decompiler/ssa.c","src/decompiler/ssa.h","src/decompiler/stack.c","src/decompiler/stack.h","src/decompiler/structure.h","src/decompiler/transformer/anonymous.c","src/decompiler/transformer/array_load.c","src/decompiler/transformer/array_store.c","src/decompiler/transformer/arraylength.c","src/decompiler/transformer/assert.c","src/decompiler/transformer/assignment.c","src/decompiler/transformer/assignment_chain.c","src/decompiler/transformer/athrow.c","src/decompiler/transformer/cast.c","src/decompiler/transformer/const.c","src/decompiler/transformer/declaration.c","src/decompiler/transformer/define_stack_var.c","src/decompiler/transformer/enum.c","src/decompiler/transformer/get_field.c","src/decompiler/transformer/get_static.c","src/decompiler/transformer/goto.c","src/decompiler/transformer/if.c","src/decompiler/transformer/iinc.c","src/decompiler/transformer/initialize.c","src/decompiler/transformer/instanceof.c","src/decompiler/transformer/invoke.c","src/decompiler/transformer/invokedynamic.c","src/decompiler/transformer/invokeinterface.c","src/decompiler/transformer/invokespecial.c","src/decompiler/transformer/invokestatic.c","src/decompiler/transformer/invokevirtual.c","src/decompiler/transformer/lambda.c","src/decompiler/transformer/local_variable.c","src/decompiler/transformer/logic_not.c","src/decompiler/transformer/loop.c","src/decompiler/transformer/lvalue.c","src/decompiler/transformer/monitorenter.c","src/decompiler/transformer/monitorexit.c","src/decompiler/transformer/new_array.c","src/decompiler/transformer/operator.c","src/decompiler/transformer/put_field.c","src/decompiler/transformer/put_static.c","src/decompiler/transformer/return.c","src/decompiler/transformer/single_list.c","src/decompiler/transformer/single_operator.c","src/decompiler/transformer/stack_value.c","src/decompiler/transformer/stack_var.c","src/decompiler/transformer/store.c","src/decompiler/transformer/str_concat.c","src/decompiler/transformer/switch.c","src/decompiler/transformer/ternary.c","src/decompiler/transformer/transformer.c","src/decompiler/transformer/transformer.h","src/decompiler/transformer/uninitialize.c","src/garlic.c","src/jar/jar.c","src/jar/jar.h","src/jvm/jvm_annotation.c","src/jvm/jvm_annotation.h","src/jvm/jvm_class.c","src/jvm/jvm_class.h","src/jvm/jvm_decompile.c","src/jvm/jvm_decompile.h","src/jvm/jvm_descriptor.c","src/jvm/jvm_descriptor.h","src/jvm/jvm_exception.c","src/jvm/jvm_exception.h","src/jvm/jvm_expression_builder.c","src/jvm/jvm_expression_builder.h","src/jvm/jvm_ins.c","src/jvm/jvm_ins.h","src/jvm/jvm_ins_action.c","src/jvm/jvm_ins_helper.h","src/jvm/jvm_lambda.c","src/jvm/jvm_lambda.h","src/jvm/jvm_method.c","src/jvm/jvm_method.h","src/jvm/jvm_optimizer.c","src/jvm/jvm_optimizer.h","src/jvm/jvm_simulator.c","src/jvm/jvm_simulator.h","src/jvm/jvm_type_analyse.c","src/jvm/jvm_type_analyse.h","src/libs/bitset/bitset.c","src/libs/bitset/bitset.h","src/libs/bitset/portability.h","src/libs/cjson/cJSON.c","src/libs/cjson/cJSON.h","src/libs/cjson/cJSON_Utils.c","src/libs/cjson/cJSON_Utils.h","src/libs/hashmap/hashmap.c","src/libs/hashmap/hashmap.h","src/libs/hashmap/hashmap_tools.c","src/libs/hashmap/hashmap_tools.h","src/libs/list/list.c","src/libs/list/list.h","src/libs/md4c/entity.c","src/libs/md4c/entity.h","src/libs/md4c/md4c-html.c","src/libs/md4c/md4c-html.h","src/libs/md4c/md4c.c","src/libs/md4c/md4c.h","src/libs/memory/mem_common.h","src/libs/memory/mem_pool.c","src/libs/memory/mem_pool.h","src/libs/queue/queue.c","src/libs/queue/queue.h","src/libs/str/str.c","src/libs/str/str.h","src/libs/threadpool/threadpool.c","src/libs/threadpool/threadpool.h","src/libs/trie/trie_tree.c","src/libs/trie/trie_tree.h","src/libs/zip/miniz.h","src/libs/zip/zip.c","src/libs/zip/zip.h","src/parser/class/class_structure.h","src/parser/class/class_tools.c","src/parser/class/class_tools.h","src/parser/class/metadata.c","src/parser/class/metadata.h","src/parser/class/opcode.c","src/parser/class/writter.c","src/parser/dex/dex.h","src/parser/dex/dex_tools.h","src/parser/dex/metadata.c","src/parser/dex/metadata.h","src/parser/dex/opcode.c","src/parser/pe/metadata.c","src/parser/pe/metadata.h","src/parser/pe/pe.h","src/parser/pe/pe_const.h","src/parser/pe/pe_tools.h","src/parser/reader/reader.h","src/report/report.c","src/report/report.h","src/rosemary/rosemary_embed.c","src/rosemary/rosemary_embed.h","toolchains/toolchain-linux-aarch64.cmake","toolchains/toolchain-linux-i686.cmake","toolchains/toolchain-linux-x64.cmake","toolchains/toolchain-macos-aarch64.cmake","toolchains/toolchain-macos-x64.cmake","toolchains/toolchain-win32.cmake","toolchains/toolchain-win64.cmake"],"storefront":"/r/neocanable","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/neocanable/garlic/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}