xref: /linux/tools/perf/Documentation/android.txt (revision 3d0376113ed9cf92b86885bf5102944b61523f5b)
17747e2f4SIrina TirdeaHow to compile perf for Android
27747e2f4SIrina Tirdea=========================================
37747e2f4SIrina Tirdea
47747e2f4SIrina TirdeaI. Set the Android NDK environment
57747e2f4SIrina Tirdea------------------------------------------------
67747e2f4SIrina Tirdea
77747e2f4SIrina Tirdea(a). Use the Android NDK
87747e2f4SIrina Tirdea------------------------------------------------
97747e2f4SIrina Tirdea1. You need to download and install the Android Native Development Kit (NDK).
107747e2f4SIrina TirdeaSet the NDK variable to point to the path where you installed the NDK:
117747e2f4SIrina Tirdea  export NDK=/path/to/android-ndk
127747e2f4SIrina Tirdea
137747e2f4SIrina Tirdea2. Set cross-compiling environment variables for NDK toolchain and sysroot.
147747e2f4SIrina TirdeaFor arm:
15*3d037611SChris Phlipot  export NDK_TOOLCHAIN=${NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
16*3d037611SChris Phlipot  export NDK_SYSROOT=${NDK}/platforms/android-24/arch-arm
177747e2f4SIrina TirdeaFor x86:
18*3d037611SChris Phlipot  export NDK_TOOLCHAIN=${NDK}/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-
19*3d037611SChris Phlipot  export NDK_SYSROOT=${NDK}/platforms/android-24/arch-x86
207747e2f4SIrina Tirdea
21*3d037611SChris PhlipotThis method is only tested for Android NDK versions Revision 11b and later.
22*3d037611SChris Phlipotperf uses some bionic enhancements that are not included in prior NDK versions.
237747e2f4SIrina TirdeaYou can use method (b) described below instead.
247747e2f4SIrina Tirdea
257747e2f4SIrina Tirdea(b). Use the Android source tree
267747e2f4SIrina Tirdea-----------------------------------------------
277747e2f4SIrina Tirdea1. Download the master branch of the Android source tree.
287747e2f4SIrina TirdeaSet the environment for the target you want using:
297747e2f4SIrina Tirdea  source build/envsetup.sh
307747e2f4SIrina Tirdea  lunch
317747e2f4SIrina Tirdea
327747e2f4SIrina Tirdea2. Build your own NDK sysroot to contain latest bionic changes and set the
337747e2f4SIrina TirdeaNDK sysroot environment variable.
347747e2f4SIrina Tirdea  cd ${ANDROID_BUILD_TOP}/ndk
357747e2f4SIrina TirdeaFor arm:
367747e2f4SIrina Tirdea  ./build/tools/build-ndk-sysroot.sh --abi=arm
377747e2f4SIrina Tirdea  export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-arm
387747e2f4SIrina TirdeaFor x86:
397747e2f4SIrina Tirdea  ./build/tools/build-ndk-sysroot.sh --abi=x86
407747e2f4SIrina Tirdea  export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-x86
417747e2f4SIrina Tirdea
427747e2f4SIrina Tirdea3. Set the NDK toolchain environment variable.
437747e2f4SIrina TirdeaFor arm:
447747e2f4SIrina Tirdea  export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/arm-linux-androideabi-
457747e2f4SIrina TirdeaFor x86:
467747e2f4SIrina Tirdea  export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/i686-linux-android-
477747e2f4SIrina Tirdea
487747e2f4SIrina TirdeaII. Compile perf for Android
497747e2f4SIrina Tirdea------------------------------------------------
507747e2f4SIrina TirdeaYou need to run make with the NDK toolchain and sysroot defined above:
51cd69ef88SJoonsoo KimFor arm:
52*3d037611SChris Phlipot  make WERROR=0 ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} EXTRA_CFLAGS="-pie --sysroot=${NDK_SYSROOT}"
53cd69ef88SJoonsoo KimFor x86:
54*3d037611SChris Phlipot  make WERROR=0 ARCH=x86 CROSS_COMPILE=${NDK_TOOLCHAIN} EXTRA_CFLAGS="-pie --sysroot=${NDK_SYSROOT}"
557747e2f4SIrina Tirdea
567747e2f4SIrina TirdeaIII. Install perf
577747e2f4SIrina Tirdea-----------------------------------------------
587747e2f4SIrina TirdeaYou need to connect to your Android device/emulator using adb.
597747e2f4SIrina TirdeaInstall perf using:
607747e2f4SIrina Tirdea  adb push perf /data/perf
617747e2f4SIrina Tirdea
627747e2f4SIrina TirdeaIf you also want to use perf-archive you need busybox tools for Android.
637747e2f4SIrina TirdeaFor installing perf-archive, you first need to replace #!/bin/bash with #!/system/bin/sh:
647747e2f4SIrina Tirdea  sed 's/#!\/bin\/bash/#!\/system\/bin\/sh/g' perf-archive >> /tmp/perf-archive
657747e2f4SIrina Tirdea  chmod +x /tmp/perf-archive
667747e2f4SIrina Tirdea  adb push /tmp/perf-archive /data/perf-archive
677747e2f4SIrina Tirdea
687747e2f4SIrina TirdeaIV. Environment settings for running perf
697747e2f4SIrina Tirdea------------------------------------------------
707747e2f4SIrina TirdeaSome perf features need environment variables to run properly.
717747e2f4SIrina TirdeaYou need to set these before running perf on the target:
727747e2f4SIrina Tirdea  adb shell
737747e2f4SIrina Tirdea  # PERF_PAGER=cat
747747e2f4SIrina Tirdea
757747e2f4SIrina TirdeaIV. Run perf
767747e2f4SIrina Tirdea------------------------------------------------
777747e2f4SIrina TirdeaRun perf on your device/emulator to which you previously connected using adb:
787747e2f4SIrina Tirdea  # ./data/perf
79