| {namespace buck.index} |
| |
| /***/ |
| {template .soyweb} |
| {call buck.page} |
| {param title: 'An Android (and Java!) build tool' /} |
| {param content} |
| Buck is a build system for Android that encourages the creation of |
| small, reusable modules consisting of code and resources. Because Android |
| applications are predominantly written in Java, Buck also functions as a |
| Java build system. <a href="{ROOT}concept/what_makes_buck_so_fast.html">Learn more</a> about |
| the strategies Buck uses to build Java code so quickly. |
| |
| <h2>Features</h2> |
| |
| Buck can help you do the following: |
| |
| <ul> |
| <li>Speed up your Android builds. Buck builds independent artifacts in |
| parallel to take advantage of multiple cores. Further, it reduces incremental |
| build times by keeping track of unchanged modules so that the minimal set |
| of modules is rebuilt. |
| <li>Introduce ad-hoc build steps for building artifacts that are not |
| supported out-of-the-box using the standard Ant build scripts for Android. |
| <li>Keep the logic for generating build rules in the build system instead of |
| requiring a separate system to generate build files. |
| <li>Generate code-coverage metrics for your unit tests. |
| <li>Generate an IntelliJ project based on your build rules. This makes |
| Buck ideal for both local development builds in an IDE as well as |
| headless builds on a continuous integration machine. |
| <li>Make sense of your build dependencies. |
| <li>Understand what is going on under the hood when building an APK. |
| </ul> |
| |
| Speed is the primary focus for Buck. At Facebook, we found Buck to be more |
| than twice as fast as Ant, and we are continuing to make it even faster. |
| |
| |
| <h2>How Buck Works</h2> |
| |
| Buck has three primary concepts: |
| |
| <ul> |
| <li>A <strong>build rule</strong> is a procedure for producing an |
| output file from a set of input files. |
| <li>A <strong>build target</strong> is a string identifier for a build rule. |
| It can be thought of as a "URI" within a project using Buck. |
| <li>A <strong>build file</strong> that defines one or more build rules. |
| In Make, this would be a <code>Makefile</code>, but in Buck, these |
| files are named <code>BUCK</code>. A project using Buck is expected to have |
| many <code>BUCK</code> files. |
| </ul> |
| |
| Every build rule can have zero or more dependencies associated with it, |
| or <code>deps</code>. These dependencies form a directed graph, which |
| Buck requires to be acyclic. |
| |
| <p> |
| |
| When building the output of a build rule, all of the rule's transitive dependencies |
| are built first. This means that the graph is built in a "bottom-up" fashion. |
| A build rule knows only who it depends on, not what depends on it, which makes the |
| build graph easier to reason about. This helps Buck identify independent |
| subgraphs that can be built in parallel, as well as determine the minimal set of |
| build rules that need to be rebuilt. |
| |
| <h2>Is Buck for Me?</h2> |
| |
| Buck is designed for building multiple deliverables from a single repository |
| rather than across multiple repositories. It has been our experience that |
| maintaining dependencies in the same repository makes it easier to ensure |
| that all developers have the correct version of all of the code, and simplifies |
| the process of making atomic commits. |
| |
| <p> |
| |
| If you build multiple applications, or if even if you ship one application but |
| use several sample applications for development, then Buck is definitely for you. |
| Give the <a href="{ROOT}setup/quick_start.html">Quick Start</a> a try and see how |
| Buck can help you organize your Android project and build it faster than ever before. |
| {/param} |
| {/call} |
| {/template} |