如何使用crystax-NDK和autotools交叉编译适用于android的gperftools?



我的最终目标是能够使用gperftools在android环境中分析本机代码(c++)。

我的环境/工具:

    ubuntu 14.04
  • crystax-ndk-10.2.1
  • gcc-4.8.4
  • gperftools - 2.4

(1)我遵循这一点制作了一个独立的工具链供以后使用:用crystal NDK交叉编译手臂

命令:

./build/tools/make-standalone-toolchain.sh --system=linux-x86_64 --toolchain=arm-linux-androideabi-4.8 --platform=android-8 --install-dir=$HOME/my-android-toolchain

(2)幸运的是,我找到了一个脚本,可以简化。/configure的工作:https://gist.github.com/nddrylliog/4688209

,只是修改了一下(放在gperftools-2.4文件夹):

#!/bin/sh
export DEV_PREFIX=$HOME
export ANDROID_NDK=${DEV_PREFIX}/crystax-ndk-10.2.1/
export CROSS_COMPILE=arm-linux-androideabi
export ANDROID_PREFIX=$HOME/my-android-toolchain
export SYSROOT=${ANDROID_NDK}/platforms/android-8/arch-arm
export CROSS_PATH=${ANDROID_PREFIX}/bin/${CROSS_COMPILE}
export CPP=${CROSS_PATH}-cpp
export AR=${CROSS_PATH}-ar
export AS=${CROSS_PATH}-as
export NM=${CROSS_PATH}-nm
export CC=${CROSS_PATH}-gcc
export CXX=${CROSS_PATH}-g++
export LD=${CROSS_PATH}-ld
export RANLIB=${CROSS_PATH}-ranlib
# export PREFIX=${DEV_PREFIX}/android/prefix
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig
export CFLAGS="${CFLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${ANDROID_PREFIX}/include -I${DEV_PREFIX}/android/bionic"
export CPPFLAGS="${CFLAGS}"
export LDFLAGS="${LDFLAGS} -L${SYSROOT}/usr/lib -L${ANDROID_PREFIX}/lib"
./configure --host=${CROSS_COMPILE} --with-sysroot=${SYSROOT} "$@"

(3)然后我执行./configure命令install:

我把这个脚本放在gperftools-2.4文件夹中并运行它:

cd gperftools-2.4
./android_configure.sh --enable-frame-pointers --prefix=$(pwd)
sudo make && make install
cd ..

结果:上面的代码给了我这个错误:

src/static_vars.cc: In function 'void tcmalloc::SetupAtForkLocksHandler()':
src/static_vars.cc:119:39: error: 'pthread_atfork' was not declared in this scope
                  CentralCacheUnlockAll); // child calls after fork
如果有人能在这方面给我一些建议,我会很感激的。

额外的:我知道有一个Android -ndk分析器,但因为我使用CMake交叉编译,我不太确定如何与Android混淆。所以现在我将尝试使用gperftools,它在linux构建中工作得很好。

这是因为pthread_atfork只在Android 5.0版本的Android libc (Bionic)中出现。在CrystaX NDK中,并不是所有的API都被libcrystax取代,特别是所有的pthread_xxx API都驻留在libc中。所以现在唯一的方法就是使用android-21作为最小的平台,或者修改gperftools的源代码,避免使用pthread_atfork

顺便说一句,我们正在努力将所有pthread_xxx API移动到libcrystax中,所以我希望所有这些API很快就可以使用,即使是早期的Android版本。

最新更新