Home | History | Annotate | Download | only in docs
      1 # Android Platform #
      2 
      3 Honggfuzz (as of version 0.6) supports Android OS (NDK cross-compilation) using
      4 both ptrace() API and POSIX signals interface. When ptrace() API is enabled,
      5 honggfuzz's engine prevents monitored signals from reaching the debugger (no
      6 logcat backtraces & tombstones), since the fuzzer's runtime analysis is
      7 affected.
      8 
      9 ## Requirements ##
     10 
     11 * [Android NDK](https://developer.android.com/ndk/index.html): User has to
     12 manually install NDK and set environment PATH
     13 * [libunwind](http://www.nongnu.org/libunwind/download.html): In case of first
     14 build an upstream git fork is executed followed by required patches
     15 * [capstone](http://www.capstone-engine.org/download.html): In case of first
     16 build an upstream git fork is executed
     17 
     18 | **Dependency** | **Last Tested Version** |
     19 |:-------|:-----------|
     20 | **Android NDK** | r16 with Android API 24 (Nougat 7.0) |
     21 | **libunwind** | upstream master commit [bc8698f] |
     22 | **capstone** | 3.0.4 stable version |
     23 
     24 ## Compatibility list ##
     25 
     26 It has been tested under the following CPU architectures:
     27 
     28 | **ABI** | **Status** |
     29 |:-------|:-----------|
     30 | **armeabi** | ptrace() API & POSIX signal interface |
     31 | **armeabi-v7a** | ptrace() API & POSIX signal interface |
     32 | **arm64-v8a** | ptrace() API & POSIX signal interface `*`|
     33 | **x86** | ptrace() API & POSIX signal interface |
     34 | **x86_64** | ptrace() API & POSIX signal interface |
     35 
     36 _`*`) libunwind fails to extract frames if fuzzing target is 32bit. Prefer a32bit build for such targets._
     37 
     38 
     39 ## Cross-Compiling ##
     40 ## Dependencies ##
     41 
     42 A series of helper bash scripts have been created under the
     43 `third_party/android/scripts` directory to automate the dependencies
     44 configuration & build process. The scripts are automatically invoked from the
     45 makefile, based on the selected target CPU. Normally you'll not need to manually
     46 execute or modify them.
     47 
     48 ## Building
     49 ### All CPUs ###
     50 For convenience the master makefile defines an `android-all` target that
     51 automatically builds honggfuzz (and its dependencies) for all the supported
     52 Android CPUs.
     53 
     54 From the root directory execute the following. Build output is available under
     55 the `libs` directory.
     56 
     57 ```
     58 $ make android-all
     59 ...
     60 $ tree libs/
     61 libs/
     62  arm64-v8a
     63   android_api.txt
     64   honggfuzz
     65   libhfuzz.a
     66   ndk_toolchain.txt
     67  armeabi
     68   android_api.txt
     69   honggfuzz
     70   libhfuzz.a
     71   ndk_toolchain.txt
     72  armeabi-v7a
     73   android_api.txt
     74   honggfuzz
     75   libhfuzz.a
     76   ndk_toolchain.txt
     77  x86
     78   android_api.txt
     79   honggfuzz
     80   libhfuzz.a
     81   ndk_toolchain.txt
     82  x86_64
     83      android_api.txt
     84      honggfuzz
     85      libhfuzz.a
     86      ndk_toolchain.txt
     87 
     88 5 directories, 20 files
     89 ```
     90 
     91 
     92 ### Specific CPU ###
     93 To build for a specific CPU use the `android` target with one of the supported
     94 ABI descriptions. Again the dependencies are automatically build.
     95 
     96 ```
     97 $ make android ANDROID_APP_ABI=<arch>
     98 ...
     99 ```
    100 
    101 Were `<arch>` can be:
    102 
    103 * armeabi
    104 * armeabi-v7a (**default**)
    105 * arm64-v8a
    106 * x86
    107 * x86_64
    108 
    109 
    110 ## Android specific flags ##
    111 
    112 | **Flag** | **Options** | **Description** |
    113 |:----------|:------------|:----------------|
    114 | **ANDROID_DEBUG_ENABLED** | true, false (default: false) | Enable Android debug builds |
    115 | **ANDROID_APP_ABI** | armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 (default: armeabi-v7a) | Target CPU |
    116 | **ANDROID_WITH_PTRACE** | true, false (default: true) `1`| Fuzzing engine backend architecture |
    117 | **ANDROID_API** | android-21, android-22, ... (default: android-26) `2` | Target Android API |
    118 | **ANDROID_CLANG** | true, false (default: true) | Android NDK compiler toolchain to use |
    119 
    120 _`1`) If false, POSIX signals interface is used instead of PTRACE API_
    121 
    122 _`2`) Due to bionic incompatibilities, only APIs >= 21 are supported_
    123