Skip to content

Commit

Permalink
Add howto compile on android (#256)
Browse files Browse the repository at this point in the history
  • Loading branch information
ret2libc committed Jul 14, 2020
1 parent 09e0ed7 commit 9942652
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/SUMMARY.md
Expand Up @@ -6,6 +6,7 @@
* [Downloading radare2](first_steps/getting_radare.md)
* [Compilation and Portability](first_steps/compilation_portability.md)
* [Compilation on Windows](first_steps/windows_compilation.md)
* [Compilation on Android](first_steps/compilation_android.md)
* [User Interfaces](first_steps/ui.md)
* [First Steps](first_steps/intro.md)
* [Command-line Flags](first_steps/commandline_flags.md)
Expand Down
102 changes: 102 additions & 0 deletions src/first_steps/compilation_android.md
@@ -0,0 +1,102 @@
## Android

Radare2 can be cross-compiled for other architectures/systems as well, like Android.

### Prerequisites

* Python 3
* Meson
* Ninja
* Git
* Android NDK

### Step-by-step

#### Download and extract the Android NDK

Download the Android NDK from the [official site](https://developer.android.com/ndk) and extract it somewhere on your system (e.g. `/tmp/android-ndk`)

#### Make

##### Specify NDK base path

```
$ echo NDK=/tmp/android-ndk > ~/.r2androidrc
```

##### Compile + create tar.gz + push it to connected android device

```
./sys/android-build.sh arm64-static
```

You can build for different architectures by changing the argument to
`./sys/android-build.sh`. Run the script without any argument to see the
accepted values.

#### Meson

##### Create a cross-file for meson

Meson needs a configuration file that describes the cross compilation environment (e.g. `meson-android.ini`).
You can adjust it as necessary, but something like the following should be a good starting point:
```
[binaries]
c = '/tmp/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android28-clang'
cpp = '/tmp/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android28-clang++'
ar = '/tmp/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar'
as = '/tmp/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-as'
ranlib = '/tmp/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ranlib'
ld = '/tmp/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld'
strip = '/tmp/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip'
pkgconfig = 'false'
[properties]
sys_root = '/tmp/android-ndk/sysroot'
[host_machine]
system = 'android'
cpu_family = 'arm'
cpu = 'aarch64'
endian = 'little'
```

##### Compile with meson + ninja

Now setup the build directory with meson as usual:
```
$ CFLAGS="-static" LDFLAGS="-static" meson --default-library static --prefix=/tmp/android-dir -Dblob=true build --cross-file ./meson-android.ini
```

A bit of explanation about all the options:
* `CFLAGS="-static"`, `LDFLAGS="-static"`, `--default-library static`: this
ensure that libraries and binaries are statically compiled, so you do not need
to properly set LD_* environment variables in your Android environment to make
it find the right libraries. Binaries have everything they need inside.
* `-Dblob=true`: it tells meson to compile just one binary with all the needed
code for running `radare2`, `rabin2`, `rasm2`, etc. and creates symbolic links to
those names. This avoids creating many statically compiled large binaries and
just create one that provides all features. You will still have `rabin2`,
`rasm2`, `rax2`, etc. but they are just symlinks to `radare2`.
* `--cross-file ./meson-android.ini`: it describes how to compile radare2 for Android

Then compile and install the project:
```
$ ninja -C build
$ ninja -C build install
```

##### Move files to your android device and enjoy

At this point you can copy the generated files in /tmp/android-dir to your Android device and running radare2 from it.
For example:
```
$ cd /tmp && tar -cvf radare2-android.tar.gz android-dir
$ adb push radare2-android.tar.gz /data/local/tmp
$ adb shell
DEVICE:/ $ cd /data/local/tmp
DEVICE:/data/local/tmp $ tar xvf radare2-android.tar.gz
DEVICE:/data/local/tmp $ ./android-dir/bin/radare2
Usage: r2 [-ACdfLMnNqStuvwzX] [-P patch] [-p prj] [-a arch] [-b bits] [-i file]
[-s addr] [-B baddr] [-m maddr] [-c cmd] [-e k=v] file|pid|-|--|=
```

0 comments on commit 9942652

Please sign in to comment.