| |
| This is an example bisection for an NDK build system. This example specifically |
| bisects the sample NDK Teapot app. All steps (setup and otherwise) for bisection |
| can be found in DO_BISECTION.sh. This shell script is meant to show the process |
| required to bisect a compiler problem in an arbitrary NDK app build system. |
| |
| There are three necessary setup steps to run this example: |
| |
| 1. Install the NDK (known to work with r12b) |
| a. See here for NDK: https://developer.android.com/ndk/index.html |
| b. Go here for older NDK downloads: https://github.com/android-ndk/ndk/wiki |
| |
| 2. Install the compiler wrapper provided with this repo. See |
| compiler_wrapper.py for more details. |
| a. Essentially you must go into the NDK source (or where you build system |
| stores its toolchain), rename your compilers to <compiler>.real, and |
| create a symlink pointing to compiler_wrapper.py named <compiler> |
| (where your compiler used to be). |
| b. If you're using the toolchains that come with the NDK they live at: |
| <ndk_path>/toolchains/<arch>/prebuilt/<host>/bin |
| example: |
| <ndk_path>/toolchains/llvm/prebuilt/linux-x86_64/bin/clang |
| |
| 3. Plug in an Arm7 compatible Android device with usb debugging enabled. |
| a. This bisection example was tested with a Nexus 5X |
| b. It should be relatively simple to change the example to work with other |
| types of devices. Just change the scripts, and change PATCH1 to use a |
| different build flavor (like x86). See below for more details. |
| |
| This example contains two patches: |
| |
| PATCH1 - This is the necessary changes to the build system to make the |
| bisection easier. More specifically, it adds an arm7 build flavor to gradle. |
| By default, this project will build objects for all possible architectures and |
| package them into one big apk. These object files meant for another |
| architecture just sit there and don't actually execute. By adding a build |
| flavor for arm7, our compiler wrapper won't try to bisect object files meant |
| for another device. |
| |
| PATCH2 - This patch is what inserts the "compiler error". This is a simple |
| nullptr error in one of the source files, but it is meant to mimic bad code |
| generation. The result of the error is the app simply crashes immediately |
| after starting. |
| |
| Using another device architecture: |
| |
| If we want to bisect for an x86-64 device we first need to provide a arch |
| specific build flavor in our app/build.gradle file: |
| |
| create("x86-64") { |
| ndk.abiFilters.add("x86_64") |
| } |
| |
| We want to add this under the same "productFlavors" section that our arm7 |
| build flavor is in (see PATCH1). Now we should have the "installx86-64Debug" |
| task in our build system. We can use this to build and install an x86-64 |
| version of our app. |
| |
| Now we want to change our test_setup.sh script to run our new gradle task: |
| ./gradlew installx86-64Debug |
| |
| Keep in mind, these specific build flavors are not required. If your build |
| system makes these device specific builds difficult to implement, the |
| bisection tool will function perfectly fine without them. However, the |
| downside of not having targetting a single architecture is the bisection will |
| take longer (as it will need to search across more object files). |
| |
| Additional Documentation: |
| These are internal Google documents, if you are a developer external to |
| Google please ask whoever gave you this sample for access or copies to the |
| documentation. If you cannot gain access, the various READMEs paired with the |
| bisector should help you. |
| |
| * Ahmad's original presentation: |
| https://goto.google.com/zxdfyi |
| |
| * Bisection tool update design doc: |
| https://goto.google.com/zcwei |
| |
| * Bisection tool webpage: |
| https://goto.google.com/ruwpyi |
| |
| * Compiler wrapper webpage: |
| https://goto.google.com/xossn |