如何使用 crystax-NDK 和 autotools 为 android 交叉编译 gperftools?
How to cross-compile gperftools for android using crystax-NDK & autotools?
我的最终目标是能够使用 gperftools 在 android 环境中分析本机代码 (C++)。
我的environment/Tools:
- ubuntu 14.04
- crystax-ndk-10.2.1
- gcc-4.8.4
- gperftools-2.4
(1)
我按照这个来制作一个独立的工具链供以后使用:
Cross compiling for arm using crystax 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
并安装:
我把这个脚本放在 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-profiler 但是因为我使用 CMake 进行交叉编译而且我不太确定如何弄乱 Android.mk 所以现在我会尝试使用 gperftools 它工作正常在 linux 构建中。
这是因为 pthread_atfork
出现在 Android libc (Bionic) 中仅来自 Android 5.0。在 CrystaX NDK 中,并非所有 API 都被 libcrystax 取代,特别是,所有 pthread_xxx API 都驻留在 libc 中。因此,到目前为止,做你想做的事情的唯一方法是使用 android-21 作为最小平台,或者修改 gperftools 源,避免使用 pthread_atfork
.
顺便说一句,我们正在努力将所有 pthread_xxx API 移动到 libcrystax 中,所以我希望所有这些 API 将很快可用,即使对于更早的 Android 版本.
我的最终目标是能够使用 gperftools 在 android 环境中分析本机代码 (C++)。
我的environment/Tools:
- ubuntu 14.04
- crystax-ndk-10.2.1
- gcc-4.8.4
- gperftools-2.4
(1) 我按照这个来制作一个独立的工具链供以后使用: Cross compiling for arm using crystax 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
并安装:
我把这个脚本放在 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-profiler 但是因为我使用 CMake 进行交叉编译而且我不太确定如何弄乱 Android.mk 所以现在我会尝试使用 gperftools 它工作正常在 linux 构建中。
这是因为 pthread_atfork
出现在 Android libc (Bionic) 中仅来自 Android 5.0。在 CrystaX NDK 中,并非所有 API 都被 libcrystax 取代,特别是,所有 pthread_xxx API 都驻留在 libc 中。因此,到目前为止,做你想做的事情的唯一方法是使用 android-21 作为最小平台,或者修改 gperftools 源,避免使用 pthread_atfork
.
顺便说一句,我们正在努力将所有 pthread_xxx API 移动到 libcrystax 中,所以我希望所有这些 API 将很快可用,即使对于更早的 Android 版本.