2015-09-17 110 views
1

我的最終目標是能夠使用gperftools在android環境中剖析原生代碼(C++)。如何使用crystax-NDK&autotools爲Android交叉編譯gperftools?

我的環境/工具:

  • 的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} "[email protected]" 

(3) 然後我實際上做了./configure和make 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-profiler但因爲我使用的CMake了交叉編譯的,我不太清楚怎麼惹Android.mk所以在現階段,我會嘗試使用gperftools其中工程在Linux構建良好。

回答

2

這是因爲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,所以我預計即使早期的Android版本,所有這樣的API也將很快推出。